Migrate more places to subsetting launcher

Bug: 73250851
Test: robotests
Change-Id: Iaf29df45ddb42fd58f181cb01e10998a97cb7c34
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index a21153d..3144ae2 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -67,7 +67,6 @@
 import com.android.settings.wfd.WifiDisplaySettings;
 import com.android.settings.widget.SwitchBar;
 import com.android.settingslib.core.instrumentation.Instrumentable;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.instrumentation.SharedPreferencesLogger;
 import com.android.settingslib.development.DevelopmentSettingsEnabler;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -558,37 +557,17 @@
     /**
      * Called by a preference panel fragment to finish itself.
      *
-     * @param caller     The fragment that is asking to be finished.
      * @param resultCode Optional result code to send back to the original
      *                   launching fragment.
      * @param resultData Optional result data to send back to the original
      *                   launching fragment.
      */
-    public void finishPreferencePanel(Fragment caller, int resultCode, Intent resultData) {
+    public void finishPreferencePanel(int resultCode, Intent resultData) {
         setResult(resultCode, resultData);
         finish();
     }
 
     /**
-     * Start a new fragment.
-     *
-     * @param fragment The fragment to start
-     * @param push     If true, the current fragment will be pushed onto the back stack.  If false,
-     *                 the current fragment will be replaced.
-     */
-    public void startPreferenceFragment(Fragment fragment, boolean push) {
-        FragmentTransaction transaction = getFragmentManager().beginTransaction();
-        transaction.replace(R.id.main_content, fragment);
-        if (push) {
-            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
-            transaction.addToBackStack(BACK_STACK_PREFS);
-        } else {
-            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
-        }
-        transaction.commitAllowingStateLoss();
-    }
-
-    /**
      * Switch to a specific Fragment with taking care of validation, Title and BackStack
      */
     private Fragment switchToFragment(String fragmentName, Bundle args, boolean validate,
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 3923da5..0e0e08d 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -389,71 +389,6 @@
     }
 
     /**
-     * Start a new instance of the activity, showing only the given fragment.
-     * When launched in this mode, the given preference fragment will be instantiated and fill the
-     * entire activity.
-     *
-     * @param context The context.
-     * @param fragmentName The name of the fragment to display.
-     * @param args Optional arguments to supply to the fragment.
-     * @param resultTo Option fragment that should receive the result of the activity launch.
-     * @param resultRequestCode If resultTo is non-null, this is the request code in which
-     *                          to report the result.
-     * @param titleResId resource id for the String to display for the title of this set
-     *                   of preferences.
-     * @param title String to display for the title of this set of preferences.
-     * @param metricsCategory The current metricsCategory for logging source when fragment starts
-     */
-    public static void startWithFragment(Context context, String fragmentName, Bundle args,
-            Fragment resultTo, int resultRequestCode, int titleResId,
-            CharSequence title, int metricsCategory) {
-        startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
-                null /* titleResPackageName */, titleResId, title, false /* not a shortcut */,
-                metricsCategory);
-    }
-
-    /**
-     * Start a new instance of the activity, showing only the given fragment.
-     * When launched in this mode, the given preference fragment will be instantiated and fill the
-     * entire activity.
-     *
-     * @param context The context.
-     * @param fragmentName The name of the fragment to display.
-     * @param args Optional arguments to supply to the fragment.
-     * @param resultTo Option fragment that should receive the result of the activity launch.
-     * @param resultRequestCode If resultTo is non-null, this is the request code in which
-     *                          to report the result.
-     * @param titleResId resource id for the String to display for the title of this set
-     *                   of preferences.
-     * @param title String to display for the title of this set of preferences.
-     * @param metricsCategory The current metricsCategory for logging source when fragment starts
-     */
-    public static void startWithFragment(Context context, String fragmentName, Bundle args,
-            Fragment resultTo, int resultRequestCode, int titleResId,
-            CharSequence title, boolean isShortcut, int metricsCategory) {
-        Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
-                null /* titleResPackageName */, titleResId, title, isShortcut, metricsCategory);
-        if (resultTo == null) {
-            context.startActivity(intent);
-        } else {
-            resultTo.getActivity().startActivityForResult(intent, resultRequestCode);
-        }
-    }
-
-    public static void startWithFragment(Context context, String fragmentName, Bundle args,
-            Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
-            CharSequence title, boolean isShortcut, int metricsCategory) {
-        Intent intent = onBuildStartFragmentIntent(context, fragmentName, args, titleResPackageName,
-                titleResId, title, isShortcut, metricsCategory);
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        if (resultTo == null) {
-            context.startActivity(intent);
-        } else {
-            resultTo.startActivityForResult(intent, resultRequestCode);
-        }
-    }
-
-    /**
      * 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.
diff --git a/src/com/android/settings/accounts/AccountSyncPreferenceController.java b/src/com/android/settings/accounts/AccountSyncPreferenceController.java
index 3eed037..c770713 100644
--- a/src/com/android/settings/accounts/AccountSyncPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountSyncPreferenceController.java
@@ -30,8 +30,8 @@
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
-import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settingslib.accounts.AuthenticatorHelper;
 import com.android.settingslib.core.AbstractPreferenceController;
 
@@ -43,7 +43,6 @@
 
     private Account mAccount;
     private UserHandle mUserHandle;
-    private AuthenticatorHelper mAuthenticatorHelper;
     private Preference mPreference;
 
     public AccountSyncPreferenceController(Context context) {
@@ -63,8 +62,12 @@
         final Bundle args = new Bundle();
         args.putParcelable(AccountSyncSettings.ACCOUNT_KEY, mAccount);
         args.putParcelable(EXTRA_USER, mUserHandle);
-        Utils.startWithFragment(mContext, AccountSyncSettings.class.getName(), args, null, 0,
-                R.string.account_sync_title, null, MetricsProto.MetricsEvent.ACCOUNT);
+        new SubSettingLauncher(mContext)
+                .setDestination(AccountSyncSettings.class.getName())
+                .setArguments(args)
+                .setSourceMetricsCategory( MetricsProto.MetricsEvent.ACCOUNT)
+                .setTitle( R.string.account_sync_title)
+                .launch();
 
         return true;
     }
@@ -93,7 +96,6 @@
     public void init(Account account, UserHandle userHandle) {
         mAccount = account;
         mUserHandle = userHandle;
-        mAuthenticatorHelper = new AuthenticatorHelper(mContext, mUserHandle, this);
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index 0c96171..8c26988 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -161,7 +161,7 @@
         Intent intent = new Intent();
         intent.putExtra(ManageApplications.APP_CHG, appChanged);
         SettingsActivity sa = (SettingsActivity)getActivity();
-        sa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
+        sa.finishPreferencePanel(Activity.RESULT_OK, intent);
         mFinishing = true;
     }
 
diff --git a/src/com/android/settings/applications/ShortcutPreference.java b/src/com/android/settings/applications/ShortcutPreference.java
deleted file mode 100644
index 9505e89..0000000
--- a/src/com/android/settings/applications/ShortcutPreference.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2016 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;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v7.preference.Preference;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.SettingsActivity;
-import com.android.settings.Utils;
-import com.android.settings.applications.appinfo.DefaultAppShortcutPreferenceControllerBase;
-
-/**
- * deprecated in favor of {@link DefaultAppShortcutPreferenceControllerBase}
- */
-@Deprecated
-public class ShortcutPreference extends Preference {
-
-    private final Class mTarget;
-    private final String mPrefKey;
-    private final int mTitle;
-
-    public ShortcutPreference(Context context, Class target, String prefKey, int prefTitle,
-            int title) {
-        super(context);
-        mTarget = target;
-        mPrefKey = prefKey;
-        mTitle = title;
-        setTitle(prefTitle);
-        setKey(mPrefKey);
-    }
-
-    @Override
-    public void performClick() {
-        super.performClick();
-        Bundle bundle = new Bundle();
-        bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPrefKey);
-        Utils.startWithFragment(getContext(), mTarget.getName(), bundle, null, 0,
-                mTitle, null, MetricsProto.MetricsEvent.VIEW_UNKNOWN);
-    }
-}
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 9802968..90df547 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -674,7 +674,7 @@
         final Intent intent = new Intent();
         intent.putExtra(ManageApplications.APP_CHG, appChanged);
         final SettingsActivity sa = (SettingsActivity)getActivity();
