Migrate more settings to SubSettingsLauncher

Bug: 73250851
Test: robotests
Change-Id: I4100bef20e2ed477e4e31c9b7816f1b03f3f2809
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index d28eed6..a21153d 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -75,7 +75,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 public class SettingsActivity extends SettingsDrawerActivity
         implements PreferenceManager.OnPreferenceTreeClickListener,
@@ -157,10 +156,6 @@
     private CharSequence mInitialTitle;
     private int mInitialTitleResId;
 
-    private static final String[] LIKE_SHORTCUT_INTENT_ACTION_ARRAY = {
-            "android.settings.APPLICATION_DETAILS_SETTINGS"
-    };
-
     private BroadcastReceiver mDevelopmentSettingsListener;
 
     private boolean mBatteryPresent = true;
@@ -184,12 +179,9 @@
     private Button mNextButton;
 
     private boolean mIsShowingDashboard;
-    private boolean mIsShortcut;
 
     private ViewGroup mContent;
 
-    private MetricsFeatureProvider mMetricsFeatureProvider;
-
     // Categories
     private ArrayList<DashboardCategory> mCategories = new ArrayList<>();
 
@@ -237,22 +229,6 @@
         return tag;
     }
 
-    private static boolean isShortCutIntent(final Intent intent) {
-        Set<String> categories = intent.getCategories();
-        return (categories != null) && categories.contains("com.android.settings.SHORTCUT");
-    }
-
-    private static boolean isLikeShortCutIntent(final Intent intent) {
-        String action = intent.getAction();
-        if (action == null) {
-            return false;
-        }
-        for (int i = 0; i < LIKE_SHORTCUT_INTENT_ACTION_ARRAY.length; i++) {
-            if (LIKE_SHORTCUT_INTENT_ACTION_ARRAY[i].equals(action)) return true;
-        }
-        return false;
-    }
-
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
@@ -261,7 +237,6 @@
         final FeatureFactory factory = FeatureFactory.getFactory(this);
 
         mDashboardFeatureProvider = factory.getDashboardFeatureProvider(this);
-        mMetricsFeatureProvider = factory.getMetricsFeatureProvider();
 
         // Should happen before any call to getIntent()
         getMetaData();
@@ -274,9 +249,6 @@
         // Getting Intent properties can only be done after the super.onCreate(...)
         final String initialFragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
 
-        mIsShortcut = isShortCutIntent(intent) || isLikeShortCutIntent(intent) ||
-                intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SHORTCUT, false);
-
         final ComponentName cn = intent.getComponent();
         final String className = cn.getClassName();
 
