Migrate more subsetting launching to SubSettingLauncher

Bug: 73250851
Test: robotests
Change-Id: Ic0bf23f6ac6f717bdd3d477fdb84af68badae8e6
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 76b48d1..84b1071 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -59,6 +59,7 @@
 import com.android.settings.applications.manageapplications.ManageApplications;
 import com.android.settings.backup.BackupSettingsActivity;
 import com.android.settings.core.FeatureFlags;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.DashboardSummary;
@@ -612,11 +613,10 @@
      * @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 userHandle    The user for which the panel has to be started.
      */
     public void startPreferencePanelAsUser(Fragment caller, String fragmentClass,
-            Bundle args, int titleRes, CharSequence titleText, UserHandle userHandle) {
+            Bundle args, int titleRes, UserHandle userHandle) {
         // This is a workaround.
         //
         // Calling startWithFragmentAsUser() without specifying FLAG_ACTIVITY_NEW_TASK to the intent
@@ -628,19 +628,17 @@
         // 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, titleText, null, 0);
+            startPreferencePanel(caller, fragmentClass, args, titleRes, null /* titleText */,
+                    null, 0);
         } else {
-            String title = null;
-            if (titleRes < 0) {
-                if (titleText != null) {
-                    title = titleText.toString();
-                } else {
-                    // There not much we can do in that case
-                    title = "";
-                }
-            }
-            Utils.startWithFragmentAsUser(this, fragmentClass, args, titleRes, title,
-                    mIsShortcut, mMetricsFeatureProvider.getMetricsCategory(caller), userHandle);
+            new SubSettingLauncher(this)
+                    .setDestination(fragmentClass)
+                    .setArguments(args)
+                    .setTitle(titleRes)
+                    .setIsShortCut(mIsShortcut)
+                    .setSourceMetricsCategory(mMetricsFeatureProvider.getMetricsCategory(caller))
+                    .setUserHandle(userHandle)
+                    .launch();
         }
     }
 
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index a989c34..7b3f73e 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -481,22 +481,6 @@
         }
     }
 
-    public static void startWithFragmentAsUser(Context context, String fragmentName, Bundle args,
-            int titleResId, CharSequence title, boolean isShortcut, int metricsCategory,
-            UserHandle userHandle) {
-        // workaround to avoid crash in b/17523189
-        if (userHandle.getIdentifier() == UserHandle.myUserId()) {
-            startWithFragment(context, fragmentName, args, null, 0, titleResId, title, isShortcut,
-                    metricsCategory);
-        } else {
-            Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
-                    null /* titleResPackageName */, titleResId, title, isShortcut, metricsCategory);
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
-            context.startActivityAsUser(intent, userHandle);
-        }
-    }
-
     /**
      * Build an Intent to launch a new activity showing the selected fragment.
      * The implementation constructs an Intent that re-launches the current activity with the
diff --git a/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java b/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
index 331907b..35b7c27 100644
--- a/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothMasterSwitchPreferenceController.java
@@ -88,7 +88,7 @@
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (KEY_TOGGLE_BLUETOOTH.equals(preference.getKey())) {
             mActivity.startPreferencePanelAsUser(mFragment, BluetoothSettings.class.getName(), null,
-                    R.string.bluetooth, null, new UserHandle(UserHandle.myUserId()));
+                    R.string.bluetooth, new UserHandle(UserHandle.myUserId()));
             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 8ac64e8..89826fe 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingPreferenceController.java
@@ -60,7 +60,7 @@
     public boolean handlePreferenceTreeClick(Preference preference) {
         if (KEY_PAIRING.equals(preference.getKey())) {
             mActivity.startPreferencePanelAsUser(mFragment, BluetoothPairingDetail.class.getName(),
-                    null, R.string.bluetooth_pairing_page_title, null,
+                    null, R.string.bluetooth_pairing_page_title,
                     new UserHandle(UserHandle.myUserId()));
             return true;
         }
diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java
index a787972..8e0f859 100644
--- a/src/com/android/settings/core/SubSettingLauncher.java
+++ b/src/com/android/settings/core/SubSettingLauncher.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
 
 import com.android.settings.SettingsActivity;
 import com.android.settings.SubSettings;
@@ -102,8 +103,17 @@
         mLaunched = true;
         final Intent intent = new Intent(Intent.ACTION_MAIN);
         intent.setClass(mContext, SubSettings.class);
-
+        if (TextUtils.isEmpty(mLaunchRequest.destinationName)) {
+            throw new IllegalArgumentException("Destination fragment must be set");
+        }
         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, mLaunchRequest.destinationName);
+
+        if (mLaunchRequest.sourceMetricsCategory <= 0) {
+            throw new IllegalArgumentException("Source metrics category must be set");
+        }
+        intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
+                mLaunchRequest.sourceMetricsCategory);
+
         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, mLaunchRequest.arguments);
         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME,
                 mLaunchRequest.titleResPackageName);
@@ -112,8 +122,6 @@
         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.title);
         intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT,
                 mLaunchRequest.isShortCut);
-        intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
-                mLaunchRequest.sourceMetricsCategory);
         intent.addFlags(mLaunchRequest.flags);
 
         if (mLaunchRequest.userHandle != null
@@ -150,7 +158,7 @@
         String titleResPackageName;
         CharSequence title;
         boolean isShortCut;
-        int sourceMetricsCategory;
+        int sourceMetricsCategory = -100;
         int flags;
         Fragment mResultListener;
         int mRequestCode;
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index 981b0dc..6cf07a4 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -45,20 +45,20 @@
 import com.android.settings.Utils;
 import com.android.settings.applications.LayoutPreference;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
-import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
-import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 import com.android.settings.fuelgauge.anomaly.Anomaly;
 import com.android.settings.fuelgauge.anomaly.AnomalyDialogFragment;
 import com.android.settings.fuelgauge.anomaly.AnomalyLoader;
 import com.android.settings.fuelgauge.anomaly.AnomalySummaryPreferenceController;
+import com.android.settings.fuelgauge.anomaly.AnomalyUtils;
+import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
+import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.widget.EntityHeaderController;
+import com.android.settings.wrapper.DevicePolicyManagerWrapper;
 import com.android.settingslib.applications.AppUtils;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.AbstractPreferenceController;
-
 import com.android.settingslib.utils.StringUtil;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -158,7 +158,7 @@
         args.putParcelableList(EXTRA_ANOMALY_LIST, anomalies);
 
         caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
-                R.string.battery_details_title, null,
+                R.string.battery_details_title,
                 new UserHandle(getUserIdToLaunchAdvancePowerUsageDetail(sipper)));
     }
 
@@ -189,7 +189,7 @@
         }
 
         caller.startPreferencePanelAsUser(fragment, AdvancedPowerUsageDetail.class.getName(), args,
-                R.string.battery_details_title, null, new UserHandle(UserHandle.myUserId()));
+                R.string.battery_details_title, new UserHandle(UserHandle.myUserId()));
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java b/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
index 143733d..c7972e2 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageAnomalyDetails.java
@@ -17,7 +17,6 @@
 package com.android.settings.fuelgauge;
 
 import android.content.Context;
-import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
@@ -69,8 +68,7 @@
         args.putParcelableList(EXTRA_ANOMALY_LIST, anomalies);
 
         caller.startPreferencePanelAsUser(fragment, PowerUsageAnomalyDetails.class.getName(), args,
-                R.string.battery_abnormal_details_title, null,
-                new UserHandle(UserHandle.myUserId()));
+                R.string.battery_abnormal_details_title, new UserHandle(UserHandle.myUserId()));
     }
 
     @Override
diff --git a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
index e09a8a3..3045261 100644
--- a/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
+++ b/src/com/android/settings/fuelgauge/RestrictedAppDetails.java
@@ -66,7 +66,7 @@
         args.putParcelableList(EXTRA_PACKAGE_OPS_LIST, packageOpsList);
 
         caller.startPreferencePanelAsUser(fragment, RestrictedAppDetails.class.getName(), args,
-                R.string.restricted_app_title, null /* titleText */,
+                R.string.restricted_app_title,
                 new UserHandle(UserHandle.myUserId()));
     }
 
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
index cbd1581..58a95ac 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/SmartBatteryAction.java
@@ -18,12 +18,10 @@
 
 import android.app.Fragment;
 import android.os.UserHandle;