-        sa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
+        sa.finishPreferencePanel(Activity.RESULT_OK, intent);
         mFinishing = true;
     }
 
diff --git a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
index 873c98c..7d3f946 100644
--- a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
+++ b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java
@@ -23,9 +23,9 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
-import com.android.settings.Utils;
 import com.android.settings.applications.DefaultAppSettings;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SubSettingLauncher;
 
 /*
  * Abstract base controller for the default app shortcut preferences that launches the default app
@@ -63,10 +63,14 @@
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (TextUtils.equals(mPreferenceKey, preference.getKey())) {
-            Bundle bundle = new Bundle();
+            final Bundle bundle = new Bundle();
             bundle.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, mPreferenceKey);
-            Utils.startWithFragment(mContext, DefaultAppSettings.class.getName(), bundle, null, 0,
-                    R.string.configure_apps, null, MetricsProto.MetricsEvent.VIEW_UNKNOWN);
+            new SubSettingLauncher(mContext)
+                    .setDestination(DefaultAppSettings.class.getName())
+                    .setArguments(bundle)
+                    .setTitle(R.string.configure_apps)
+                    .setSourceMetricsCategory(MetricsProto.MetricsEvent.VIEW_UNKNOWN)
+                    .launch();
             return true;
         }
         return false;
diff --git a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
index 7877f9d..618fed3 100644
--- a/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
+++ b/src/com/android/settings/dashboard/conditional/BatterySaverCondition.java
@@ -15,11 +15,13 @@
  */
 package com.android.settings.dashboard.conditional;
 
