Migrate more settings to use SubSettingsLauncher

Bug: 73250851
Test: robotests
Change-Id: I08f6f380489646231d6d8ceb1488e2efb036bf69
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 4f5c6b9..f66b1f9 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -56,6 +56,7 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.password.ConfirmLockPattern;
 import com.android.settingslib.RestrictedLockUtils;
@@ -156,12 +157,15 @@
 
     @VisibleForTesting
     void showFinalConfirmation() {
-        Bundle args = new Bundle();
+        final Bundle args = new Bundle();
         args.putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked());
         args.putBoolean(ERASE_ESIMS_EXTRA, mEsimStorage.isChecked());
-        ((SettingsActivity) getActivity()).startPreferencePanel(
-                this, MasterClearConfirm.class.getName(),
-                args, R.string.master_clear_confirm_title, null, null, 0);
+        new SubSettingLauncher(getContext())
+                .setDestination(MasterClearConfirm.class.getName())
+                .setArguments(args)
+                .setTitle(R.string.master_clear_confirm_title)
+                .setSourceMetricsCategory(getMetricsCategory())
+                .launch();
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index 5cbee63..8043750 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -44,6 +44,7 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.password.ChooseLockSettingsHelper;
 import com.android.settings.password.ConfirmLockPattern;
 import com.android.settingslib.RestrictedLockUtils;
@@ -118,9 +119,12 @@
             args.putInt(PhoneConstants.SUBSCRIPTION_KEY, subscription.getSubscriptionId());
         }
         args.putBoolean(MasterClear.ERASE_ESIMS_EXTRA, mEsimCheckbox.isChecked());
-        ((SettingsActivity) getActivity()).startPreferencePanel(
-                this, ResetNetworkConfirm.class.getName(),
-                args, R.string.reset_network_confirm_title, null, null, 0);
+        new SubSettingLauncher(getContext())
+                .setDestination(ResetNetworkConfirm.class.getName())
+                .setArguments(args)
+                .setTitle(R.string.reset_network_confirm_title)
+                .setSourceMetricsCategory(getMetricsCategory())
+                .launch();
     }
 
     /**
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 84b1071..d28eed6 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -66,6 +66,7 @@
 import com.android.settings.overlay.FeatureFactory;
 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;
@@ -200,7 +201,14 @@
 
     @Override
     public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
-        startPreferencePanel(caller, pref.getFragment(), pref.getExtras(), -1, null, null, 0);
+        new SubSettingLauncher(this)
+                .setDestination(pref.getFragment())
+                .setArguments(pref.getExtras())
+                .setSourceMetricsCategory(caller instanceof Instrumentable
+                        ? ((Instrumentable) caller).getMetricsCategory()
+                        : Instrumentable.METRICS_CATEGORY_UNKNOWN)
+                .setTitle(-1)
+                .launch();
         return true;
     }
 
@@ -594,6 +602,7 @@
      * @param resultRequestCode If resultTo is non-null, this is the caller's
      *                          request code to be received with the result.
      */
+    @Deprecated
     public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args,
             int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) {
         String title = null;
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index 6127ab9..268cb44 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -47,10 +47,10 @@
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.AccessiblePreferenceCategory;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settingslib.RestrictedPreference;
@@ -246,19 +246,19 @@
             if (preference == profileData.managedProfilePreference) {
                 Bundle arguments = new Bundle();
                 arguments.putParcelable(Intent.EXTRA_USER, profileData.userInfo.getUserHandle());
-                ((SettingsActivity) mParent.getActivity()).startPreferencePanel(mParent,
-                        ManagedProfileSettings.class.getName(), arguments,
-                        R.string.managed_profile_settings_title, null, null, 0);
+                new SubSettingLauncher(mContext)
+                        .setSourceMetricsCategory(mParent.getMetricsCategory())
+                        .setDestination(ManagedProfileSettings.class.getName())
+                        .setTitle(R.string.managed_profile_settings_title)
+                        .setArguments(arguments)
+                        .launch();
+
                 return true;
             }
         }
         return false;
     }
 
