Get rid of direct usage of Utils.onBuildStartFragmentIntent

Change-Id: I87eb97d6da4cd4f99be5bcdb1e3e245eb1c7bd1c
Fixes: 73250851
Test: robotests
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 0e0e08d..ab491ae 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -389,39 +389,6 @@
     }
 
     /**
-     * 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 8c26988..edbd8b9 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -43,8 +43,8 @@
 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 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 bc79cf8..1ffe7f5 100644
--- a/src/com/android/settings/core/SubSettingLauncher.java
+++ b/src/com/android/settings/core/SubSettingLauncher.java
@@ -101,6 +101,25 @@
                     "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 @@
         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 @@
         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 202dc80..ce043ce 100644
--- a/src/com/android/settings/datausage/BillingCyclePreference.java
+++ b/src/com/android/settings/datausage/BillingCyclePreference.java
@@ -26,7 +26,7 @@
 
 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 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 32c7011..ecc5be6 100644
--- a/src/com/android/settings/datausage/DataUsagePreference.java
+++ b/src/com/android/settings/datausage/DataUsagePreference.java
@@ -23,10 +23,10 @@
 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 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 @@
 
     @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 c2a72e6..7958b37 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -484,9 +484,12 @@
                 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 17a06df..adc35a6 100644
--- a/src/com/android/settings/deviceinfo/StorageSettings.java
+++ b/src/com/android/settings/deviceinfo/StorageSettings.java
@@ -47,7 +47,6 @@
 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 @@
                 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 3623298..6b51be3 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
@@ -35,9 +35,9 @@
 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 @@
         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 @@
         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 c9fe54e..081a0be 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.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 @@
     @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 @@
         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 09789f3..a4310a1 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 @@
         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 ce5e1d1..6cc99f7 100644
--- a/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
+++ b/src/com/android/settings/notification/RecentNotifyingAppsPreferenceController.java
@@ -33,16 +33,13 @@
 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 @@
             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 94ec650..c7c2320 100644
--- a/src/com/android/settings/search/DatabaseIndexingUtils.java
+++ b/src/com/android/settings/search/DatabaseIndexingUtils.java
@@ -26,9 +26,9 @@
 
 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 @@
             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);