+import android.content.Intent;
 import android.graphics.drawable.Icon;
 import android.os.PowerManager;
+
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
 
 public class BatterySaverCondition extends Condition {
@@ -55,8 +57,12 @@
 
     @Override
     public void onPrimaryClick() {
-        Utils.startWithFragment(mManager.getContext(), BatterySaverSettings.class.getName(), null,
-                null, 0, R.string.battery_saver, null, MetricsEvent.DASHBOARD_SUMMARY);
+        new SubSettingLauncher(mManager.getContext())
+                .setDestination(BatterySaverSettings.class.getName())
+                .setSourceMetricsCategory(MetricsEvent.DASHBOARD_SUMMARY)
+                .setTitle(R.string.battery_saver)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                .launch();
     }
 
     @Override
diff --git a/src/com/android/settings/dashboard/conditional/DndCondition.java b/src/com/android/settings/dashboard/conditional/DndCondition.java
index 6498db6..cd5178a 100644
--- a/src/com/android/settings/dashboard/conditional/DndCondition.java
+++ b/src/com/android/settings/dashboard/conditional/DndCondition.java
@@ -29,7 +29,7 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.notification.ZenModeSettings;
 
 public class DndCondition extends Condition {
@@ -103,9 +103,12 @@
 
     @Override
     public void onPrimaryClick() {
-        Utils.startWithFragment(mManager.getContext(), ZenModeSettings.class.getName(), null,
-                null, 0, R.string.zen_mode_settings_title, null,
-                MetricsEvent.NOTIFICATION_ZEN_MODE);
+        new SubSettingLauncher(mManager.getContext())
+                .setDestination(ZenModeSettings.class.getName())
+                .setSourceMetricsCategory(MetricsEvent.DASHBOARD_SUMMARY)
+                .setTitle(R.string.zen_mode_settings_title)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                .launch();
     }
 
     @Override
diff --git a/src/com/android/settings/dashboard/conditional/HotspotCondition.java b/src/com/android/settings/dashboard/conditional/HotspotCondition.java
index 4ddf47c..c62b0a4 100644
--- a/src/com/android/settings/dashboard/conditional/HotspotCondition.java
+++ b/src/com/android/settings/dashboard/conditional/HotspotCondition.java
@@ -29,7 +29,7 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.TetherSettings;
-import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 
@@ -39,7 +39,7 @@
     private final Receiver mReceiver;
 
     private static final IntentFilter WIFI_AP_STATE_FILTER =
-        new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
+            new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
 
     public HotspotCondition(ConditionManager manager) {
         super(manager);
@@ -95,13 +95,17 @@
                 UserManager.DISALLOW_CONFIG_TETHERING, UserHandle.myUserId())) {
             return new CharSequence[0];
         }
-        return new CharSequence[] { context.getString(R.string.condition_turn_off) };
+        return new CharSequence[] {context.getString(R.string.condition_turn_off)};
     }
 
     @Override
     public void onPrimaryClick() {
-        Utils.startWithFragment(mManager.getContext(), TetherSettings.class.getName(), null, null,
-                0, R.string.tether_settings_title_all, null, MetricsEvent.DASHBOARD_SUMMARY);
+        new SubSettingLauncher(mManager.getContext())
+                .setDestination(TetherSettings.class.getName())
+                .setSourceMetricsCategory(MetricsEvent.DASHBOARD_SUMMARY)
+                .setTitle(R.string.tether_settings_title_all)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                .launch();
     }
 
     @Override
diff --git a/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java b/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java
index 4d885ae..9cb8605 100644
--- a/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java
+++ b/src/com/android/settings/dashboard/conditional/NightDisplayCondition.java
@@ -16,12 +16,13 @@
 
 package com.android.settings.dashboard.conditional;
 