-import android.support.v14.preference.PreferenceFragment;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.fuelgauge.SmartBatterySettings;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 public class SmartBatteryAction extends BatteryTipAction {
     private SettingsActivity mSettingsActivity;
@@ -42,7 +40,7 @@
     public void handlePositiveAction() {
         mSettingsActivity.startPreferencePanelAsUser(mFragment,
                 SmartBatterySettings.class.getName(), null /* args */,
-                R.string.smart_battery_manager_title, null /* titleText */,
+                R.string.smart_battery_manager_title,
                 new UserHandle(UserHandle.myUserId()));
     }
 }
diff --git a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
index b17d19e..afcdb64 100644
--- a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java
@@ -60,7 +60,7 @@
             ((SettingsActivity) mFragment.getActivity()).startPreferencePanelAsUser(
                 mFragment,
                 AppInfoDashboardFragment.class.getName(), args,
-                R.string.application_info_label, null, mUserHandle);
+                R.string.application_info_label, mUserHandle);
             return true;
         }
     }
diff --git a/src/com/android/settings/vpn2/AppManagementFragment.java b/src/com/android/settings/vpn2/AppManagementFragment.java
index 9e215d1..b554c83 100644
--- a/src/com/android/settings/vpn2/AppManagementFragment.java
+++ b/src/com/android/settings/vpn2/AppManagementFragment.java
@@ -44,7 +44,7 @@
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.RestrictedSwitchPreference;
@@ -100,10 +100,15 @@
     };
 
     public static void show(Context context, AppPreference pref, int sourceMetricsCategory) {
-        Bundle args = new Bundle();
+        final Bundle args = new Bundle();
         args.putString(ARG_PACKAGE_NAME, pref.getPackageName());
-        Utils.startWithFragmentAsUser(context, AppManagementFragment.class.getName(), args, -1,
-                pref.getLabel(), false, sourceMetricsCategory, new UserHandle(pref.getUserId()));
+        new SubSettingLauncher(context)
+                .setDestination(AppManagementFragment.class.getName())
+                .setArguments(args)
+                .setTitle(pref.getLabel())
+                .setSourceMetricsCategory(sourceMetricsCategory)
+                .setUserHandle(new UserHandle(pref.getUserId()))
+                .launch();
     }
 
     @Override