@@ -584,74 +556,6 @@
     }
 
     /**
-     * Start a new fragment containing a preference panel.  If the preferences
-     * are being displayed in multi-pane mode, the given fragment class will
-     * be instantiated and placed in the appropriate pane.  If running in
-     * single-pane mode, a new activity will be launched in which to show the
-     * fragment.
-     *
-     * @param fragmentClass     Full name of the class implementing the fragment.
-     * @param args              Any desired arguments to supply to the fragment.
-     * @param titleRes          Optional resource identifier of the title of this
-     *                          fragment.
-     * @param titleText         Optional text of the title of this fragment.
-     * @param resultTo          Optional fragment that result data should be sent to.
-     *                          If non-null, resultTo.onActivityResult() will be called when this
-     *                          preference panel is done.  The launched panel must use
-     *                          {@link #finishPreferencePanel(Fragment, int, Intent)} when done.
-     * @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;
-        if (titleRes < 0 && titleText != null) {
-            title = titleText.toString();
-        }
-        Utils.startWithFragment(this, fragmentClass, args, resultTo, resultRequestCode,
-                titleRes, title, mIsShortcut, mMetricsFeatureProvider.getMetricsCategory(caller));
-    }
-
-    /**
-     * Start a new fragment in a new activity containing a preference panel for a given user. If the
-     * preferences are being displayed in multi-pane mode, the given fragment class will be
-     * instantiated and placed in the appropriate pane. If running in single-pane mode, a new
-     * activity will be launched in which to show the fragment.
-     *
-     * @param fragmentClass Full name of the class implementing the fragment.
-     * @param args          Any desired arguments to supply to the fragment.
-     * @param titleRes      Optional resource identifier of the title of this fragment.
-     * @param userHandle    The user for which the panel has to be started.
-     */
-    public void startPreferencePanelAsUser(Fragment caller, String fragmentClass,
-            Bundle args, int titleRes, UserHandle userHandle) {
-        // This is a workaround.
-        //
-        // Calling startWithFragmentAsUser() without specifying FLAG_ACTIVITY_NEW_TASK to the intent
-        // starting the fragment could cause a native stack corruption. See b/17523189. However,
-        // adding that flag and start the preference panel with the same UserHandler will make it
-        // impossible to use back button to return to the previous screen. See b/20042570.
-        //
-        // We work around this issue by adding FLAG_ACTIVITY_NEW_TASK to the intent, while doing
-        // another check here to call startPreferencePanel() instead of startWithFragmentAsUser()
-        // when we're calling it as the same user.
-        if (userHandle.getIdentifier() == UserHandle.myUserId()) {
-            startPreferencePanel(caller, fragmentClass, args, titleRes, null /* titleText */,
-                    null, 0);
-        } else {
-            new SubSettingLauncher(this)
-                    .setDestination(fragmentClass)
-                    .setArguments(args)
-                    .setTitle(titleRes)
-                    .setIsShortCut(mIsShortcut)
-                    .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(caller))
-                    .setUserHandle(userHandle)
-                    .launch();
-        }
-    }
-
-    /**
      * Called by a preference panel fragment to finish itself.
      *
      * @param caller     The fragment that is asking to be finished.
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index f6e044e..44fc9d8 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -16,22 +16,22 @@
 
 package com.android.settings.accessibility;
 
-import android.app.Fragment;
 import android.os.Bundle;
-import android.text.TextUtils;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.Preference;
 import android.view.Menu;
 import android.view.accessibility.AccessibilityEvent;
 
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.search.actionbar.SearchMenuController;
 import com.android.settings.support.actionbar.HelpResourceProvider;
+import com.android.settingslib.core.instrumentation.Instrumentable;
 
 public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivity {
 
     private static final String SAVE_KEY_TITLE = "activity_title";
 
-    private boolean mSendExtraWindowStateChanged;
-
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
@@ -53,12 +53,6 @@
     }
 
     @Override
-    public void onResume() {
-        super.onResume();
-        mSendExtraWindowStateChanged = false;
-    }
-
-    @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         // Return true, so we get notified when items in the menu are clicked.
         return true;
@@ -76,28 +70,20 @@
     }
 
     @Override
-    public void startPreferencePanel(Fragment caller, String fragmentClass, Bundle args,
-            int titleRes, CharSequence titleText, Fragment resultTo, int resultRequestCode) {
-        // Set the title.
-        if (!TextUtils.isEmpty(titleText)) {
-            setTitle(titleText);
-        } else if (titleRes > 0) {
-            setTitle(getString(titleRes));
+    public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
+        Bundle args = pref.getExtras();
+        if (args == null) {
+            args = new Bundle();
         }
-
-        // Start the new Fragment.
         args.putInt(HelpResourceProvider.HELP_URI_RESOURCE_KEY, 0);
         args.putBoolean(SearchMenuController.NEED_SEARCH_ICON_IN_ACTION_BAR, false);
-        startPreferenceFragment(Fragment.instantiate(this, fragmentClass, args), true);
-        mSendExtraWindowStateChanged = true;
-    }
-
-    @Override
-    public void onAttachFragment(Fragment fragment) {
-        if (mSendExtraWindowStateChanged) {
-            // Clear accessibility focus and let the screen reader announce the new title.
-            getWindow().getDecorView()
-                    .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-        }
+        new SubSettingLauncher(this)
+                .setDestination(pref.getFragment())
+                .setArguments(args)
+                .setSourceMetricsCategory(caller instanceof Instrumentable
+                        ? ((Instrumentable) caller).getMetricsCategory()
+                        : Instrumentable.METRICS_CATEGORY_UNKNOWN)
+                .launch();
+        return true;
     }
 }
diff --git a/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
index 35b7c27..2f06b93 100644
--- a/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
@@ -15,17 +15,16 @@
  */
 package com.android.settings.bluetooth;
 
-import android.app.Fragment;
 import android.content.Context;
-import android.os.UserHandle;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.MasterSwitchController;
 import com.android.settings.widget.MasterSwitchPreference;
@@ -50,27 +49,22 @@
     private BluetoothEnabler mBluetoothEnabler;
     private BluetoothSummaryUpdater mSummaryUpdater;
     private RestrictionUtils mRestrictionUtils;
-    private Fragment mFragment;
-    private SettingsActivity mActivity;
-    private BluetoothFeatureProvider mBluetoothFeatureProvider;
+    private InstrumentedPreferenceFragment mFragment;
 
     public BluetoothMasterSwitchPreferenceController(Context context,
-            LocalBluetoothManager bluetoothManager, Fragment fragment, SettingsActivity activity) {
-        this(context, bluetoothManager, new RestrictionUtils(), fragment, activity);
+            LocalBluetoothManager bluetoothManager, InstrumentedPreferenceFragment fragment) {
+        this(context, bluetoothManager, new RestrictionUtils(), fragment);
     }
 
     @VisibleForTesting
     public BluetoothMasterSwitchPreferenceController(Context context,
             LocalBluetoothManager bluetoothManager, RestrictionUtils restrictionUtils,
-            Fragment fragment, SettingsActivity activity) {
+            InstrumentedPreferenceFragment fragment) {
         super(context);
         mBluetoothManager = bluetoothManager;
         mSummaryUpdater = new BluetoothSummaryUpdater(mContext, this, mBluetoothManager);
         mRestrictionUtils = restrictionUtils;
         mFragment = fragment;
-        mActivity = activity;
-        mBluetoothFeatureProvider = FeatureFactory.getFactory(
-                mContext).getBluetoothFeatureProvider(mContext);
     }
 
     @Override
@@ -87,8 +81,11 @@
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (KEY_TOGGLE_BLUETOOTH.equals(preference.getKey())) {
-            mActivity.startPreferencePanelAsUser(mFragment, BluetoothSettings.class.getName(), null,
-                    R.string.bluetooth, new UserHandle(UserHandle.myUserId()));
+            new SubSettingLauncher(mContext)
+                    .setDestination(BluetoothSettings.class.getName())
+                    .setTitle(R.string.bluetooth)
+                    .setSourceMetricsCategory(mFragment.getMetricsCategory())
+                    .launch();
             return true;
         }
         return super.handlePreferenceTreeClick(preference);
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
index 89826fe..2aaf401 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
@@ -17,13 +17,12 @@
 package com.android.settings.bluetooth;
 
 import android.content.Context;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