+import android.content.Intent;
 import android.graphics.drawable.Icon;
 
 import com.android.internal.app.ColorDisplayController;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.display.NightDisplaySettings;
 
 public final class NightDisplayCondition extends Condition
@@ -62,8 +63,12 @@
 
     @Override
     public void onPrimaryClick() {
-        Utils.startWithFragment(mManager.getContext(), NightDisplaySettings.class.getName(), null,
-                null, 0, R.string.night_display_title, null, MetricsEvent.DASHBOARD_SUMMARY);
+        new SubSettingLauncher(mManager.getContext())
+                .setDestination(NightDisplaySettings.class.getName())
+                .setSourceMetricsCategory(MetricsEvent.DASHBOARD_SUMMARY)
+                .setTitle(R.string.night_display_title)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+                .launch();
     }
 
     @Override
diff --git a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
index c968d25..9e78ae5 100644
--- a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
@@ -24,10 +24,10 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.Utils;
 import com.android.settings.accounts.AccountDetailDashboardFragment;
 import com.android.settings.accounts.AccountFeatureProvider;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.overlay.FeatureFactory;
 
 public class BrandedAccountPreferenceController extends BasePreferenceController {
@@ -69,9 +69,13 @@
                     android.os.Process.myUserHandle());
             args.putString(AccountDetailDashboardFragment.KEY_ACCOUNT_TYPE,
                     accountFeatureProvider.getAccountType());
-            Utils.startWithFragment(mContext, AccountDetailDashboardFragment.class.getName(),
-                    args, null, 0,
-                    R.string.account_sync_title, null, MetricsEvent.ACCOUNT);
+
+            new SubSettingLauncher(mContext)
+                    .setDestination(AccountDetailDashboardFragment.class.getName())
+                    .setTitle(R.string.account_sync_title)
+                    .setArguments(args)
+                    .setSourceMetricsCategory(MetricsEvent.DEVICEINFO)
+                    .launch();
             return true;
         });
     }
diff --git a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
index 7bd1b3d..4094e1f 100644
--- a/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/AppButtonsPreferenceController.java
@@ -59,7 +59,6 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnDestroy;
-import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 
 import java.util.ArrayList;
@@ -434,7 +433,7 @@
         }
         Intent intent = new Intent();
         intent.putExtra(APP_CHG, appChanged);
-        mActivity.finishPreferencePanel(mFragment, Activity.RESULT_OK, intent);
+        mActivity.finishPreferencePanel(Activity.RESULT_OK, intent);
         mFinishing = true;
     }
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index a95320b..1ca8626 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -67,11 +67,11 @@
 import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
 import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
-
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.utils.PowerUtil;
 import com.android.settingslib.utils.StringUtil;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -407,8 +407,11 @@
 
     private void performBatteryHeaderClick() {
         if (mPowerFeatureProvider.isAdvancedUiEnabled()) {
-            Utils.startWithFragment(getContext(), PowerUsageAdvanced.class.getName(), null,
-                    null, 0, R.string.advanced_battery_title, null, getMetricsCategory());
+            new SubSettingLauncher(getContext())
+                    .setDestination(PowerUsageAdvanced.class.getName())
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .setTitle(R.string.advanced_battery_title)
+                    .launch();
         } else {
             mStatsHelper.storeStatsHistoryInFile(BatteryHistoryDetail.BATTERY_HISTORY_FILE);
             Bundle args = new Bundle(2);
@@ -416,8 +419,12 @@
                     BatteryHistoryDetail.BATTERY_HISTORY_FILE);
             args.putParcelable(BatteryHistoryDetail.EXTRA_BROADCAST,
                     mStatsHelper.getBatteryBroadcast());
-            Utils.startWithFragment(getContext(), BatteryHistoryDetail.class.getName(), args,
-                    null, 0, R.string.history_details_title, null, getMetricsCategory());
+            new SubSettingLauncher(getContext())
+                    .setDestination(BatteryHistoryDetail.class.getName())
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .setArguments(args)
+                    .setTitle(R.string.history_details_title)
+                    .launch();
         }
     }
 
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
index 3243e56..fd33051 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
@@ -23,17 +23,14 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.core.InstrumentedFragment;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedFragment;
 import com.android.settings.inputmethod.UserDictionaryAddWordContents.LocaleRenderer;
 
 import java.util.ArrayList;
-import java.util.Locale;
 
 /**
  * Fragment to add a word/shortcut to the user dictionary.
@@ -41,9 +38,7 @@
  * As opposed to the UserDictionaryActivity, this is only invoked within Settings
  * from the UserDictionarySettings.
  */