-    SparseArray<ProfileData> getProfileData() {
-        return mProfiles;
-    }
-
     private void updateUi() {
         if (!isAvailable()) {
             // This should not happen
diff --git a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java
index 0e19dab..a90a3d3 100644
--- a/src/com/android/settings/accounts/AccountTypePreferenceLoader.java
+++ b/src/com/android/settings/accounts/AccountTypePreferenceLoader.java
@@ -38,10 +38,11 @@
 import android.util.Log;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.location.LocationSettings;
 import com.android.settings.utils.LocalClassLoaderContextThemeWrapper;
 import com.android.settingslib.accounts.AuthenticatorHelper;
+import com.android.settingslib.core.instrumentation.Instrumentable;
 
 /**
  * Class to load the preference screen to be added to the settings page for the specific account
@@ -230,8 +231,15 @@
 
         @Override
         public boolean onPreferenceClick(Preference preference) {
-            ((SettingsActivity) mFragment.getActivity()).startPreferencePanel(mFragment,
-                mClass, null, mTitleRes, null, null, 0);
+            final int metricsCategory = (mFragment instanceof Instrumentable)
+                    ? ((Instrumentable) mFragment).getMetricsCategory()
+                    : Instrumentable.METRICS_CATEGORY_UNKNOWN;
+            new SubSettingLauncher(preference.getContext())
+                    .setTitle(mTitleRes)
+                    .setDestination(mClass)
+                    .setSourceMetricsCategory(metricsCategory)
+                    .launch();
+
             // Hack: announce that the Google account preferences page is launching the location
             // settings
             if (mClass.equals(LocationSettings.class.getName())) {
diff --git a/src/com/android/settings/applications/ConvertToFbe.java b/src/com/android/settings/applications/ConvertToFbe.java
index 5f5ebd9..70ee415 100644
--- a/src/com/android/settings/applications/ConvertToFbe.java
+++ b/src/com/android/settings/applications/ConvertToFbe.java
@@ -27,22 +27,21 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.password.ChooseLockSettingsHelper;
 
 /* Class to prompt for conversion of userdata to file based encryption
  */
 public class ConvertToFbe extends InstrumentedFragment {
     static final String TAG = "ConvertToFBE";
-    static final String CONVERT_FBE_EXTRA = "ConvertFBE";
     private static final int KEYGUARD_REQUEST = 55;
 
     private boolean runKeyguardConfirmation(int request) {
         Resources res = getActivity().getResources();
         return new ChooseLockSettingsHelper(getActivity(), this)
-            .launchConfirmationActivity(request,
-                                        res.getText(R.string.convert_to_file_encryption));
+                .launchConfirmationActivity(request,
+                        res.getText(R.string.convert_to_file_encryption));
     }
 
     @Override
@@ -53,15 +52,13 @@
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
+            Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.convert_fbe, null);
 
-        final Button button = (Button) rootView.findViewById(R.id.button_convert_fbe);
-        button.setOnClickListener(new View.OnClickListener() {
-            public void onClick(View v) {
-                if(!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
-                    convert();
-                }
+        final Button button = rootView.findViewById(R.id.button_convert_fbe);
+        button.setOnClickListener(v -> {
+            if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
+                convert();
             }
         });
 
@@ -84,9 +81,11 @@
     }
 
     private void convert() {
-        SettingsActivity sa = (SettingsActivity) getActivity();
-        sa.startPreferencePanel(this, ConfirmConvertToFbe.class.getName(), null,
-                                R.string.convert_to_file_encryption, null, null, 0);
+        new SubSettingLauncher(getContext())
+                .setDestination(ConfirmConvertToFbe.class.getName())
+                .setTitle(R.string.convert_to_file_encryption)
+                .setSourceMetricsCategory(getMetricsCategory())
+                .launch();
     }
 
     @Override
diff --git a/src/com/android/settings/applications/ProcessStatsBase.java b/src/com/android/settings/applications/ProcessStatsBase.java
index b98d0ba..67a324b 100644
--- a/src/com/android/settings/applications/ProcessStatsBase.java
+++ b/src/com/android/settings/applications/ProcessStatsBase.java
@@ -28,6 +28,8 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.applications.ProcStatsData.MemInfo;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settingslib.core.instrumentation.Instrumentable;
 
 public abstract class ProcessStatsBase extends SettingsPreferenceFragment
         implements OnItemSelectedListener {
@@ -44,9 +46,9 @@
     // smaller than the actual time selected instead of bumping up to 3 hours
     // beyond it.
     private static final long DURATION_QUANTUM = ProcessStats.COMMIT_PERIOD;
-    public  static long[] sDurations = new long[] {
-        3 * 60 * 60 * 1000 - DURATION_QUANTUM / 2, 6 * 60 *60 * 1000 - DURATION_QUANTUM / 2,
-        12 * 60 * 60 * 1000 - DURATION_QUANTUM / 2, 24 * 60 * 60 * 1000 - DURATION_QUANTUM / 2
+    public static long[] sDurations = new long[] {
+            3 * 60 * 60 * 1000 - DURATION_QUANTUM / 2, 6 * 60 * 60 * 1000 - DURATION_QUANTUM / 2,
+            12 * 60 * 60 * 1000 - DURATION_QUANTUM / 2, 24 * 60 * 60 * 1000 - DURATION_QUANTUM / 2
     };
     protected static int[] sDurationLabels = new int[] {
             R.string.menu_duration_3h, R.string.menu_duration_6h,
@@ -137,7 +139,11 @@
         args.putDouble(ProcessStatsDetail.EXTRA_MAX_MEMORY_USAGE,
                 memInfo.usedWeight * memInfo.weightToRam);
         args.putDouble(ProcessStatsDetail.EXTRA_TOTAL_SCALE, memInfo.totalScale);
-        activity.startPreferencePanel(null, ProcessStatsDetail.class.getName(), args,
-                R.string.memory_usage, null, null, 0);
+        new SubSettingLauncher(activity)
+                .setDestination(ProcessStatsDetail.class.getName())
+                .setTitle(R.string.memory_usage)
+                .setArguments(args)
+                .setSourceMetricsCategory(Instrumentable.METRICS_CATEGORY_UNKNOWN)
+                .launch();
     }
 }
diff --git a/src/com/android/settings/applications/RunningProcessesView.java b/src/com/android/settings/applications/RunningProcessesView.java
index dd8bcf8..650f56c 100644
--- a/src/com/android/settings/applications/RunningProcessesView.java
+++ b/src/com/android/settings/applications/RunningProcessesView.java
@@ -18,7 +18,6 @@
 
 import android.app.ActivityManager;
 import android.app.Dialog;
-import android.app.Fragment;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
@@ -41,8 +40,9 @@
 
 import com.android.internal.util.MemInfoReader;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
+import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.widget.LinearColorBar;
 
 import java.util.ArrayList;
@@ -64,7 +64,7 @@
 
     RunningState mState;
 
-    Fragment mOwner;
+    SettingsPreferenceFragment mOwner;
 
     Runnable mDataAvail;
 
@@ -411,9 +411,12 @@
             args.putInt(RunningServiceDetails.KEY_USER_ID, mi.mUserId);
             args.putBoolean(RunningServiceDetails.KEY_BACKGROUND, mAdapter.mShowBackground);
 
-            SettingsActivity sa = (SettingsActivity) mOwner.getActivity();
-            sa.startPreferencePanel(mOwner, RunningServiceDetails.class.getName(), args,
-                    R.string.runningservicedetails_settings_title, null, null, 0);
+            new SubSettingLauncher(getContext())
+                    .setDestination(RunningServiceDetails.class.getName())
+                    .setArguments(args)
+                    .setTitle(R.string.runningservicedetails_settings_title)
+                    .setSourceMetricsCategory(mOwner.getMetricsCategory())
+                    .launch();
         }
     }
 
@@ -466,7 +469,7 @@
         mOwner = null;
     }
 
-    public boolean doResume(Fragment owner, Runnable dataAvail) {
+    public boolean doResume(SettingsPreferenceFragment owner, Runnable dataAvail) {
         mOwner = owner;
         mState.resume(this);
         if (mState.hasData()) {
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index a5f06a5..9802968 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -51,6 +51,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.applications.manageapplications.ManageApplications;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.widget.PreferenceCategoryController;
@@ -513,10 +514,13 @@
         }
         args.putString(ARG_PACKAGE_NAME, appEntry.info.packageName);
         args.putInt(ARG_PACKAGE_UID, appEntry.info.uid);
-
-        final SettingsActivity sa = (SettingsActivity) caller.getActivity();
-        sa.startPreferencePanel(caller, fragment.getName(), args, title, null, caller,
-                SUB_INFO_FRAGMENT);
+        new SubSettingLauncher(caller.getContext())
+                .setDestination(fragment.getName())
+                .setArguments(args)
+                .setTitle(title)
+                .setResultListener(caller, SUB_INFO_FRAGMENT)
+                .setSourceMetricsCategory(caller.getMetricsCategory())
+                .launch();
     }
 
     void handleUninstallButtonClick() {
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index b0949ea..f9794d2 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -78,18 +78,18 @@
 import com.android.settings.applications.AppInfoBase;
 import com.android.settings.applications.AppStateAppOpsBridge.PermissionState;
 import com.android.settings.applications.AppStateBaseBridge;
+import com.android.settings.applications.AppStateDirectoryAccessBridge;
 import com.android.settings.applications.AppStateInstallAppsBridge;
 import com.android.settings.applications.AppStateNotificationBridge;
 import com.android.settings.applications.AppStateOverlayBridge;
 import com.android.settings.applications.AppStatePowerBridge;
-import com.android.settings.applications.AppStateDirectoryAccessBridge;
 import com.android.settings.applications.AppStateUsageBridge;
 import com.android.settings.applications.AppStateUsageBridge.UsageState;
 import com.android.settings.applications.AppStateWriteSettingsBridge;
 import com.android.settings.applications.AppStorageSettings;
 import com.android.settings.applications.DefaultAppSettings;
-import com.android.settings.applications.InstalledAppCounter;
 import com.android.settings.applications.DirectoryAccessDetails;
+import com.android.settings.applications.InstalledAppCounter;
 import com.android.settings.applications.UsageAccessDetails;
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
 import com.android.settings.applications.appinfo.AppNotificationPreferenceController;
@@ -97,6 +97,7 @@
 import com.android.settings.applications.appinfo.ExternalSourcesDetails;
 import com.android.settings.applications.appinfo.WriteSettingsDetails;
 import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.fuelgauge.HighPowerDetail;
 import com.android.settings.notification.AppNotificationSettings;
@@ -628,14 +629,19 @@
                 return true;
             case R.id.advanced:
                 if (mListType == LIST_TYPE_NOTIFICATION) {
-                    ((SettingsActivity) getActivity()).startPreferencePanel(this,
-                            ConfigureNotificationSettings.class.getName(), null,
-                            R.string.configure_notification_settings, null, this,
-                            ADVANCED_SETTINGS);
+                    new SubSettingLauncher(getContext())
+                            .setDestination(ConfigureNotificationSettings.class.getName())
+                            .setTitle(R.string.configure_notification_settings)
+                            .setSourceMetricsCategory(getMetricsCategory())
+                            .setResultListener(this, ADVANCED_SETTINGS)
+                            .launch();
                 } else {
-                    ((SettingsActivity) getActivity()).startPreferencePanel(this,
-                            DefaultAppSettings.class.getName(), null, R.string.configure_apps,
-                            null, this, ADVANCED_SETTINGS);
+                    new SubSettingLauncher(getContext())
+                            .setDestination(DefaultAppSettings.class.getName())
+                            .setTitle(R.string.configure_apps)
+                            .setSourceMetricsCategory(getMetricsCategory())
+                            .setResultListener(this, ADVANCED_SETTINGS)
+                            .launch();
                 }
                 return true;
             default:
diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
index 2862083..dbe2c1b 100644
--- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
+++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java
@@ -21,11 +21,12 @@
 import android.os.SystemProperties;
 import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
+import android.util.Log;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.connecteddevice.DevicePreferenceCallback;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.widget.GearPreference;
 import com.android.settingslib.bluetooth.A2dpProfile;
 import com.android.settingslib.bluetooth.BluetoothCallback;
@@ -39,8 +40,6 @@
 import java.util.Map;
 import java.util.Objects;
 
-import android.util.Log;
-
 /**
  * Update the bluetooth devices. It gets bluetooth event from {@link LocalBluetoothManager} using
  * {@link BluetoothCallback}. It notifies the upper level whether to add/remove the preference
@@ -73,10 +72,13 @@
         final Bundle args = new Bundle();
         args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS,
                 device.getDevice().getAddress());
-        final SettingsActivity activity = (SettingsActivity) mFragment.getActivity();
-        activity.startPreferencePanel(mFragment,
-                BluetoothDeviceDetailsFragment.class.getName(), args,
-                R.string.device_details_title, null, null, 0);
+
+        new SubSettingLauncher(mFragment.getContext())
+                .setDestination(BluetoothDeviceDetailsFragment.class.getName())
+                .setArguments(args)
+                .setTitle(R.string.device_details_title)
+                .setSourceMetricsCategory(mFragment.getMetricsCategory())
+                .launch();
 
     };
 
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 3acd477..8b64878 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -39,6 +39,7 @@
 import com.android.settings.LinkifyUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.location.ScanningSettings;
 import com.android.settings.overlay.FeatureFactory;
@@ -248,11 +249,11 @@
             LinkifyUtils.linkify(emptyView, contentBuilder, new LinkifyUtils.OnClickListener() {
                 @Override
                 public void onClick() {
-                    final SettingsActivity activity =
-                            (SettingsActivity) BluetoothSettings.this.getActivity();
-                    activity.startPreferencePanel(BluetoothSettings.this,
-                            ScanningSettings.class.getName(), null,
-                            R.string.location_scanning_screen_title, null, null, 0);
+                    new SubSettingLauncher(getActivity())
+                            .setSourceMetricsCategory(getMetricsCategory())
+                            .setDestination(ScanningSettings.class.getName())
+                            .setTitle(R.string.location_scanning_screen_title)
+                            .launch();
                 }
             });
         }
@@ -322,11 +323,12 @@
             // New version - uses a separate screen.
             args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS,
                     device.getDevice().getAddress());
-            final SettingsActivity activity =
-                    (SettingsActivity) BluetoothSettings.this.getActivity();
-            activity.startPreferencePanel(this,
-                    BluetoothDeviceDetailsFragment.class.getName(), args,
-                    R.string.device_details_title, null, null, 0);
+            new SubSettingLauncher(context)
+                    .setDestination(BluetoothDeviceDetailsFragment.class.getName())
+                    .setArguments(args)
+                    .setTitle(R.string.device_details_title)
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
         }
     };
 
diff --git a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
index dd29902..b637e35 100644
--- a/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
+++ b/src/com/android/settings/connecteddevice/usb/ConnectedUsbDeviceUpdater.java
@@ -16,13 +16,11 @@
 package com.android.settings.connecteddevice.usb;
 
 import android.content.Context;
-import android.os.Bundle;
 import android.support.annotation.VisibleForTesting;
-import android.support.v14.preference.PreferenceFragment;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.connecteddevice.DevicePreferenceCallback;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.widget.GearPreference;
 
@@ -30,7 +28,7 @@
  * Controller to maintain connected usb device
  */
 public class ConnectedUsbDeviceUpdater {
-    private PreferenceFragment mFragment;
+    private DashboardFragment mFragment;
     private UsbBackend mUsbBackend;
     private DevicePreferenceCallback mDevicePreferenceCallback;
     @VisibleForTesting
@@ -81,11 +79,11 @@
         mUsbPreference.setSelectable(false);
         mUsbPreference.setOnGearClickListener((GearPreference p) -> {
             // New version - uses a separate screen.
-            final Bundle args = new Bundle();
-            final SettingsActivity activity = (SettingsActivity) mFragment.getContext();
-            activity.startPreferencePanel(mFragment,
-                    UsbDetailsFragment.class.getName(), args,
-                    R.string.device_details_title, null /* titleText */, null /* resultTo */, 0);
+            new SubSettingLauncher(mFragment.getContext())
+                    .setDestination(UsbDetailsFragment.class.getName())
+                    .setTitle(R.string.device_details_title)
+                    .setSourceMetricsCategory(mFragment.getMetricsCategory())
+                    .launch();
         });
 
         forceUpdate();
diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java
index 8e0f859..bc79cf8 100644
--- a/src/com/android/settings/core/SubSettingLauncher.java
+++ b/src/com/android/settings/core/SubSettingLauncher.java
@@ -108,7 +108,7 @@
         }
         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, mLaunchRequest.destinationName);
 
-        if (mLaunchRequest.sourceMetricsCategory <= 0) {
+        if (mLaunchRequest.sourceMetricsCategory < 0) {
             throw new IllegalArgumentException("Source metrics category must be set");
         }
         intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
diff --git a/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java
index da5b6c6..ab3ce8d 100644
--- a/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryOptimizationPreferenceController.java
@@ -14,7 +14,6 @@
 
 package com.android.settings.fuelgauge;
 
-import android.app.Fragment;
 import android.os.Bundle;
 import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
@@ -24,6 +23,8 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.fuelgauge.PowerWhitelistBackend;
 
@@ -37,12 +38,12 @@
 
 
     private PowerWhitelistBackend mBackend;
-    private Fragment mFragment;
+    private DashboardFragment mFragment;
     private SettingsActivity mSettingsActivity;
     private String mPackageName;
 
     public BatteryOptimizationPreferenceController(SettingsActivity settingsActivity,
-            Fragment fragment, String packageName) {
+            DashboardFragment fragment, String packageName) {
         super(settingsActivity);
         mFragment = fragment;
         mSettingsActivity = settingsActivity;
@@ -52,7 +53,7 @@
 
     @VisibleForTesting
     BatteryOptimizationPreferenceController(SettingsActivity settingsActivity,
-            Fragment fragment, String packageName, PowerWhitelistBackend backend) {
+            DashboardFragment fragment, String packageName, PowerWhitelistBackend backend) {
         super(settingsActivity);
         mFragment = fragment;
         mSettingsActivity = settingsActivity;
@@ -82,11 +83,16 @@
             return false;
         }
 
-        Bundle args = new Bundle(1);
+        final Bundle args = new Bundle();
         args.putString(ManageApplications.EXTRA_CLASSNAME,
                 Settings.HighPowerApplicationsActivity.class.getName());
-        mSettingsActivity.startPreferencePanel(mFragment, ManageApplications.class.getName(), args,
-                R.string.high_power_apps, null, null, 0);
+        new SubSettingLauncher(mSettingsActivity)
+                .setDestination(ManageApplications.class.getName())
+                .setArguments(args)
+                .setTitle(R.string.high_power_apps)
+                .setSourceMetricsCategory(mFragment.getMetricsCategory())
+                .launch();
+
         return true;
     }
 
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index e6c4923..4fe193f 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -54,6 +54,7 @@
 import com.android.settings.Utils;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.applications.manageapplications.ManageApplications;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.display.AmbientDisplayPreferenceController;
 import com.android.settings.display.AutoBrightnessPreferenceController;
@@ -365,8 +366,12 @@
                 Bundle args = new Bundle();
                 args.putString(ManageApplications.EXTRA_CLASSNAME,
                         HighPowerApplicationsActivity.class.getName());
-                sa.startPreferencePanel(this, ManageApplications.class.getName(), args,
-                        R.string.high_power_apps, null, null, 0);
+                new SubSettingLauncher(context)
+                        .setDestination(ManageApplications.class.getName())
+                        .setArguments(args)
+                        .setTitle(R.string.high_power_apps)
+                        .setSourceMetricsCategory(getMetricsCategory())
+                        .launch();
                 metricsFeatureProvider.action(context,
                         MetricsEvent.ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION);
                 return true;
diff --git a/src/com/android/settings/inputmethod/UserDictionarySettings.java b/src/com/android/settings/inputmethod/UserDictionarySettings.java
index 3bbc581..e80fdf3 100644
--- a/src/com/android/settings/inputmethod/UserDictionarySettings.java
+++ b/src/com/android/settings/inputmethod/UserDictionarySettings.java
@@ -42,9 +42,9 @@
 import android.widget.TextView;
 
 import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.instrumentation.Instrumentable;
 import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
 
@@ -187,10 +187,14 @@
         args.putString(UserDictionaryAddWordContents.EXTRA_WORD, editingWord);
         args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut);
         args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale);
-        SettingsActivity sa = (SettingsActivity) getActivity();
-        sa.startPreferencePanel(this,
-                com.android.settings.inputmethod.UserDictionaryAddWordFragment.class.getName(),
-                args, R.string.user_dict_settings_add_dialog_title, null, null, 0);
+
+        new SubSettingLauncher(getContext())
+                .setDestination(UserDictionaryAddWordFragment.class.getName())
+                .setArguments(args)
+                .setTitle(R.string.user_dict_settings_add_dialog_title)
+                .setSourceMetricsCategory(getMetricsCategory())
+                .launch();
+
     }
 
     private String getWord(final int position) {
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index f6bacd8..3c16b07 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -61,9 +61,9 @@
 import com.android.internal.util.UserIcons;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.password.ChooseLockGeneric;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -484,9 +484,12 @@
         if (userId == UserPreference.USERID_GUEST_DEFAULTS) {
             Bundle extras = new Bundle();
             extras.putBoolean(UserDetailsSettings.EXTRA_USER_GUEST, true);
-            ((SettingsActivity) getActivity()).startPreferencePanel(this,
-                    UserDetailsSettings.class.getName(),
-                    extras, R.string.user_guest, null, null, 0);
+            new SubSettingLauncher(getContext())
+                    .setDestination(UserDetailsSettings.class.getName())
+                    .setArguments(extras)
+                    .setTitle(R.string.user_guest)
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
             return;
         }
         UserInfo info = mUserManager.getUserInfo(userId);
@@ -494,23 +497,24 @@
             Bundle extras = new Bundle();
             extras.putInt(RestrictedProfileSettings.EXTRA_USER_ID, userId);
             extras.putBoolean(RestrictedProfileSettings.EXTRA_NEW_USER, newUser);
-            ((SettingsActivity) getActivity()).startPreferencePanel(this,
-                    RestrictedProfileSettings.class.getName(),
-                    extras, R.string.user_restrictions_title, null,
-                    null, 0);
+            new SubSettingLauncher(getContext())
+                    .setDestination(RestrictedProfileSettings.class.getName())
+                    .setArguments(extras)
+                    .setTitle(R.string.user_restrictions_title)
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
         } else if (info.id == UserHandle.myUserId()) {
             // Jump to owner info panel
             OwnerInfoSettings.show(this);
         } else if (mUserCaps.mIsAdmin) {
-            Bundle extras = new Bundle();
+            final Bundle extras = new Bundle();
             extras.putInt(UserDetailsSettings.EXTRA_USER_ID, userId);
-            ((SettingsActivity) getActivity()).startPreferencePanel(this,
-                    UserDetailsSettings.class.getName(),
-                    extras,
-                    -1, /* No title res id */
-                    info.name, /* title */
-                    null, /* resultTo */
-                    0 /* resultRequestCode */);
+            new SubSettingLauncher(getContext())
+                    .setDestination(UserDetailsSettings.class.getName())
+                    .setArguments(extras)
+                    .setTitle(info.name)
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
         }
     }
 
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 69dc130..9fbeabe 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -30,7 +30,6 @@
 import android.net.NetworkInfo.State;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