-import android.os.UserHandle;
 
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.R;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 
@@ -35,15 +34,12 @@
     private static final String TAG = "BluetoothPairingPrefCtrl";
 
     public static final String KEY_PAIRING = "pref_bt_pairing";
-    private PreferenceFragment mFragment;
-    private SettingsActivity mActivity;
+    private DashboardFragment mFragment;
     private Preference mPreference;
 
-    public BluetoothPairingPreferenceController(Context context, PreferenceFragment fragment,
-            SettingsActivity activity) {
+    public BluetoothPairingPreferenceController(Context context, DashboardFragment fragment) {
         super(context);
         mFragment = fragment;
-        mActivity = activity;
     }
 
     @Override
@@ -59,9 +55,12 @@
     @Override
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (KEY_PAIRING.equals(preference.getKey())) {
-            mActivity.startPreferencePanelAsUser(mFragment, BluetoothPairingDetail.class.getName(),
-                    null, R.string.bluetooth_pairing_page_title,
-                    new UserHandle(UserHandle.myUserId()));
+            new SubSettingLauncher(mContext)
+                    .setDestination(BluetoothPairingDetail.class.getName())
+                    .setTitle(R.string.bluetooth_pairing_page_title)
+                    .setSourceMetricsCategory(mFragment.getMetricsCategory())
+                    .launch();
+
             return true;
         }
 
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index 8b64878..7ec0a67 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -367,8 +367,7 @@
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         final Lifecycle lifecycle = getLifecycle();
         mDeviceNamePrefController = new BluetoothDeviceNamePreferenceController(context, lifecycle);
-        mPairingPrefController = new BluetoothPairingPreferenceController(context, this,
-                (SettingsActivity) getActivity());
+        mPairingPrefController = new BluetoothPairingPreferenceController(context, this);
         controllers.add(mDeviceNamePrefController);
         controllers.add(mPairingPrefController);
         controllers.add(new BluetoothFilesPreferenceController(context));
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentOld.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentOld.java
index 54ae8f6..a9ba6e5 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentOld.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentOld.java
@@ -23,7 +23,6 @@
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController;
 import com.android.settings.bluetooth.Utils;
 import com.android.settings.connecteddevice.usb.UsbBackend;
@@ -31,7 +30,6 @@
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.nfc.NfcPreferenceController;
-import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -85,8 +83,7 @@
         controllers.add(mUsbPrefController);
         final BluetoothMasterSwitchPreferenceController bluetoothPreferenceController =
                 new BluetoothMasterSwitchPreferenceController(
-                        context, Utils.getLocalBtManager(context), this,
-                        (SettingsActivity) getActivity());
+                        context, Utils.getLocalBtManager(context), this);
         lifecycle.addObserver(bluetoothPreferenceController);
         controllers.add(bluetoothPreferenceController);
 
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 6cf07a4..1bbb035 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -30,7 +30,6 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.support.annotation.VisibleForTesting;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 import android.text.TextUtils;
 import android.util.Log;
@@ -44,6 +43,8 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 import com.android.settings.applications.LayoutPreference;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
@@ -74,7 +75,7 @@
         LoaderManager.LoaderCallbacks<List<Anomaly>>,
         BatteryTipPreferenceController.BatteryTipListener {
 
-    public static final String TAG = "AdvancedPowerUsageDetail";
+    public static final String TAG = "AdvancedPowerDetail";
     public static final String EXTRA_UID = "extra_uid";
     public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
     public static final String EXTRA_FOREGROUND_TIME = "extra_foreground_time";
@@ -122,9 +123,9 @@
     private String mPackageName;
 
     @VisibleForTesting
-    static void startBatteryDetailPage(SettingsActivity caller, BatteryUtils batteryUtils,
-            PreferenceFragment fragment, BatteryStatsHelper helper, int which, BatteryEntry entry,
-            String usagePercent, List<Anomaly> anomalies) {
+    static void startBatteryDetailPage(Activity caller, BatteryUtils batteryUtils,
+            InstrumentedPreferenceFragment fragment, BatteryStatsHelper helper, int which,
+            BatteryEntry entry, String usagePercent, List<Anomaly> anomalies) {
         // Initialize mStats if necessary.
         helper.getStats();
 
@@ -157,9 +158,13 @@
         args.putInt(EXTRA_POWER_USAGE_AMOUNT, (int) sipper.totalPowerMah);
         args.putParcelableList(EXTRA_ANOMALY_LIST, anomalies);
 
-        caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
-                R.string.battery_details_title,
-                new UserHandle(getUserIdToLaunchAdvancePowerUsageDetail(sipper)));
+        new SubSettingLauncher(caller)
+                .setDestination(AdvancedPowerUsageDetail.class.getName())
+                .setTitle(R.string.battery_details_title)
+                .setArguments(args)
+                .setSourceMetricsCategory(fragment.getMetricsCategory())
+                .setUserHandle(new UserHandle(getUserIdToLaunchAdvancePowerUsageDetail(sipper)))
+                .launch();
     }
 
     private static @UserIdInt int getUserIdToLaunchAdvancePowerUsageDetail(BatterySipper bs) {
@@ -169,15 +174,15 @@
         return UserHandle.getUserId(bs.getUid());
     }
 
-    public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
-            BatteryStatsHelper helper, int which, BatteryEntry entry, String usagePercent,
-            List<Anomaly> anomalies) {
+    public static void startBatteryDetailPage(Activity caller,
+            InstrumentedPreferenceFragment fragment, BatteryStatsHelper helper, int which,
+            BatteryEntry entry, String usagePercent, List<Anomaly> anomalies) {
         startBatteryDetailPage(caller, BatteryUtils.getInstance(caller), fragment, helper, which,
                 entry, usagePercent, anomalies);
     }
 
-    public static void startBatteryDetailPage(SettingsActivity caller, PreferenceFragment fragment,
-            String packageName) {
+    public static void startBatteryDetailPage(Activity caller,
+            InstrumentedPreferenceFragment fragment, String packageName) {
         final Bundle args = new Bundle(3);
         final PackageManager packageManager = caller.getPackageManager();
         args.putString(EXTRA_PACKAGE_NAME, packageName);
@@ -188,8 +193,12 @@
             Log.e(TAG, "Cannot find package: " + packageName, e);
         }
 
-        caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
-                R.string.battery_details_title, new UserHandle(UserHandle.myUserId()));
+        new SubSettingLauncher(caller)
+                .setDestination(AdvancedPowerUsageDetail.class.getName())
+                .setTitle(R.string.battery_details_title)
+                .setArguments(args)
+                .setSourceMetricsCategory(fragment.getMetricsCategory())
+                .launch();
     }
 
     @Override