-public class UserDictionaryAddWordFragment extends InstrumentedFragment
-        implements AdapterView.OnItemSelectedListener,
-        com.android.internal.app.LocalePicker.LocaleSelectionListener {
+public class UserDictionaryAddWordFragment extends InstrumentedFragment {
 
     private static final int OPTIONS_MENU_DELETE = Menu.FIRST;
 
@@ -136,30 +131,4 @@
             mContents.apply(getActivity(), null);
         }
     }
-
-    @Override
-    public void onItemSelected(final AdapterView<?> parent, final View view, final int pos,
-            final long id) {
-        final LocaleRenderer locale = (LocaleRenderer)parent.getItemAtPosition(pos);
-        if (locale.isMoreLanguages()) {
-            SettingsActivity sa = (SettingsActivity)getActivity();
-            sa.startPreferenceFragment(new UserDictionaryLocalePicker(this), true);
-        } else {
-            mContents.updateLocale(locale.getLocaleString());
-        }
-    }
-
-    @Override
-    public void onNothingSelected(final AdapterView<?> parent) {
-        // I'm not sure we can come here, but if we do, that's the right thing to do.
-        final Bundle args = getArguments();
-        mContents.updateLocale(args.getString(UserDictionaryAddWordContents.EXTRA_LOCALE));
-    }
-
-    // Called by the locale picker
-    @Override
-    public void onLocaleSelected(final Locale locale) {
-        mContents.updateLocale(locale.toString());
-        getActivity().onBackPressed();
-    }
 }
diff --git a/src/com/android/settings/inputmethod/UserDictionaryLocalePicker.java b/src/com/android/settings/inputmethod/UserDictionaryLocalePicker.java
deleted file mode 100644
index c3c4237..0000000
--- a/src/com/android/settings/inputmethod/UserDictionaryLocalePicker.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2012 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.inputmethod;
-
-public class UserDictionaryLocalePicker extends com.android.internal.app.LocalePicker {
-    public UserDictionaryLocalePicker(final UserDictionaryAddWordFragment parent) {
-        super();
-        setLocaleSelectionListener(parent);
-    }
-}
diff --git a/src/com/android/settings/language/PhoneLanguagePreferenceController.java b/src/com/android/settings/language/PhoneLanguagePreferenceController.java
index 1fd7db7..1b11f59 100644
--- a/src/com/android/settings/language/PhoneLanguagePreferenceController.java
+++ b/src/com/android/settings/language/PhoneLanguagePreferenceController.java
@@ -21,9 +21,8 @@
 
 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.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.localepicker.LocaleListEditor;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -72,9 +71,11 @@
         if (!KEY_PHONE_LANGUAGE.equals(preference.getKey())) {
             return false;
         }
-        Utils.startWithFragment(mContext, LocaleListEditor.class.getName(), null, null, 0,
-                R.string.pref_title_lang_selection, null,
-                MetricsProto.MetricsEvent.SETTINGS_LANGUAGE_CATEGORY);
+        new SubSettingLauncher(mContext)
+                .setDestination(LocaleListEditor.class.getName())
+                .setSourceMetricsCategory(MetricsProto.MetricsEvent.SETTINGS_LANGUAGE_CATEGORY)
+                .setTitle(R.string.pref_title_lang_selection)
+                .launch();
         return true;
     }
 
diff --git a/src/com/android/settings/network/NetworkResetActionMenuController.java b/src/com/android/settings/network/NetworkResetActionMenuController.java
index 75db65e..08d6d63 100644
--- a/src/com/android/settings/network/NetworkResetActionMenuController.java
+++ b/src/com/android/settings/network/NetworkResetActionMenuController.java
@@ -20,10 +20,10 @@
 import android.view.Menu;
 import android.view.MenuItem;
 
-import com.android.internal.logging.nano.MetricsProto;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.ResetNetwork;
-import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 
 public class NetworkResetActionMenuController {
 
@@ -44,9 +44,11 @@
         }
         if (item != null) {
             item.setOnMenuItemClickListener(target -> {
-                Utils.startWithFragment(mContext, ResetNetwork.class.getName(), null, null,
-                        0, R.string.reset_network_title, null,
-                        MetricsProto.MetricsEvent.SETTINGS_NETWORK_CATEGORY);
+                new SubSettingLauncher(mContext)
+                        .setDestination(ResetNetwork.class.getName())
+                        .setSourceMetricsCategory(MetricsEvent.SETTINGS_NETWORK_CATEGORY)
+                        .setTitle(R.string.reset_network_title)
+                        .launch();
                 return true;
             });
         }