diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 6271bc0f859..2a5582971c1 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -388,39 +388,6 @@ public final class Utils extends com.android.settingslib.Utils { .getUsers().size() > 1; } - /** - * Build an Intent to launch a new activity showing the selected fragment. - * The implementation constructs an Intent that re-launches the current activity with the - * appropriate arguments to display the fragment. - * - * - * @param context The Context. - * @param fragmentName The name of the fragment to display. - * @param args Optional arguments to supply to the fragment. - * @param titleResPackageName Optional package name for the resource id of the title. - * @param titleResId Optional title resource id to show for this item. - * @param title Optional title to show for this item. - * @param isShortcut tell if this is a Launcher Shortcut or not - * @param sourceMetricsCategory The context (source) from which an action is performed - * @return Returns an Intent that can be launched to display the given - * fragment. - */ - public static Intent onBuildStartFragmentIntent(Context context, String fragmentName, - Bundle args, String titleResPackageName, int titleResId, CharSequence title, - boolean isShortcut, int sourceMetricsCategory) { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClass(context, SubSettings.class); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, fragmentName); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, args); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME, - titleResPackageName); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, titleResId); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, title); - intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, isShortcut); - intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, sourceMetricsCategory); - return intent; - } - /** * Returns the managed profile of the current user or {@code null} if none is found or a profile * exists but it is disabled. diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java index 8c2698826ad..edbd8b9020d 100644 --- a/src/com/android/settings/applications/AppInfoBase.java +++ b/src/com/android/settings/applications/AppInfoBase.java @@ -43,8 +43,8 @@ import android.util.Log; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsActivity; import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.Utils; import com.android.settings.applications.manageapplications.ManageApplications; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.wrapper.DevicePolicyManagerWrapper; @@ -218,20 +218,18 @@ public abstract class AppInfoBase extends SettingsPreferenceFragment public static void startAppInfoFragment(Class fragment, int titleRes, String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) { - startAppInfoFragment(fragment, titleRes, pkg, uid, source.getActivity(), request, - sourceMetricsCategory); - } - - public static void startAppInfoFragment(Class fragment, int titleRes, - String pkg, int uid, Activity source, int request, int sourceMetricsCategory) { - Bundle args = new Bundle(); + final Bundle args = new Bundle(); args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg); args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid); - Intent intent = Utils.onBuildStartFragmentIntent(source, fragment.getName(), - args, null, titleRes, null, false, sourceMetricsCategory); - source.startActivityForResultAsUser(intent, request, - new UserHandle(UserHandle.getUserId(uid))); + new SubSettingLauncher(source.getContext()) + .setDestination(fragment.getName()) + .setSourceMetricsCategory(sourceMetricsCategory) + .setTitle(titleRes) + .setArguments(args) + .setUserHandle(new UserHandle(UserHandle.getUserId(uid))) + .setResultListener(source, request) + .launch(); } public static class MyAlertDialogFragment extends InstrumentedDialogFragment { diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java index bc79cf87589..1ffe7f53e6e 100644 --- a/src/com/android/settings/core/SubSettingLauncher.java +++ b/src/com/android/settings/core/SubSettingLauncher.java @@ -101,6 +101,25 @@ public class SubSettingLauncher { "This launcher has already been executed. Do not reuse"); } mLaunched = true; + + final Intent intent = toIntent(); + + boolean launchAsUser = mLaunchRequest.userHandle != null + && mLaunchRequest.userHandle.getIdentifier() != UserHandle.myUserId(); + boolean launchForResult = mLaunchRequest.mResultListener != null; + if (launchAsUser && launchForResult) { + launchForResultAsUser(intent, mLaunchRequest.userHandle, mLaunchRequest.mResultListener, + mLaunchRequest.mRequestCode); + } else if (launchAsUser && !launchForResult) { + launchAsUser(intent, mLaunchRequest.userHandle); + } else if (!launchAsUser && launchForResult) { + launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode); + } else { + launch(intent); + } + } + + public Intent toIntent() { final Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClass(mContext, SubSettings.class); if (TextUtils.isEmpty(mLaunchRequest.destinationName)) { @@ -123,15 +142,7 @@ public class SubSettingLauncher { intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, mLaunchRequest.isShortCut); intent.addFlags(mLaunchRequest.flags); - - if (mLaunchRequest.userHandle != null - && mLaunchRequest.userHandle.getIdentifier() != UserHandle.myUserId()) { - launchAsUser(mContext, intent, mLaunchRequest.userHandle); - } else if (mLaunchRequest.mResultListener != null) { - launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode); - } else { - launch(intent); - } + return intent; } @VisibleForTesting @@ -139,14 +150,21 @@ public class SubSettingLauncher { mContext.startActivity(intent); } - private static void launchForResult(Fragment listener, Intent intent, int requestCode) { - listener.getActivity().startActivityForResult(intent, requestCode); - } - - private static void launchAsUser(Context context, Intent intent, UserHandle userHandle) { + @VisibleForTesting + void launchAsUser(Intent intent, UserHandle userHandle) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); - context.startActivityAsUser(intent, userHandle); + mContext.startActivityAsUser(intent, userHandle); + } + + @VisibleForTesting + void launchForResultAsUser(Intent intent, UserHandle userHandle, + Fragment resultListener, int requestCode) { + resultListener.getActivity().startActivityForResultAsUser(intent, requestCode, userHandle); + } + + private void launchForResult(Fragment listener, Intent intent, int requestCode) { + listener.getActivity().startActivityForResult(intent, requestCode); } /** diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java index 202dc80d038..ce043cef6a1 100644 --- a/src/com/android/settings/datausage/BillingCyclePreference.java +++ b/src/com/android/settings/datausage/BillingCyclePreference.java @@ -26,7 +26,7 @@ import android.util.AttributeSet; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; -import com.android.settings.Utils; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.datausage.CellDataPreference.DataStateListener; public class BillingCyclePreference extends Preference implements TemplatePreference { @@ -80,8 +80,12 @@ public class BillingCyclePreference extends Preference implements TemplatePrefer public Intent getIntent() { Bundle args = new Bundle(); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); - return Utils.onBuildStartFragmentIntent(getContext(), BillingCycleSettings.class.getName(), - args, null, 0, getTitle(), false, MetricsProto.MetricsEvent.VIEW_UNKNOWN); + return new SubSettingLauncher(getContext()) + .setDestination(BillingCycleSettings.class.getName()) + .setArguments(args) + .setTitle(getTitle()) + .setSourceMetricsCategory(MetricsProto.MetricsEvent.VIEW_UNKNOWN) + .toIntent(); } private final DataStateListener mListener = new DataStateListener() { diff --git a/src/com/android/settings/datausage/DataUsagePreference.java b/src/com/android/settings/datausage/DataUsagePreference.java index 32c701187f9..ecc5be6f311 100644 --- a/src/com/android/settings/datausage/DataUsagePreference.java +++ b/src/com/android/settings/datausage/DataUsagePreference.java @@ -23,10 +23,10 @@ import android.support.v4.content.res.TypedArrayUtils; import android.support.v7.preference.Preference; import android.text.format.Formatter; import android.util.AttributeSet; + import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; -import com.android.settings.Utils; -import com.android.settings.core.InstrumentedPreferenceFragment; +import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.net.DataUsageController; public class DataUsagePreference extends Preference implements TemplatePreference { @@ -38,7 +38,7 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc public DataUsagePreference(Context context, AttributeSet attrs) { super(context, attrs); final TypedArray a = context.obtainStyledAttributes( - attrs, new int[] { com.android.internal.R.attr.title }, + attrs, new int[] {com.android.internal.R.attr.title}, TypedArrayUtils.getAttr( context, android.support.v7.preference.R.attr.preferenceStyle, android.R.attr.preferenceStyle), 0); @@ -60,16 +60,18 @@ public class DataUsagePreference extends Preference implements TemplatePreferenc @Override public Intent getIntent() { - Bundle args = new Bundle(); + final Bundle args = new Bundle(); args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate); args.putInt(DataUsageList.EXTRA_SUB_ID, mSubId); + final SubSettingLauncher launcher = new SubSettingLauncher(getContext()) + .setArguments(args) + .setDestination(DataUsageList.class.getName()) + .setSourceMetricsCategory(MetricsProto.MetricsEvent.VIEW_UNKNOWN); if (mTitleRes > 0) { - return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(), - args, getContext().getPackageName(), mTitleRes, null, false, - MetricsProto.MetricsEvent.VIEW_UNKNOWN); + launcher.setTitle(mTitleRes); + } else { + launcher.setTitle(getTitle()); } - return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(), args, - getContext().getPackageName(), 0, getTitle(), false, - MetricsProto.MetricsEvent.VIEW_UNKNOWN); + return launcher.toIntent(); } } diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java index c2a72e693d3..7958b3782ab 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java @@ -484,9 +484,12 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment { args.putInt( ManageApplications.EXTRA_STORAGE_TYPE, ManageApplications.STORAGE_TYPE_LEGACY); - intent = Utils.onBuildStartFragmentIntent(getActivity(), - ManageApplications.class.getName(), args, null, R.string.apps_storage, null, - false, getMetricsCategory()); + intent = new SubSettingLauncher(getActivity()) + .setDestination(ManageApplications.class.getName()) + .setArguments(args) + .setTitle(R.string.apps_storage) + .setSourceMetricsCategory(getMetricsCategory()) + .toIntent(); } break; case R.string.storage_detail_images: { diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index 17a06dff09f..adc35a627e1 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -47,7 +47,6 @@ import android.widget.Toast; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.Utils; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.dashboard.SummaryLoader; @@ -232,10 +231,12 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index mHasLaunchedPrivateVolumeSettings = true; final Bundle args = new Bundle(); args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL); - Intent intent = Utils.onBuildStartFragmentIntent(getActivity(), - StorageDashboardFragment.class.getName(), args, null, - R.string.storage_settings, null, false, getMetricsCategory()); - getActivity().startActivity(intent); + new SubSettingLauncher(getActivity()) + .setDestination(StorageDashboardFragment.class.getName()) + .setArguments(args) + .setTitle(R.string.storage_settings) + .setSourceMetricsCategory(getMetricsCategory()) + .launch(); finish(); } } diff --git a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java index 36232985934..6b51be3009b 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java +++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java @@ -35,9 +35,9 @@ import android.util.SparseArray; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.Settings; -import com.android.settings.Utils; import com.android.settings.applications.manageapplications.ManageApplications; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.deviceinfo.PrivateVolumeSettings.SystemInfoFragment; import com.android.settings.deviceinfo.StorageItemPreference; import com.android.settings.overlay.FeatureFactory; @@ -319,15 +319,12 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle args.putInt( ManageApplications.EXTRA_STORAGE_TYPE, ManageApplications.STORAGE_TYPE_PHOTOS_VIDEOS); - return Utils.onBuildStartFragmentIntent( - mContext, - ManageApplications.class.getName(), - args, - null, - R.string.storage_photos_videos, - null, - false, - mMetricsFeatureProvider.getMetricsCategory(mFragment)); + return new SubSettingLauncher(mContext) + .setDestination(ManageApplications.class.getName()) + .setTitle(R.string.storage_photos_videos) + .setArguments(args) + .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment)) + .toIntent(); } private Intent getAudioIntent() { @@ -341,46 +338,57 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid()); args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription()); args.putInt(ManageApplications.EXTRA_STORAGE_TYPE, ManageApplications.STORAGE_TYPE_MUSIC); - return Utils.onBuildStartFragmentIntent(mContext, - ManageApplications.class.getName(), args, null, R.string.storage_music_audio, null, - false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); + return new SubSettingLauncher(mContext) + .setDestination(ManageApplications.class.getName()) + .setTitle(R.string.storage_music_audio) + .setArguments(args) + .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment)) + .toIntent(); } private Intent getAppsIntent() { if (mVolume == null) { return null; } - - Bundle args = getWorkAnnotatedBundle(3); + final Bundle args = getWorkAnnotatedBundle(3); args.putString(ManageApplications.EXTRA_CLASSNAME, Settings.StorageUseActivity.class.getName()); args.putString(ManageApplications.EXTRA_VOLUME_UUID, mVolume.getFsUuid()); args.putString(ManageApplications.EXTRA_VOLUME_NAME, mVolume.getDescription()); - return Utils.onBuildStartFragmentIntent(mContext, - ManageApplications.class.getName(), args, null, R.string.apps_storage, null, - false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); + return new SubSettingLauncher(mContext) + .setDestination(ManageApplications.class.getName()) + .setTitle(R.string.apps_storage) + .setArguments(args) + .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment)) + .toIntent(); } private Intent getGamesIntent() { - Bundle args = getWorkAnnotatedBundle(1); + final Bundle args = getWorkAnnotatedBundle(1); args.putString(ManageApplications.EXTRA_CLASSNAME, Settings.GamesStorageActivity.class.getName()); - return Utils.onBuildStartFragmentIntent(mContext, - ManageApplications.class.getName(), args, null, R.string.game_storage_settings, - null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); + return new SubSettingLauncher(mContext) + .setDestination(ManageApplications.class.getName()) + .setTitle(R.string.game_storage_settings) + .setArguments(args) + .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment)) + .toIntent(); } private Intent getMoviesIntent() { - Bundle args = getWorkAnnotatedBundle(1); + final Bundle args = getWorkAnnotatedBundle(1); args.putString(ManageApplications.EXTRA_CLASSNAME, Settings.MoviesStorageActivity.class.getName()); - return Utils.onBuildStartFragmentIntent(mContext, - ManageApplications.class.getName(), args, null, R.string.storage_movies_tv, - null, false, mMetricsFeatureProvider.getMetricsCategory(mFragment)); + return new SubSettingLauncher(mContext) + .setDestination(ManageApplications.class.getName()) + .setTitle(R.string.storage_movies_tv) + .setArguments(args) + .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(mFragment)) + .toIntent(); } private Bundle getWorkAnnotatedBundle(int additionalCapacity) { - Bundle args = new Bundle(2 + additionalCapacity); + final Bundle args = new Bundle(2 + additionalCapacity); args.putBoolean(ManageApplications.EXTRA_WORK_ONLY, mIsWorkProfile); args.putInt(ManageApplications.EXTRA_WORK_ID, mUserId); return args; diff --git a/src/com/android/settings/deviceinfo/storage/UserProfileController.java b/src/com/android/settings/deviceinfo/storage/UserProfileController.java index c9fe54e74fe..081a0be0771 100644 --- a/src/com/android/settings/deviceinfo/storage/UserProfileController.java +++ b/src/com/android/settings/deviceinfo/storage/UserProfileController.java @@ -17,9 +17,7 @@ package com.android.settings.deviceinfo.storage; import android.content.Context; -import android.content.Intent; import android.content.pm.UserInfo; -import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.storage.VolumeInfo; @@ -31,14 +29,16 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.internal.util.Preconditions; import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.SubSettingLauncher; import com.android.settings.deviceinfo.StorageItemPreference; import com.android.settings.deviceinfo.StorageProfileFragment; import com.android.settings.wrapper.UserManagerWrapper; import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.drawer.SettingsDrawerActivity; -/** Defines a {@link AbstractPreferenceController} which handles a single profile of the primary - * user. */ +/** + * Defines a {@link AbstractPreferenceController} which handles a single profile of the primary + * user. + */ public class UserProfileController extends AbstractPreferenceController implements PreferenceControllerMixin, StorageAsyncLoader.ResultHandler, UserIconLoader.UserIconHandler { @@ -79,13 +79,16 @@ public class UserProfileController extends AbstractPreferenceController implemen @Override public boolean handlePreferenceTreeClick(Preference preference) { if (preference != null && mStoragePreference == preference) { - Bundle args = new Bundle(2); + final Bundle args = new Bundle(); args.putInt(StorageProfileFragment.USER_ID_EXTRA, mUser.id); args.putString(VolumeInfo.EXTRA_VOLUME_ID, VolumeInfo.ID_PRIVATE_INTERNAL); - Intent intent = Utils.onBuildStartFragmentIntent(mContext, - StorageProfileFragment.class.getName(), args, null, 0, - mUser.name, false, MetricsProto.MetricsEvent.DEVICEINFO_STORAGE); - mContext.startActivity(intent); + + new SubSettingLauncher(mContext) + .setDestination(StorageProfileFragment.class.getName()) + .setArguments(args) + .setTitle(mUser.name) + .setSourceMetricsCategory(MetricsProto.MetricsEvent.DEVICEINFO_STORAGE) + .launch(); return true; } @@ -99,8 +102,7 @@ public class UserProfileController extends AbstractPreferenceController implemen int userId = mUser.id; StorageAsyncLoader.AppsStorageResult result = stats.get(userId); if (result != null) { - setSize( - result.externalStats.totalBytes + setSize(result.externalStats.totalBytes + result.otherAppsSize + result.videoAppsSize + result.musicAppsSize diff --git a/src/com/android/settings/notification/NotificationSettingsBase.java b/src/com/android/settings/notification/NotificationSettingsBase.java index 09789f34477..a4310a10f5d 100644 --- a/src/com/android/settings/notification/NotificationSettingsBase.java +++ b/src/com/android/settings/notification/NotificationSettingsBase.java @@ -16,65 +16,42 @@ package com.android.settings.notification; -import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.app.NotificationManager.IMPORTANCE_NONE; -import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED; - -import com.android.internal.widget.LockPatternUtils; -import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.Utils; -import com.android.settings.applications.AppInfoBase; -import com.android.settings.applications.LayoutPreference; -import com.android.settings.dashboard.DashboardFragment; -import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.search.Indexable; -import com.android.settings.widget.MasterCheckBoxPreference; -import com.android.settings.widget.MasterSwitchPreference; -import com.android.settings.widget.SwitchBar; -import com.android.settings.wrapper.NotificationChannelGroupWrapper; -import com.android.settingslib.RestrictedLockUtils; -import com.android.settingslib.RestrictedSwitchPreference; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.widget.FooterPreference; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; import android.app.NotificationManager; -import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; -import android.content.pm.UserInfo; -import android.net.Uri; import android.os.Bundle; import android.os.UserHandle; -import android.os.UserManager; -import android.provider.SearchIndexableResource; import android.provider.Settings; -import android.service.notification.NotificationListenerService; -import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceGroup; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; -import android.util.ArrayMap; import android.util.Log; import android.widget.Toast; -import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settings.R; +import com.android.settings.applications.AppInfoBase; +import com.android.settings.core.SubSettingLauncher; +import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.widget.MasterCheckBoxPreference; +import com.android.settings.wrapper.NotificationChannelGroupWrapper; +import com.android.settingslib.RestrictedLockUtils; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -268,11 +245,12 @@ abstract public class NotificationSettingsBase extends DashboardFragment { channelArgs.putInt(AppInfoBase.ARG_PACKAGE_UID, mUid); channelArgs.putString(AppInfoBase.ARG_PACKAGE_NAME, mPkg); channelArgs.putString(Settings.EXTRA_CHANNEL_ID, channel.getId()); - Intent channelIntent = Utils.onBuildStartFragmentIntent(getActivity(), - ChannelNotificationSettings.class.getName(), - channelArgs, null, R.string.notification_channel_title, null, false, - getMetricsCategory()); - channelPref.setIntent(channelIntent); + channelPref.setIntent(new SubSettingLauncher(getActivity()) + .setDestination(ChannelNotificationSettings.class.getName()) + .setArguments(channelArgs) + .setTitle(R.string.notification_channel_title) + .setSourceMetricsCategory(getMetricsCategory()) + .toIntent()); channelPref.setOnPreferenceChangeListener( new Preference.OnPreferenceChangeListener() { diff --git a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java index ce5e1d12163..6cc99f742d9 100644 --- a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java +++ b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java @@ -33,16 +33,13 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.IconDrawableFactory; import android.util.Log; -import android.widget.Switch; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; -import com.android.settings.Utils; import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.InstalledAppCounter; import com.android.settings.core.PreferenceControllerMixin; -import com.android.settings.widget.AppPreference; -import com.android.settings.widget.MasterSwitchPreference; +import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.core.AbstractPreferenceController; @@ -237,10 +234,13 @@ public class RecentNotifyingAppsPreferenceController extends AbstractPreferenceC args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkgName); args.putInt(AppInfoBase.ARG_PACKAGE_UID, appEntry.info.uid); - pref.setIntent(Utils.onBuildStartFragmentIntent(mHost.getActivity(), - AppNotificationSettings.class.getName(), args, null, - R.string.notifications_title, null, false, - MetricsProto.MetricsEvent.MANAGE_APPLICATIONS_NOTIFICATIONS)); + pref.setIntent(new SubSettingLauncher(mHost.getActivity()) + .setDestination(AppNotificationSettings.class.getName()) + .setTitle(R.string.notifications_title) + .setArguments(args) + .setSourceMetricsCategory( + MetricsProto.MetricsEvent.MANAGE_APPLICATIONS_NOTIFICATIONS) + .toIntent()); pref.setOnPreferenceChangeListener((preference, newValue) -> { boolean blocked = !(Boolean) newValue; mNotificationBackend.setNotificationsEnabledForPackage( diff --git a/src/com/android/settings/search/DatabaseIndexingUtils.java b/src/com/android/settings/search/DatabaseIndexingUtils.java index 94ec65096e3..c7c23202a9b 100644 --- a/src/com/android/settings/search/DatabaseIndexingUtils.java +++ b/src/com/android/settings/search/DatabaseIndexingUtils.java @@ -26,9 +26,9 @@ import android.util.Log; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.SettingsActivity; -import com.android.settings.Utils; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; +import com.android.settings.core.SubSettingLauncher; import com.android.settingslib.core.AbstractPreferenceController; import java.lang.reflect.Field; @@ -59,8 +59,12 @@ public class DatabaseIndexingUtils { String screenTitle, int sourceMetricsCategory) { final Bundle args = new Bundle(); args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key); - final Intent searchDestination = Utils.onBuildStartFragmentIntent(context, - className, args, null, 0, screenTitle, false, sourceMetricsCategory); + final Intent searchDestination = new SubSettingLauncher(context) + .setDestination(className) + .setArguments(args) + .setTitle(screenTitle) + .setSourceMetricsCategory(sourceMetricsCategory) + .toIntent(); searchDestination.putExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, key) .setAction("com.android.settings.SEARCH_RESULT_TRAMPOLINE") .setComponent(null); diff --git a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java index 91d8f7bf6c6..4a1b2d8e7e6 100644 --- a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java +++ b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java @@ -18,12 +18,18 @@ package com.android.settings.core; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.app.Activity; +import android.app.Fragment; import android.content.Context; import android.content.Intent; +import android.os.UserHandle; import com.android.settings.SettingsActivity; import com.android.settings.TestConfig; @@ -34,6 +40,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -41,10 +49,16 @@ import org.robolectric.annotation.Config; @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SubSettingLauncherTest { + @Mock + private Fragment mFragment; + @Mock + private Activity mActivity; + private Context mContext; @Before public void setUp() { + MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; } @@ -93,4 +107,58 @@ public class SubSettingLauncherTest { assertThat(intent.getIntExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY, -1)) .isEqualTo(123); } + + @Test + public void launch_hasRequestListener_shouldStartActivityForResult() { + final int requestCode = 123123; + when(mFragment.getActivity()).thenReturn(mActivity); + + final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext)); + launcher.setTitle("123") + .setDestination(SubSettingLauncherTest.class.getName()) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setSourceMetricsCategory(123) + .setResultListener(mFragment, requestCode) + .launch(); + + verify(mActivity).startActivityForResult(any(Intent.class), eq(requestCode)); + } + + @Test + public void launch_hasUserHandle_shouldStartActivityAsUser() { + final UserHandle userHandle = new UserHandle(1234); + + final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext)); + doNothing().when(launcher).launchAsUser(any(Intent.class), any(UserHandle.class)); + + launcher.setTitle("123") + .setDestination(SubSettingLauncherTest.class.getName()) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setSourceMetricsCategory(123) + .setUserHandle(userHandle) + .launch(); + + verify(launcher).launchAsUser(any(Intent.class), eq(userHandle)); + } + + @Test + public void launch_hasUserHandleAndRequestCode_shouldStartActivityForResultAsUser() { + final int requestCode = 123123; + final UserHandle userHandle = new UserHandle(1234); + + final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext)); + doNothing().when(launcher).launchForResultAsUser( + any(Intent.class), any(UserHandle.class), any(Fragment.class), anyInt()); + + launcher.setTitle("123") + .setDestination(SubSettingLauncherTest.class.getName()) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .setSourceMetricsCategory(123) + .setUserHandle(userHandle) + .setResultListener(mFragment, requestCode) + .launch(); + + verify(launcher).launchForResultAsUser(any(Intent.class), eq(userHandle), eq(mFragment), + eq(requestCode)); + } } diff --git a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java index 06b4d55a1ca..7b47f97275a 100644 --- a/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/widget/EntityHeaderControllerTest.java @@ -270,7 +270,7 @@ public class EntityHeaderControllerTest { mController = EntityHeaderController.newInstance(mActivity, mFragment, appLinks); mController.setPackageName("123") - .setUid(UserHandle.USER_SYSTEM) + .setUid(123321) .setHasAppInfoLink(true) .setButtonActions( EntityHeaderController.ActionType.ACTION_NOTIF_PREFERENCE,