@@ -210,7 +219,7 @@
 
         mPackageName = getArguments().getString(EXTRA_PACKAGE_NAME);
         mAnomalySummaryPreferenceController = new AnomalySummaryPreferenceController(
-                (SettingsActivity) getActivity(), this, MetricsEvent.FUELGAUGE_POWER_USAGE_DETAIL);
+                (SettingsActivity) getActivity(), this);
         mForegroundPreference = findPreference(KEY_PREF_FOREGROUND);
         mBackgroundPreference = findPreference(KEY_PREF_BACKGROUND);
         mPowerUsagePreference = findPreference(KEY_PREF_POWER_USAGE);
diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
index 2f93d0a..3ba5ee4 100644
--- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java
@@ -27,7 +27,6 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.support.annotation.VisibleForTesting;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
 import android.support.v7.preference.PreferenceScreen;
@@ -45,6 +44,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.FeatureFlags;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -52,8 +52,8 @@
 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.utils.StringUtil;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -77,7 +77,7 @@
     BatteryUtils mBatteryUtils;
     private UserManager mUserManager;
     private SettingsActivity mActivity;
-    private PreferenceFragment mFragment;
+    private InstrumentedPreferenceFragment mFragment;
     private Context mPrefContext;
     SparseArray<List<Anomaly>> mAnomalySparseArray;
 