-import android.net.wifi.WpsInfo;
 import android.nfc.NfcAdapter;
 import android.os.Bundle;
 import android.os.Handler;
@@ -52,6 +51,7 @@
 import com.android.settings.R;
 import com.android.settings.RestrictedSettingsFragment;
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.location.ScanningSettings;
 import com.android.settings.search.BaseSearchIndexProvider;
@@ -861,10 +861,12 @@
         pref.setOnPreferenceClickListener(preference -> {
             pref.getAccessPoint().saveWifiState(pref.getExtras());
 
-            SettingsActivity activity = (SettingsActivity) WifiSettings.this.getActivity();
-            activity.startPreferencePanel(this,
-                    WifiNetworkDetailsFragment.class.getName(), pref.getExtras(),
-                    -1 /* resId */, pref.getTitle(), null, 0 /* resultRequestCode */);
+            new SubSettingLauncher(getContext())
+                    .setTitle(pref.getTitle())
+                    .setDestination(WifiNetworkDetailsFragment.class.getName())
+                    .setArguments(pref.getExtras())
+                    .setSourceMetricsCategory(getMetricsCategory())
+                    .launch();
             return true;
         });
 
@@ -922,15 +924,12 @@
                 Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 1;
         final CharSequence description = wifiScanningMode ? getText(R.string.wifi_scan_notify_text)
                 : getText(R.string.wifi_scan_notify_text_scanning_off);
-        final LinkifyUtils.OnClickListener clickListener = new LinkifyUtils.OnClickListener() {
-            @Override
-            public void onClick() {
-                final SettingsActivity activity = (SettingsActivity) getActivity();
-                activity.startPreferencePanel(WifiSettings.this,
-                        ScanningSettings.class.getName(),
-                        null, R.string.location_scanning_screen_title, null, null, 0);
-            }
-        };
+        final LinkifyUtils.OnClickListener clickListener =
+                () -> new SubSettingLauncher(getContext())
+                        .setDestination(ScanningSettings.class.getName())
+                        .setTitle(R.string.location_scanning_screen_title)
+                        .setSourceMetricsCategory(getMetricsCategory())
+                        .launch();
         mStatusMessagePreference.setText(title, description, clickListener);
         removeConnectedAccessPointPreference();
         mAccessPointsPreferenceCategory.removeAll();