Merge "Add personal/work tab for ManageApplications"
This commit is contained in:
@@ -35,7 +35,6 @@ import android.os.Bundle;
|
|||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.FeatureFlagUtils;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
@@ -53,13 +52,11 @@ import androidx.preference.PreferenceManager;
|
|||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.settings.Settings.WifiSettingsActivity;
|
import com.android.settings.Settings.WifiSettingsActivity;
|
||||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
import com.android.settings.core.FeatureFlags;
|
|
||||||
import com.android.settings.core.OnActivityResultListener;
|
import com.android.settings.core.OnActivityResultListener;
|
||||||
import com.android.settings.core.SettingsBaseActivity;
|
import com.android.settings.core.SettingsBaseActivity;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.core.gateway.SettingsGateway;
|
import com.android.settings.core.gateway.SettingsGateway;
|
||||||
import com.android.settings.dashboard.DashboardFeatureProvider;
|
import com.android.settings.dashboard.DashboardFeatureProvider;
|
||||||
import com.android.settings.dashboard.profileselector.ProfileFragmentBridge;
|
|
||||||
import com.android.settings.homepage.TopLevelSettings;
|
import com.android.settings.homepage.TopLevelSettings;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.wfd.WifiDisplaySettings;
|
import com.android.settings.wfd.WifiDisplaySettings;
|
||||||
@@ -568,15 +565,7 @@ public class SettingsActivity extends SettingsBaseActivity
|
|||||||
throw new IllegalArgumentException("Invalid fragment for this activity: "
|
throw new IllegalArgumentException("Invalid fragment for this activity: "
|
||||||
+ fragmentName);
|
+ fragmentName);
|
||||||
}
|
}
|
||||||
Fragment f = null;
|
Fragment f = Utils.getTargetFragment(this, fragmentName, args);
|
||||||
if (FeatureFlagUtils.isEnabled(this, FeatureFlags.PERSONAL_WORK_PROFILE)
|
|
||||||
&& UserManager.get(this).getUserProfiles().size() > 1
|
|
||||||
&& ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName) != null) {
|
|
||||||
f = Fragment.instantiate(this, ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName),
|
|
||||||
args);
|
|
||||||
} else {
|
|
||||||
f = Fragment.instantiate(this, fragmentName, args);
|
|
||||||
}
|
|
||||||
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
|
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
|
||||||
transaction.replace(R.id.main_content, f);
|
transaction.replace(R.id.main_content, f);
|
||||||
if (titleResId > 0) {
|
if (titleResId > 0) {
|
||||||
|
@@ -21,6 +21,9 @@ import static android.content.Intent.EXTRA_USER_ID;
|
|||||||
import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
|
import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
|
||||||
import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
|
import static android.text.format.DateUtils.FORMAT_SHOW_DATE;
|
||||||
|
|
||||||
|
import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_PERSONAL_ONLY;
|
||||||
|
import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_WORK_ONLY;
|
||||||
|
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
@@ -81,6 +84,7 @@ import android.text.TextUtils;
|
|||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.text.style.TtsSpan;
|
import android.text.style.TtsSpan;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.IconDrawableFactory;
|
import android.util.IconDrawableFactory;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@@ -101,6 +105,7 @@ import com.android.internal.app.UnlaunchableAppActivity;
|
|||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
import com.android.internal.widget.LockPatternUtils;
|
import com.android.internal.widget.LockPatternUtils;
|
||||||
import com.android.settings.core.FeatureFlags;
|
import com.android.settings.core.FeatureFlags;
|
||||||
|
import com.android.settings.dashboard.profileselector.ProfileFragmentBridge;
|
||||||
import com.android.settings.development.featureflags.FeatureFlagPersistent;
|
import com.android.settings.development.featureflags.FeatureFlagPersistent;
|
||||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||||
import com.android.settingslib.widget.ActionBarShadowController;
|
import com.android.settingslib.widget.ActionBarShadowController;
|
||||||
@@ -1059,4 +1064,27 @@ public final class Utils extends com.android.settingslib.Utils {
|
|||||||
ActionBarShadowController.attachToView(activity, lifecycle, scrollView);
|
ActionBarShadowController.attachToView(activity, lifecycle, scrollView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return correct target fragment based on argument
|
||||||
|
*
|
||||||
|
* @param activity the activity target fragment will be launched.
|
||||||
|
* @param fragmentName initial target fragment name.
|
||||||
|
* @param args fragment launch arguments.
|
||||||
|
*/
|
||||||
|
public static Fragment getTargetFragment(Activity activity, String fragmentName, Bundle args) {
|
||||||
|
Fragment f = null;
|
||||||
|
final boolean isWorkOnly = args == null ? false : args.getBoolean(EXTRA_WORK_ONLY);
|
||||||
|
final boolean isPersonalOnly = args == null ? false : args.getBoolean(EXTRA_PERSONAL_ONLY);
|
||||||
|
if (FeatureFlagUtils.isEnabled(activity, FeatureFlags.PERSONAL_WORK_PROFILE)
|
||||||
|
&& UserManager.get(activity).getUserProfiles().size() > 1
|
||||||
|
&& ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName) != null
|
||||||
|
&& !isWorkOnly && !isPersonalOnly) {
|
||||||
|
f = Fragment.instantiate(activity, ProfileFragmentBridge.FRAGMENT_MAP.get(fragmentName),
|
||||||
|
args);
|
||||||
|
} else {
|
||||||
|
f = Fragment.instantiate(activity, fragmentName, args);
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -143,6 +143,7 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
public static final String EXTRA_STORAGE_TYPE = "storageType";
|
public static final String EXTRA_STORAGE_TYPE = "storageType";
|
||||||
public static final String EXTRA_WORK_ONLY = "workProfileOnly";
|
public static final String EXTRA_WORK_ONLY = "workProfileOnly";
|
||||||
public static final String EXTRA_WORK_ID = "workId";
|
public static final String EXTRA_WORK_ID = "workId";
|
||||||
|
public static final String EXTRA_PERSONAL_ONLY = "personalOnly";
|
||||||
|
|
||||||
private static final String EXTRA_SORT_ORDER = "sortOrder";
|
private static final String EXTRA_SORT_ORDER = "sortOrder";
|
||||||
private static final String EXTRA_SHOW_SYSTEM = "showSystem";
|
private static final String EXTRA_SHOW_SYSTEM = "showSystem";
|
||||||
@@ -234,6 +235,7 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
private int mStorageType;
|
private int mStorageType;
|
||||||
private boolean mIsWorkOnly;
|
private boolean mIsWorkOnly;
|
||||||
private int mWorkUserId;
|
private int mWorkUserId;
|
||||||
|
private boolean mIsPersonalOnly;
|
||||||
private View mEmptyView;
|
private View mEmptyView;
|
||||||
private int mFilterType;
|
private int mFilterType;
|
||||||
|
|
||||||
@@ -308,6 +310,7 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
}
|
}
|
||||||
final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
|
final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
|
||||||
mFilter = appFilterRegistry.get(appFilterRegistry.getDefaultFilterType(mListType));
|
mFilter = appFilterRegistry.get(appFilterRegistry.getDefaultFilterType(mListType));
|
||||||
|
mIsPersonalOnly = args != null ? args.getBoolean(EXTRA_PERSONAL_ONLY) : false;
|
||||||
mIsWorkOnly = args != null ? args.getBoolean(EXTRA_WORK_ONLY) : false;
|
mIsWorkOnly = args != null ? args.getBoolean(EXTRA_WORK_ONLY) : false;
|
||||||
mWorkUserId = args != null ? args.getInt(EXTRA_WORK_ID) : NO_USER_SPECIFIED;
|
mWorkUserId = args != null ? args.getInt(EXTRA_WORK_ID) : NO_USER_SPECIFIED;
|
||||||
mExpandSearch = activity.getIntent().getBooleanExtra(EXTRA_EXPAND_SEARCH_VIEW, false);
|
mExpandSearch = activity.getIntent().getBooleanExtra(EXTRA_EXPAND_SEARCH_VIEW, false);
|
||||||
@@ -405,8 +408,22 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
|
|
||||||
final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
|
final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
|
||||||
mFilterAdapter.enableFilter(appFilterRegistry.getDefaultFilterType(mListType));
|
mFilterAdapter.enableFilter(appFilterRegistry.getDefaultFilterType(mListType));
|
||||||
|
|
||||||
|
AppFilter compositeFilter = getCompositeFilter(mListType, mStorageType, mVolumeUuid);
|
||||||
|
if (mIsWorkOnly) {
|
||||||
|
compositeFilter = new CompoundFilter(compositeFilter, ApplicationsState.FILTER_WORK);
|
||||||
|
}
|
||||||
|
if (mIsPersonalOnly) {
|
||||||
|
compositeFilter = new CompoundFilter(compositeFilter,
|
||||||
|
ApplicationsState.FILTER_PERSONAL);
|
||||||
|
}
|
||||||
|
if (compositeFilter != null) {
|
||||||
|
mApplications.setCompositeFilter(compositeFilter);
|
||||||
|
}
|
||||||
|
|
||||||
if (mListType == LIST_TYPE_MAIN) {
|
if (mListType == LIST_TYPE_MAIN) {
|
||||||
if (UserManager.get(getActivity()).getUserProfiles().size() > 1) {
|
if (UserManager.get(getActivity()).getUserProfiles().size() > 1 && !mIsWorkOnly
|
||||||
|
&& !mIsPersonalOnly) {
|
||||||
mFilterAdapter.enableFilter(FILTER_APPS_PERSONAL);
|
mFilterAdapter.enableFilter(FILTER_APPS_PERSONAL);
|
||||||
mFilterAdapter.enableFilter(FILTER_APPS_WORK);
|
mFilterAdapter.enableFilter(FILTER_APPS_WORK);
|
||||||
}
|
}
|
||||||
@@ -420,15 +437,6 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
if (mListType == LIST_TYPE_HIGH_POWER) {
|
if (mListType == LIST_TYPE_HIGH_POWER) {
|
||||||
mFilterAdapter.enableFilter(FILTER_APPS_POWER_WHITELIST_ALL);
|
mFilterAdapter.enableFilter(FILTER_APPS_POWER_WHITELIST_ALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
AppFilter compositeFilter = getCompositeFilter(mListType, mStorageType, mVolumeUuid);
|
|
||||||
if (mIsWorkOnly) {
|
|
||||||
final AppFilter workFilter = appFilterRegistry.get(FILTER_APPS_WORK).getFilter();
|
|
||||||
compositeFilter = new CompoundFilter(compositeFilter, workFilter);
|
|
||||||
}
|
|
||||||
if (compositeFilter != null) {
|
|
||||||
mApplications.setCompositeFilter(compositeFilter);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -449,9 +457,11 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
return new CompoundFilter(ApplicationsState.FILTER_MOVIES, filter);
|
return new CompoundFilter(ApplicationsState.FILTER_MOVIES, filter);
|
||||||
} else if (listType == LIST_TYPE_PHOTOGRAPHY) {
|
} else if (listType == LIST_TYPE_PHOTOGRAPHY) {
|
||||||
return new CompoundFilter(ApplicationsState.FILTER_PHOTOS, filter);
|
return new CompoundFilter(ApplicationsState.FILTER_PHOTOS, filter);
|
||||||
|
} else {
|
||||||
|
final AppFilterRegistry appFilterRegistry = AppFilterRegistry.getInstance();
|
||||||
|
return appFilterRegistry.get(
|
||||||
|
appFilterRegistry.getDefaultFilterType(listType)).getFilter();
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -508,7 +518,7 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
outState.putBoolean(EXTRA_SHOW_SYSTEM, mShowSystem);
|
outState.putBoolean(EXTRA_SHOW_SYSTEM, mShowSystem);
|
||||||
outState.putBoolean(EXTRA_HAS_ENTRIES, mApplications.mHasReceivedLoadEntries);
|
outState.putBoolean(EXTRA_HAS_ENTRIES, mApplications.mHasReceivedLoadEntries);
|
||||||
outState.putBoolean(EXTRA_HAS_BRIDGE, mApplications.mHasReceivedBridgeCallback);
|
outState.putBoolean(EXTRA_HAS_BRIDGE, mApplications.mHasReceivedBridgeCallback);
|
||||||
if(mSearchView != null) {
|
if (mSearchView != null) {
|
||||||
outState.putBoolean(EXTRA_EXPAND_SEARCH_VIEW, !mSearchView.isIconified());
|
outState.putBoolean(EXTRA_EXPAND_SEARCH_VIEW, !mSearchView.isIconified());
|
||||||
}
|
}
|
||||||
if (mApplications != null) {
|
if (mApplications != null) {
|
||||||
@@ -1166,7 +1176,7 @@ public class ManageApplications extends InstrumentedFragment
|
|||||||
mSearchFilter = new SearchFilter();
|
mSearchFilter = new SearchFilter();
|
||||||
}
|
}
|
||||||
// If we haven't load apps list completely, don't filter anything.
|
// If we haven't load apps list completely, don't filter anything.
|
||||||
if(mOriginalEntries == null) {
|
if (mOriginalEntries == null) {
|
||||||
Log.w(TAG, "Apps haven't loaded completely yet, so nothing can be filtered");
|
Log.w(TAG, "Apps haven't loaded completely yet, so nothing can be filtered");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.applications.manageapplications;
|
||||||
|
|
||||||
|
import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_PERSONAL_ONLY;
|
||||||
|
import static com.android.settings.applications.manageapplications.ManageApplications.EXTRA_WORK_ONLY;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Application Setting page for work profile.
|
||||||
|
*/
|
||||||
|
public class ProfileSelectManageApplications extends ProfileSelectFragment {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Fragment[] getFragments() {
|
||||||
|
final Bundle workOnly = new Bundle();
|
||||||
|
workOnly.putBoolean(EXTRA_WORK_ONLY, true);
|
||||||
|
final Fragment workFragment = new ManageApplications();
|
||||||
|
workFragment.setArguments(workOnly);
|
||||||
|
|
||||||
|
final Bundle personalOnly = new Bundle();
|
||||||
|
personalOnly.putBoolean(EXTRA_PERSONAL_ONLY, true);
|
||||||
|
final Fragment personalFragment = new ManageApplications();
|
||||||
|
personalFragment.setArguments(personalOnly);
|
||||||
|
return new Fragment[] {
|
||||||
|
personalFragment, //0
|
||||||
|
workFragment
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@@ -20,6 +20,8 @@ import android.util.ArrayMap;
|
|||||||
|
|
||||||
import com.android.settings.accounts.AccountDashboardFragment;
|
import com.android.settings.accounts.AccountDashboardFragment;
|
||||||
import com.android.settings.accounts.AccountProfileSelectFragment;
|
import com.android.settings.accounts.AccountProfileSelectFragment;
|
||||||
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
|
import com.android.settings.applications.manageapplications.ProfileSelectManageApplications;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -38,5 +40,7 @@ public class ProfileFragmentBridge {
|
|||||||
FRAGMENT_MAP = new ArrayMap<>();
|
FRAGMENT_MAP = new ArrayMap<>();
|
||||||
FRAGMENT_MAP.put(AccountDashboardFragment.class.getName(),
|
FRAGMENT_MAP.put(AccountDashboardFragment.class.getName(),
|
||||||
AccountProfileSelectFragment.class.getName());
|
AccountProfileSelectFragment.class.getName());
|
||||||
|
FRAGMENT_MAP.put(ManageApplications.class.getName(),
|
||||||
|
ProfileSelectManageApplications.class.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,7 @@ import android.net.TrafficStats;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.storage.VolumeInfo;
|
import android.os.storage.VolumeInfo;
|
||||||
|
import android.util.FeatureFlagUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
|
||||||
@@ -37,6 +38,7 @@ import androidx.preference.PreferenceScreen;
|
|||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Settings;
|
import com.android.settings.Settings;
|
||||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||||
|
import com.android.settings.core.FeatureFlags;
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
import com.android.settings.core.PreferenceControllerMixin;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment;
|
import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment;
|
||||||
@@ -389,10 +391,18 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Bundle getWorkAnnotatedBundle(int additionalCapacity) {
|
private Bundle getWorkAnnotatedBundle(int additionalCapacity) {
|
||||||
final Bundle args = new Bundle(2 + additionalCapacity);
|
if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.PERSONAL_WORK_PROFILE)) {
|
||||||
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
final Bundle args = new Bundle(3 + additionalCapacity);
|
||||||
args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
|
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
||||||
return args;
|
args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
|
||||||
|
args.putBoolean(ManageApplications.EXTRA_PERSONAL_ONLY, !mIsWorkProfile);
|
||||||
|
return args;
|
||||||
|
} else {
|
||||||
|
final Bundle args = new Bundle(2 + additionalCapacity);
|
||||||
|
args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile);
|
||||||
|
args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId);
|
||||||
|
return args;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Intent getFilesIntent() {
|
private Intent getFilesIntent() {
|
||||||
|
Reference in New Issue
Block a user