@@ -112,7 +112,8 @@
     };
 
     public BatteryAppListPreferenceController(Context context, String preferenceKey,
-            Lifecycle lifecycle, SettingsActivity activity, PreferenceFragment fragment) {
+            Lifecycle lifecycle, SettingsActivity activity,
+            InstrumentedPreferenceFragment fragment) {
         super(context);
 
         if (lifecycle != null) {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java b/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
index c7972e2..2e771bd 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
@@ -21,7 +21,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.UserHandle;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
 import android.util.IconDrawableFactory;
@@ -31,6 +30,8 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
@@ -63,12 +64,16 @@
     IconDrawableFactory mIconDrawableFactory;
 
     public static void startBatteryAbnormalPage(SettingsActivity caller,
-            PreferenceFragment fragment, List<Anomaly> anomalies) {
+            InstrumentedPreferenceFragment fragment, List<Anomaly> anomalies) {
         Bundle args = new Bundle();
         args.putParcelableList(EXTRA_ANOMALY_LIST, anomalies);
 
-        caller.startPreferencePanelAsUser(fragment, PowerUsageAnomalyDetails.class.getName(), args,
-                R.string.battery_abnormal_details_title, new UserHandle(UserHandle.myUserId()));
+        new SubSettingLauncher(caller)
+                .setDestination(PowerUsageAnomalyDetails.class.getName())
+                .setTitle(R.string.battery_abnormal_details_title)
+                .setArguments(args)
+                .setSourceMetricsCategory(fragment.getMetricsCategory())
+                .launch();
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
index 4fe193f..a95320b 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummaryLegacy.java
@@ -243,7 +243,7 @@
                 KEY_TIME_SINCE_LAST_FULL_CHARGE);
         mFooterPreferenceMixin.createFooterPreference().setTitle(R.string.battery_footer_summary);
         mAnomalySummaryPreferenceController = new AnomalySummaryPreferenceController(
-                (SettingsActivity) getActivity(), this, MetricsEvent.FUELGAUGE_POWER_USAGE_SUMMARY);
+                (SettingsActivity) getActivity(), this);
         mBatteryUtils = BatteryUtils.getInstance(getContext());
         mAnomalySparseArray = new SparseArray<>();
 
diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
index 0a40f1e..92ecd4b 100644
--- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java
@@ -20,13 +20,12 @@
 import android.app.AppOpsManager;
 import android.content.Context;
 import android.support.annotation.VisibleForTesting;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
-import com.android.settings.applications.LayoutPreference;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 
 import java.util.List;
 
@@ -40,7 +39,7 @@
     private AppOpsManager mAppOpsManager;
     private List<AppOpsManager.PackageOps> mPackageOps;
     private SettingsActivity mSettingsActivity;
-    private PreferenceFragment mPreferenceFragment;
+    private InstrumentedPreferenceFragment mPreferenceFragment;
 
     public RestrictAppPreferenceController(Context context) {
         super(context, KEY_RESTRICT_APP);
@@ -48,7 +47,7 @@
     }
 
     public RestrictAppPreferenceController(SettingsActivity settingsActivity,
-            PreferenceFragment preferenceFragment) {
+            InstrumentedPreferenceFragment preferenceFragment) {
         this(settingsActivity.getApplicationContext());
         mSettingsActivity = settingsActivity;
         mPreferenceFragment = preferenceFragment;
diff --git a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
index 3045261..26386b6 100644
--- a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
+++ b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
@@ -22,7 +22,6 @@
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.os.UserHandle;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.CheckBoxPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceGroup;
@@ -33,6 +32,8 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.widget.AppCheckBoxPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -61,13 +62,16 @@
     PackageManager mPackageManager;
 
     public static void startRestrictedAppDetails(SettingsActivity caller,
-            PreferenceFragment fragment, List<AppOpsManager.PackageOps> packageOpsList) {
-        Bundle args = new Bundle();
+            InstrumentedPreferenceFragment fragment, List<AppOpsManager.PackageOps> packageOpsList) {
+        final Bundle args = new Bundle();
         args.putParcelableList(EXTRA_PACKAGE_OPS_LIST, packageOpsList);
 
-        caller.startPreferencePanelAsUser(fragment, RestrictedAppDetails.class.getName(), args,
-                R.string.restricted_app_title,
-                new UserHandle(UserHandle.myUserId()));
+        new SubSettingLauncher(caller)
+                .setDestination(RestrictedAppDetails.class.getName())
+                .setArguments(args)
+                .setTitle(R.string.restricted_app_title)
+                .setSourceMetricsCategory(fragment.getMetricsCategory())
+                .launch();
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/SmartBatterySettings.java b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
index 52c0cef..6aeb8a3 100644
--- a/src/com/android/settings/fuelgauge/SmartBatterySettings.java
+++ b/src/com/android/settings/fuelgauge/SmartBatterySettings.java
@@ -19,11 +19,11 @@
 import android.content.Context;
 import android.os.Bundle;
 import android.provider.SearchIndexableResource;
-import android.support.v14.preference.PreferenceFragment;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
@@ -69,7 +69,8 @@
     }
 
     private static List<AbstractPreferenceController> buildPreferenceControllers(
-            Context context, SettingsActivity settingsActivity, PreferenceFragment fragment) {
+            Context context, SettingsActivity settingsActivity,
+            InstrumentedPreferenceFragment fragment) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>();
         controllers.add(new SmartBatteryPreferenceController(context));
         if (settingsActivity != null && fragment != null) {
diff --git a/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java b/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
index 6bfc9ff..a3eefa5 100644
--- a/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceController.java
@@ -18,11 +18,11 @@
 
 import android.content.Context;
 import android.support.annotation.VisibleForTesting;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.fuelgauge.PowerUsageAnomalyDetails;
 
@@ -37,7 +37,7 @@
     public static final String ANOMALY_KEY = "high_usage";
 
     private static final int REQUEST_ANOMALY_ACTION = 0;
-    private PreferenceFragment mFragment;
+    private InstrumentedPreferenceFragment mFragment;
     @VisibleForTesting
     Preference mAnomalyPreference;
     @VisibleForTesting
@@ -54,11 +54,11 @@
     private int mMetricsKey;
 
     public AnomalySummaryPreferenceController(SettingsActivity activity,
-            PreferenceFragment fragment, int metricsKey) {
+            InstrumentedPreferenceFragment fragment) {
         mFragment = fragment;
         mSettingsActivity = activity;
         mAnomalyPreference = mFragment.getPreferenceScreen().findPreference(ANOMALY_KEY);
-        mMetricsKey = metricsKey;
+        mMetricsKey = fragment.getMetricsCategory();
         mBatteryUtils = BatteryUtils.getInstance(activity.getApplicationContext());
         hideHighUsagePreference();
     }
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
index 58a95ac..750ece9 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
@@ -17,11 +17,12 @@
 package com.android.settings.fuelgauge.batterytip.actions;
 
 import android.app.Fragment;
-import android.os.UserHandle;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.fuelgauge.SmartBatterySettings;
+import com.android.settingslib.core.instrumentation.Instrumentable;
 
 public class SmartBatteryAction extends BatteryTipAction {
     private SettingsActivity mSettingsActivity;
@@ -38,9 +39,13 @@
      */
     @Override
     public void handlePositiveAction() {
-        mSettingsActivity.startPreferencePanelAsUser(mFragment,
-                SmartBatterySettings.class.getName(), null /* args */,
-                R.string.smart_battery_manager_title,
-                new UserHandle(UserHandle.myUserId()));
+        new SubSettingLauncher(mSettingsActivity)
+                .setSourceMetricsCategory(mFragment instanceof Instrumentable
+                        ? ((Instrumentable) mFragment).getMetricsCategory()
+                        : Instrumentable.METRICS_CATEGORY_UNKNOWN)
+                .setDestination(SmartBatterySettings.class.getName())
+                .setTitle(R.string.smart_battery_manager_title)
+                .launch();
+
     }
 }
diff --git a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
index afcdb64..8238a9b 100644
--- a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
@@ -22,8 +22,8 @@
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.widget.AppPreference;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.location.RecentLocationApps;
@@ -57,10 +57,14 @@
             // start new fragment to display extended information
             final Bundle args = new Bundle();
             args.putString(AppInfoDashboardFragment.ARG_PACKAGE_NAME, mPackage);
-            ((SettingsActivity) mFragment.getActivity()).startPreferencePanelAsUser(
-                mFragment,
-                AppInfoDashboardFragment.class.getName(), args,
-                R.string.application_info_label, mUserHandle);
+
+            new SubSettingLauncher(mFragment.getContext())
+                    .setDestination(AppInfoDashboardFragment.class.getName())
+                    .setArguments(args)
+                    .setTitle(R.string.application_info_label)
+                    .setUserHandle(mUserHandle)
+                    .setSourceMetricsCategory(mFragment.getMetricsCategory())
+                    .launch();
             return true;
         }
     }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
index 70d4298..8048c0f 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceControllerTest.java
@@ -22,13 +22,12 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.Fragment;
 import android.content.Context;
 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 import android.support.v7.preference.PreferenceScreen;
 
-import com.android.settings.SettingsActivity;
 import com.android.settings.TestConfig;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.widget.MasterSwitchPreference;
@@ -57,9 +56,7 @@
     @Mock
     private RestrictionUtils mRestrictionUtils;
     @Mock
-    private Fragment mFragment;
-    @Mock
-    private SettingsActivity mActivity;
+    private InstrumentedPreferenceFragment mFragment;
 
     private Context mContext;
     private BluetoothMasterSwitchPreferenceController mController;
@@ -72,7 +69,7 @@
         mFeatureFactory = FakeFeatureFactory.setupForTest();
 
         mController = new BluetoothMasterSwitchPreferenceController(
-                mContext, mBluetoothManager, mRestrictionUtils, mFragment, mActivity);
+                mContext, mBluetoothManager, mRestrictionUtils, mFragment);
         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
         when(mPreference.getKey()).thenReturn(mController.getPreferenceKey());
     }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingPreferenceControllerTest.java
index 61987bf..172d009 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingPreferenceControllerTest.java
@@ -17,27 +17,20 @@
 package com.android.settings.bluetooth;
 
 import static com.google.common.truth.Truth.assertThat;
-
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
 import android.content.Context;
-import android.support.v14.preference.PreferenceFragment;
+import android.content.Intent;
 import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
 
-import com.android.settings.SettingsActivity;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.TestConfig;
 import com.android.settings.R;
-import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
-import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settings.TestConfig;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -52,21 +45,11 @@
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
 public class BluetoothPairingPreferenceControllerTest {
     private static final int ORDER = 1;
-    private Context mContext;
+
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private PreferenceFragment mFragment;
-    @Mock
-    private Lifecycle mLifecycle;
-    @Mock
-    private LocalBluetoothAdapter mLocalAdapter;
-    @Mock
-    private FragmentManager mFragmentManager;
-    @Mock
-    private FragmentTransaction mFragmentTransaction;
-    @Mock
-    private PreferenceScreen mPreferenceScreen;
-    @Mock
-    private SettingsActivity mSettingsActivity;
+    private DashboardFragment mFragment;
+
+    private Context mContext;
     private Preference mPreference;
 
     private BluetoothPairingPreferenceController mController;
@@ -75,14 +58,13 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mContext = RuntimeEnvironment.application;
+        mContext = spy(RuntimeEnvironment.application);
         when(mFragment.getPreferenceScreen().getContext()).thenReturn(mContext);
 
         mPreference = new Preference(mContext);
         mPreference.setKey(BluetoothPairingPreferenceController.KEY_PAIRING);
 
-        mController = new BluetoothPairingPreferenceController(mContext, mFragment,
-                mSettingsActivity);
+        mController = new BluetoothPairingPreferenceController(mContext, mFragment);
     }
 
     @Test
@@ -98,9 +80,10 @@
 
     @Test
     public void testHandlePreferenceTreeClick_startFragment() {
+        doNothing().when(mContext).startActivity(any(Intent.class));
+
         mController.handlePreferenceTreeClick(mPreference);
 
-        verify(mSettingsActivity).startPreferencePanelAsUser(eq(mFragment), anyString(), any(),
-                anyInt(), any());
+        verify(mContext).startActivity(any(Intent.class));
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index a188ce11..506e394 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Matchers.any;
@@ -30,9 +31,9 @@
 
 import android.app.Activity;
 import android.app.AppOpsManager;
-import android.app.Fragment;
 import android.app.LoaderManager;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
@@ -196,21 +197,22 @@
 
         mTestActivity = spy(new SettingsActivity());
         doReturn(mPackageManager).when(mTestActivity).getPackageManager();
+        doReturn(mPackageManager).when(mActivity).getPackageManager();
         doReturn(mAppOpsManager).when(mTestActivity).getSystemService(Context.APP_OPS_SERVICE);
 
         mBatteryUtils = spy(new BatteryUtils(mContext));
         doReturn(FOREGROUND_SERVICE_TIME_US).when(mBatteryUtils).getForegroundServiceTotalTimeUs(
                 any(BatteryStats.Uid.class), anyLong());
 
-        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
+        final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
 
         Answer<Void> callable = invocation -> {
-            mBundle = captor.getValue();
+            mBundle = captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
             return null;
         };
-        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(
-                nullable(Fragment.class), nullable(String.class), captor.capture(), anyInt(),
+        doAnswer(callable).when(mActivity).startActivityAsUser(captor.capture(),
                 nullable(UserHandle.class));
+        doAnswer(callable).when(mActivity).startActivity(captor.capture());
 
         mForegroundPreference = new Preference(mContext);
         mBackgroundPreference = new Preference(mContext);
@@ -276,7 +278,7 @@
 
     @Test
     public void testStartBatteryDetailPage_hasBasicData() {
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
                 mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, mAnomalies);
 
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
@@ -295,7 +297,7 @@
         mBatterySipper.drainType = BatterySipper.DrainType.PHONE;
         mBatterySipper.usageTimeMs = PHONE_FOREGROUND_TIME_MS;
 
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
                 mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
 
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
@@ -313,7 +315,7 @@
     public void testStartBatteryDetailPage_NormalApp() {
         mBatterySipper.mPackages = PACKAGE_NAME;
         mBatteryEntry.defaultPackageName = PACKAGE_NAME[0];
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
                 mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, mAnomalies);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
@@ -325,7 +327,7 @@
     @Test
     public void testStartBatteryDetailPage_SystemApp() {
         mBatterySipper.mPackages = null;
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
                 mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_LABEL)).isEqualTo(APP_LABEL);
@@ -340,12 +342,11 @@
         final int appUid = 1010019;
         mBatterySipper.mPackages = PACKAGE_NAME;
         doReturn(appUid).when(mBatterySipper).getUid();
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
                 mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
 
-        verify(mTestActivity).startPreferencePanelAsUser(
-                nullable(Fragment.class), nullable(String.class), nullable(Bundle.class), anyInt(),
-                eq(new UserHandle(10)));
+
+        verify(mActivity).startActivityAsUser(any(Intent.class), eq(new UserHandle(10)));
     }
 
     @Test
@@ -355,32 +356,27 @@
 
         final int currentUser = 20;
         ShadowActivityManager.setCurrentUser(currentUser);
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
                 mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
 
-
-        verify(mTestActivity).startPreferencePanelAsUser(
-                nullable(Fragment.class), nullable(String.class), nullable(Bundle.class), anyInt(),
-                eq(new UserHandle(currentUser)));
+        verify(mActivity).startActivityAsUser(any(Intent.class), eq(new UserHandle(currentUser)));
     }
 
     @Test
     public void testStartBatteryDetailPage_noBatteryUsage_hasBasicData() {
-        final ArgumentCaptor<Bundle> captor = ArgumentCaptor.forClass(Bundle.class);
-        Answer<Void> callable = invocation -> {
-            mBundle = captor.getValue();
-            return null;
-        };
-        doAnswer(callable).when(mTestActivity).startPreferencePanelAsUser(nullable(Fragment.class),
-                nullable(String.class), captor.capture(), anyInt(),
-                nullable(UserHandle.class));
+        final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
 
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]);
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, PACKAGE_NAME[0]);
 
-        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
-                PACKAGE_NAME[0]);
-        assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT)).isEqualTo(
-                "0%");
+        verify(mActivity).startActivity(captor.capture());
+
+        assertThat(captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
+                .getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME))
+                .isEqualTo(PACKAGE_NAME[0]);
+
+        assertThat(captor.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
+                .getString(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_PERCENT))
+                .isEqualTo("0%");
     }
 
     @Test
@@ -388,7 +384,7 @@
             PackageManager.NameNotFoundException {
         doReturn(UID).when(mPackageManager).getPackageUid(PACKAGE_NAME[0], 0 /* no flag */);
 
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, null, PACKAGE_NAME[0]);
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment, PACKAGE_NAME[0]);
 
         assertThat(mBundle.getInt(AdvancedPowerUsageDetail.EXTRA_UID)).isEqualTo(UID);
     }
@@ -398,7 +394,7 @@
         mBatteryEntry.defaultPackageName = null;
         mBatteryEntry.sipper.mPackages = PACKAGE_NAME;
 
-        AdvancedPowerUsageDetail.startBatteryDetailPage(mTestActivity, mBatteryUtils, null,
+        AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mBatteryUtils, mFragment,
                 mBatteryStatsHelper, 0, mBatteryEntry, USAGE_PERCENT, null);
 
         assertThat(mBundle.getString(AdvancedPowerUsageDetail.EXTRA_PACKAGE_NAME)).isEqualTo(
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
index cee84de..cf38432 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java
@@ -17,13 +17,11 @@
 package com.android.settings.fuelgauge;
 
 import static com.google.common.truth.Truth.assertThat;
-
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.PreferenceGroup;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
@@ -36,6 +34,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.TestConfig;
 import com.android.settings.core.FeatureFlags;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
@@ -66,7 +65,7 @@
     @Mock
     private PreferenceGroup mAppListGroup;
     @Mock
-    private PreferenceFragment mFragment;
+    private InstrumentedPreferenceFragment mFragment;
     @Mock
     private BatteryUtils mBatteryUtils;
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetailsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetailsTest.java
index 37b279e..693117e 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetailsTest.java
@@ -16,20 +16,19 @@
 
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
 import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 
 import android.content.Context;
-import android.content.pm.ApplicationInfo;
+import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
-import android.os.Bundle;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceCategory;
 import android.support.v7.preference.PreferenceGroup;
@@ -79,12 +78,9 @@
     private PackageManager mPackageManager;
     @Mock
     private IconDrawableFactory mIconDrawableFactory;
-    @Mock
-    private ApplicationInfo mApplicationInfo;
     private Context mContext;
     private PowerUsageAnomalyDetails mFragment;
     private PreferenceGroup mAbnormalListGroup;
-    private Bundle mBundle;
     private List<Anomaly> mAnomalyList;
 
     @Before
@@ -176,21 +172,14 @@
 
     @Test
     public void testStartBatteryAbnormalPage_dataCorrect() {
-        final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
-        Answer<Void> bundleCallable = new Answer<Void>() {
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Exception {
-                mBundle = bundleCaptor.getValue();
-                return null;
-            }
-        };
-        doAnswer(bundleCallable).when(mSettingsActivity).startPreferencePanelAsUser(any(),
-                anyString(), bundleCaptor.capture(), anyInt(), any());
+        final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
 
         PowerUsageAnomalyDetails.startBatteryAbnormalPage(mSettingsActivity, mFragment,
                 mAnomalyList);
 
-        assertThat(mBundle.getParcelableArrayList(
-                PowerUsageAnomalyDetails.EXTRA_ANOMALY_LIST)).isEqualTo(mAnomalyList);
+        verify(mSettingsActivity).startActivity(intent.capture());
+        assertThat(intent.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
+                .getParcelableArrayList(PowerUsageAnomalyDetails.EXTRA_ANOMALY_LIST))
+                .isEqualTo(mAnomalyList);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
index fbcedb7..4503736 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java
@@ -16,25 +16,28 @@
 
 package com.android.settings.fuelgauge;
 
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT;
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
 import android.app.AppOpsManager;
 import android.content.Context;
-import android.support.v14.preference.PreferenceFragment;
+import android.content.Intent;
 import android.support.v7.preference.Preference;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.TestConfig;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
@@ -55,7 +58,7 @@
     @Mock
     private SettingsActivity mSettingsActivity;
     @Mock
-    private PreferenceFragment mFragment;
+    private InstrumentedPreferenceFragment mFragment;
     private List<AppOpsManager.PackageOps> mPackageOpsList;
     private RestrictAppPreferenceController mRestrictAppPreferenceController;
     private Preference mPreference;
@@ -107,11 +110,15 @@
 
     @Test
     public void testHandlePreferenceTreeClick_startFragment() {
+        final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+
         mRestrictAppPreferenceController.handlePreferenceTreeClick(mPreference);
 
-        verify(mSettingsActivity).startPreferencePanelAsUser(eq(mFragment),
-                eq(RestrictedAppDetails.class.getName()), any(), eq(R.string.restricted_app_title),
-                any());
+        verify(mSettingsActivity).startActivity(intent.capture());
+        assertThat(intent.getValue().getStringExtra(EXTRA_SHOW_FRAGMENT))
+                .isEqualTo(RestrictedAppDetails.class.getName());
+        assertThat(intent.getValue().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, -1))
+                .isEqualTo(R.string.restricted_app_title);
     }
 
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
index d1d540d..f5c16b4 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/anomaly/AnomalySummaryPreferenceControllerTest.java
@@ -17,24 +17,21 @@
 package com.android.settings.fuelgauge.anomaly;
 
 import static com.google.common.truth.Truth.assertThat;
-
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-import static org.robolectric.Shadows.shadowOf;
 
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.content.Context;
-import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 
 import com.android.settings.SettingsActivity;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.core.InstrumentedPreferenceFragment;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -57,7 +54,7 @@
     private static final int UID = 111;
 
     @Mock
-    private PreferenceFragment mFragment;
+    private InstrumentedPreferenceFragment mFragment;
     @Mock
     private FragmentManager mFragmentManager;
     @Mock
@@ -89,7 +86,7 @@
         mAnomalyList = new ArrayList<>();
 
         mAnomalySummaryPreferenceController = new AnomalySummaryPreferenceController(
-                mSettingsActivity, mFragment, 0 /* metricskey */);
+                mSettingsActivity, mFragment);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java
index a3c69c5..a339451 100644
--- a/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/location/RecentLocationRequestPreferenceControllerTest.java
@@ -15,8 +15,9 @@
  */
 package com.android.settings.location;
 
+import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT;
+import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
@@ -27,7 +28,7 @@
 
 import android.arch.lifecycle.LifecycleOwner;
 import android.content.Context;
-import android.os.Bundle;
+import android.content.Intent;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceCategory;
@@ -35,7 +36,6 @@
 import android.text.TextUtils;
 
 import com.android.settings.R;
-import com.android.settings.SettingsActivity;
 import com.android.settings.TestConfig;
 import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -47,6 +47,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.ArgumentMatcher;
 import org.mockito.InOrder;
 import org.mockito.Mock;
@@ -163,8 +164,9 @@
 
     @Test
     public void onPreferenceClick_shouldLaunchAppDetails() {
-        final SettingsActivity activity = mock(SettingsActivity.class);
-        when(mFragment.getActivity()).thenReturn(activity);
+        final Context context= mock(Context.class);
+        when(mFragment.getContext()).thenReturn(context);
+
         final List<RecentLocationApps.Request> requests = new ArrayList<>();
         final Request request = mock(Request.class);
         requests.add(request);
@@ -174,11 +176,14 @@
         mController.displayPreference(mScreen);
         mController.updateState(mCategory);
 
+        final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
+
         preference.performClick();
 
-        verify(activity).startPreferencePanelAsUser(any(),
-            eq(AppInfoDashboardFragment.class.getName()),
-            any(Bundle.class), anyInt(), any());
+        verify(context).startActivity(intent.capture());
+
+        assertThat(intent.getValue().getStringExtra(EXTRA_SHOW_FRAGMENT))
+                .isEqualTo(AppInfoDashboardFragment.class.getName());
     }
 
     private static ArgumentMatcher<Preference> titleMatches(String expected) {