Merge "Update "Mobile network standby" attribute label into "Mobile network"" into sc-v2-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7ed69e5..bb72e95 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -233,7 +233,8 @@
         <activity android:name=".network.telephony.MobileNetworkActivity"
                   android:label="@string/network_settings_title"
                   android:exported="true"
-                  android:launchMode="singleTask">
+                  android:launchMode="singleTask"
+                  android:configChanges="orientation|screenSize|keyboardHidden">
             <intent-filter android:priority="1">
                 <!-- Displays the MobileNetworkActivity and opt-in dialog for capability discovery. -->
                 <action android:name="android.telephony.ims.action.SHOW_CAPABILITY_DISCOVERY_OPT_IN" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3a38499..2642b32 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1921,9 +1921,6 @@
     <!-- Bluetooth device details companion apps. The body of confirmation dialog for remove association. [CHAR LIMIT=60] -->
     <string name="bluetooth_companion_app_body"><xliff:g id="app_name" example="App Name">%1$s</xliff:g> app will no longer connect to your <xliff:g id="device_name" example="Device Name">%2$s</xliff:g></string>
 
-    <!--  Bluetooth device details. The body of a confirmation dialog for unpairing a paired device. [CHAR LIMIT=NONE] -->
-    <string name="bluetooth_untethered_unpair_dialog_body"><xliff:g id="device_name" example="Jack's headphone">%1$s</xliff:g> will no longer be paired with any device linked to this account</string>
-
     <!--  Bluetooth device details. In the confirmation dialog for unpairing a paired device, this is the label on the button that will complete the unpairing action. -->
     <string name="bluetooth_unpair_dialog_forget_confirm_button">Forget device</string>
     <!-- Bluetooth device details companion apps. In the confirmation dialog for removing an associated app, this is the label on the button that will complete the disassociate action. [CHAR LIMIT=80] -->
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index df30d8b..9c81895 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -255,7 +255,8 @@
         // Should happen before any call to getIntent()
         getMetaData();
         final Intent intent = getIntent();
-        if (launchHomepageForTwoPaneDeepLink(intent)) {
+        if (shouldShowTwoPaneDeepLink(intent)) {
+            launchHomepageForTwoPaneDeepLink(intent);
             finishAndRemoveTask();
             return;
         }
@@ -368,16 +369,13 @@
             intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
     }
 
-    /** Returns true if the Activity is started by a deep link intent for large screen devices. */
-    private boolean launchHomepageForTwoPaneDeepLink(Intent intent) {
-        if (!shouldShowTwoPaneDeepLink(intent)) {
-            return false;
-        }
-
+    /**
+     * Returns the deep link trampoline intent for large screen devices.
+     */
+    public static Intent getTrampolineIntent(Intent intent, String highlightMenuKey) {
         final Intent detailIntent = new Intent(intent);
         // It's a deep link intent, SettingsHomepageActivity will set SplitPairRule and start it.
         final Intent trampolineIntent = new Intent(ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY);
-
         trampolineIntent.replaceExtras(detailIntent);
 
         // Relay detail intent data to prevent failure of Intent#ParseUri.
@@ -391,22 +389,27 @@
         trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI,
                 detailIntent.toUri(Intent.URI_INTENT_SCHEME));
 
-        if (detailIntent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) {
-            trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class);
+        trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
+                highlightMenuKey);
+        trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+        return trampolineIntent;
+    }
+
+    private void launchHomepageForTwoPaneDeepLink(Intent intent) {
+        final Intent trampolineIntent;
+        if (intent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) {
             // Get menu key for slice deep link case.
-            final String highlightMenuKey = detailIntent.getStringExtra(
+            final String highlightMenuKey = intent.getStringExtra(
                     EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY);
             if (!TextUtils.isEmpty(highlightMenuKey)) {
                 mHighlightMenuKey = highlightMenuKey;
             }
+            trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey);
+            trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class);
+        } else {
+            trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey);
         }
-
-        trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
-                mHighlightMenuKey);
-        trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
         startActivity(trampolineIntent);
-
-        return true;
     }
 
     private boolean shouldShowTwoPaneDeepLink(Intent intent) {
diff --git a/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java
index 6351621..a46ae7a 100644
--- a/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java
+++ b/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java
@@ -95,6 +95,6 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // not needed since it's not sliceable
-        return 0;
+        return NO_RES;
     }
 }
diff --git a/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java
index 4101963..2d22558 100644
--- a/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java
+++ b/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java
@@ -77,6 +77,6 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // not needed since it's not sliceable
-        return 0;
+        return NO_RES;
     }
 }
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java
index a8bff6b..bda078f 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java
@@ -55,6 +55,6 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // not needed since it's not sliceable
-        return 0;
+        return NO_RES;
     }
 }
diff --git a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
index 6d8fb33..1da8672 100644
--- a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
+++ b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
@@ -29,7 +29,6 @@
 
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
@@ -73,8 +72,6 @@
         };
         Context context = getContext();
         mDevice = getDevice(context);
-        final boolean untetheredHeadset = BluetoothUtils.getBooleanMetaData(
-                mDevice.getDevice(), BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET);
 
         AlertDialog dialog = new AlertDialog.Builder(context)
                 .setPositiveButton(R.string.bluetooth_unpair_dialog_forget_confirm_button,
@@ -82,9 +79,7 @@
                 .setNegativeButton(android.R.string.cancel, null)
                 .create();
         dialog.setTitle(R.string.bluetooth_unpair_dialog_title);
-        dialog.setMessage(context.getString(untetheredHeadset
-                        ? R.string.bluetooth_untethered_unpair_dialog_body
-                        : R.string.bluetooth_unpair_dialog_body,
+        dialog.setMessage(context.getString(R.string.bluetooth_unpair_dialog_body,
                 mDevice.getName()));
         return dialog;
     }
diff --git a/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java b/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java
index 2bab3e9..93e6d0a 100644
--- a/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java
+++ b/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java
@@ -120,7 +120,7 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // not needed since it's not sliceable
-        return 0;
+        return NO_RES;
     }
 
     @Override
diff --git a/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java b/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java
index 3d6695b..52694af 100644
--- a/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java
+++ b/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java
@@ -55,7 +55,7 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // not needed since it's not sliceable
-        return 0;
+        return NO_RES;
     }
 
     @Override
diff --git a/src/com/android/settings/flashlight/FlashlightSlice.java b/src/com/android/settings/flashlight/FlashlightSlice.java
index f18d712..eaf059a 100644
--- a/src/com/android/settings/flashlight/FlashlightSlice.java
+++ b/src/com/android/settings/flashlight/FlashlightSlice.java
@@ -120,7 +120,7 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // no landing page in Settings
-        return 0;
+        return NO_RES;
     }
 
     private static String getCameraId(Context context) throws CameraAccessException {
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index b599207..cd518a6 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -270,6 +270,7 @@
 
         initHeader();
         if (mEnableTriState) {
+            mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
             initPreferenceForTriState(getContext());
             final String packageName = mBatteryOptimizeUtils.getPackageName();
             FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
@@ -286,21 +287,18 @@
     public void onPause() {
         super.onPause();
         if (mEnableTriState) {
-            Log.d(TAG, "Leave with mode: " + getSelectedPreference());
-            mBatteryOptimizeUtils.setAppUsageState(getSelectedPreference());
-        }
-    }
+            final int selectedPreference = getSelectedPreference();
 
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        notifyBackupManager();
+            notifyBackupManager();
+            logMetricCategory(selectedPreference);
+            mBatteryOptimizeUtils.setAppUsageState(selectedPreference);
+            Log.d(TAG, "Leave with mode: " + selectedPreference);
+        }
     }
 
     @VisibleForTesting
     void notifyBackupManager() {
-        if (mEnableTriState
-                && mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
+        if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
             final BackupManager backupManager = mBackupManager != null
                     ? mBackupManager : new BackupManager(getContext());
             backupManager.dataChanged();
@@ -461,32 +459,42 @@
         updatePreferenceState(mUnrestrictedPreference, selectedKey);
         updatePreferenceState(mOptimizePreference, selectedKey);
         updatePreferenceState(mRestrictedPreference, selectedKey);
-
-        // Logs metric.
-        int metricCategory = 0;
-        if (selectedKey.equals(mUnrestrictedPreference.getKey())) {
-            metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
-        } else if (selectedKey.equals(mOptimizePreference.getKey())) {
-            metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
-        } else if (selectedKey.equals(mRestrictedPreference.getKey())) {
-            metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
-        }
-        if (metricCategory != 0) {
-            FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
-                .action(
-                    getContext(),
-                    metricCategory,
-                    new Pair(ConvertUtils.METRIC_KEY_PACKAGE,
-                            mBatteryOptimizeUtils.getPackageName()),
-                    new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE,
-                            getArguments().getString(EXTRA_POWER_USAGE_PERCENT)));
-        }
     }
 
     private void updatePreferenceState(RadioButtonPreference preference, String selectedKey) {
         preference.setChecked(selectedKey.equals(preference.getKey()));
     }
 
+    private void logMetricCategory(int selectedKey) {
+        if (selectedKey == mOptimizationMode) {
+            return;
+        }
+
+        int metricCategory = 0;
+        switch (selectedKey) {
+            case BatteryOptimizeUtils.MODE_UNRESTRICTED:
+                metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
+                break;
+            case BatteryOptimizeUtils.MODE_OPTIMIZED:
+                metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
+                break;
+            case BatteryOptimizeUtils.MODE_RESTRICTED:
+                metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
+                break;
+        }
+
+        if (metricCategory != 0) {
+            FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
+                    .action(
+                            getContext(),
+                            metricCategory,
+                            new Pair(ConvertUtils.METRIC_KEY_PACKAGE,
+                                    mBatteryOptimizeUtils.getPackageName()),
+                            new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE,
+                                    getArguments().getString(EXTRA_POWER_USAGE_PERCENT)));
+        }
+    }
+
     private void onCreateForTriState(String packageName) {
         mUnrestrictedPreference = findPreference(KEY_PREF_UNRESTRICTED);
         mOptimizePreference = findPreference(KEY_PREF_OPTIMIZED);
@@ -498,7 +506,6 @@
 
         mBatteryOptimizeUtils = new BatteryOptimizeUtils(
                 getContext(), getArguments().getInt(EXTRA_UID), packageName);
-        mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
     }
 
     private int getSelectedPreference() {
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 2bbc11e..ae8c61e 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -27,6 +27,7 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.text.TextUtils;
+import android.util.ArraySet;
 import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.view.View;
@@ -54,6 +55,7 @@
 import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
 
 import java.net.URISyntaxException;
+import java.util.Set;
 
 /** Settings homepage activity */
 public class SettingsHomepageActivity extends FragmentActivity implements
@@ -79,10 +81,27 @@
     private View mHomepageView;
     private View mSuggestionView;
     private CategoryMixin mCategoryMixin;
+    private Set<HomepageLoadedListener> mLoadedListeners;
 
-    @Override
-    public CategoryMixin getCategoryMixin() {
-        return mCategoryMixin;
+    /** A listener receiving homepage loaded events. */
+    public interface HomepageLoadedListener {
+        /** Called when the homepage is loaded. */
+        void onHomepageLoaded();
+    }
+
+    /**
+     *  Try to register a {@link HomepageLoadedListener}. If homepage is already loaded, the
+     *  listener will not be notified.
+     *
+     *  @return Whether the listener should be registered.
+     */
+    public boolean registerHomepageLoadedListenerIfNeeded(HomepageLoadedListener listener) {
+        if (mHomepageView == null) {
+            return false;
+        } else {
+            mLoadedListeners.add(listener);
+            return true;
+        }
     }
 
     /**
@@ -97,17 +116,25 @@
         mSuggestionView.setVisibility(showSuggestion ? View.VISIBLE : View.GONE);
         mHomepageView.setVisibility(View.VISIBLE);
         mHomepageView = null;
+        mLoadedListeners.forEach(listener -> listener.onHomepageLoaded());
+        mLoadedListeners.clear();
+    }
+
+    @Override
+    public CategoryMixin getCategoryMixin() {
+        return mCategoryMixin;
     }
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        ((SettingsApplication) getApplication()).setHomeActivity(this);
+        setHomeActivity();
         setContentView(R.layout.settings_homepage_container);
 
         final View appBar = findViewById(R.id.app_bar_container);
         appBar.setMinimumHeight(getSearchBoxHeight());
         initHomepageContainer();
+        mLoadedListeners = new ArraySet<>();
 
         final Toolbar toolbar = findViewById(R.id.search_action_bar);
         FeatureFactory.getFactory(this).getSearchFeatureProvider()
@@ -158,6 +185,10 @@
         launchDeepLinkIntentToRight();
     }
 
+    protected void setHomeActivity() {
+        ((SettingsApplication) getApplication()).setHomeActivity(this);
+    }
+
     private void showSuggestionFragment() {
         final Class<? extends Fragment> fragment = FeatureFactory.getFactory(this)
                 .getSuggestionFeatureProvider(this).getContextualSuggestionFragment();
diff --git a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java b/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
index 2f83612..61e946d 100644
--- a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
+++ b/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
@@ -21,6 +21,11 @@
 /** Activity for Slices to launch Settings deep link page */
 public class SliceDeepLinkHomepageActivity extends SettingsHomepageActivity {
     @Override
+    protected void setHomeActivity() {
+        // do not overwrite homepage activity in SettingsApplication
+    }
+
+    @Override
     protected ComponentName getDeepLinkComponent() {
         return new ComponentName(getApplicationContext(), getClass());
     }
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index d3bfa02..e9c7ef8 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -101,7 +101,7 @@
     public boolean onPreferenceTreeClick(Preference preference) {
         // Register SplitPairRule for SubSettings.
         ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(getContext(),
-                true /* clearTop*/);
+                true /* clearTop */);
 
         setHighlightPreferenceKey(preference.getKey());
         return super.onPreferenceTreeClick(preference);
@@ -184,6 +184,15 @@
         }
     }
 
+    /** Disable highlight on the menu entry */
+    public void disableMenuHighlight() {
+        if (mTopLevelAdapter == null) {
+            return;
+        }
+        mHighlightedPreferenceKey = null;
+        mTopLevelAdapter.highlightPreference(mHighlightedPreferenceKey, /* scrollNeeded= */ false);
+    }
+
     @Override
     protected boolean shouldForceRoundedIcon() {
         return getContext().getResources()
@@ -202,7 +211,8 @@
 
         Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey);
         mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(
-                getActivity(), preferenceScreen, getListView(), mHighlightedPreferenceKey);
+                (SettingsHomepageActivity) getActivity(), preferenceScreen, getListView(),
+                mHighlightedPreferenceKey);
         return mTopLevelAdapter;
     }
 
diff --git a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
index 46f279d..e3609cb 100644
--- a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
+++ b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
@@ -68,7 +68,7 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // not needed since it's not sliceable
-        return 0;
+        return NO_RES;
     }
 
     /**
diff --git a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
index 9e35664..eeb9924 100644
--- a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
+++ b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
@@ -91,7 +91,7 @@
     @Override
     public int getSliceHighlightMenuRes() {
         // not needed since it's not sliceable
-        return 0;
+        return NO_RES;
     }
 
     @Override
diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java
index 05fd2ae..9b081e1 100644
--- a/src/com/android/settings/search/SearchFeatureProvider.java
+++ b/src/com/android/settings/search/SearchFeatureProvider.java
@@ -19,7 +19,6 @@
 import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
 
 import android.annotation.NonNull;
-import android.app.Activity;
 import android.app.ActivityOptions;
 import android.content.ComponentName;
 import android.content.Context;
@@ -30,8 +29,12 @@
 import android.view.ViewGroup;
 import android.widget.Toolbar;
 
+import androidx.fragment.app.FragmentActivity;
+
 import com.android.settings.R;
 import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.TopLevelSettings;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.search.SearchIndexableResources;
 
@@ -66,7 +69,7 @@
     /**
      * Initializes the search toolbar.
      */
-    default void initSearchToolbar(Activity activity, Toolbar toolbar, int pageId) {
+    default void initSearchToolbar(FragmentActivity activity, Toolbar toolbar, int pageId) {
         if (activity == null || toolbar == null) {
             return;
         }
@@ -91,7 +94,8 @@
 
         toolbar.setOnClickListener(tb -> {
             final Context context = activity.getApplicationContext();
-            final Intent intent = buildSearchIntent(context, pageId);
+            final Intent intent = buildSearchIntent(context, pageId)
+                    .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 
             if (activity.getPackageManager().queryIntentActivities(intent,
                     PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
@@ -103,8 +107,19 @@
 
             FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                     .logSettingsTileClick(KEY_HOMEPAGE_SEARCH_BAR, pageId);
-            final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity).toBundle();
-            activity.startActivity(intent, bundle);
+
+            if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
+                final TopLevelSettings fragment = (TopLevelSettings) activity
+                        .getSupportFragmentManager().findFragmentById(R.id.main_content);
+                if (fragment != null) {
+                    fragment.disableMenuHighlight();
+                }
+                activity.startActivity(intent);
+            } else {
+                final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity)
+                        .toBundle();
+                activity.startActivity(intent, bundle);
+            }
         });
     }
 
diff --git a/src/com/android/settings/search/SearchResultTrampoline.java b/src/com/android/settings/search/SearchResultTrampoline.java
index 3414efe..d20a2ea 100644
--- a/src/com/android/settings/search/SearchResultTrampoline.java
+++ b/src/com/android/settings/search/SearchResultTrampoline.java
@@ -20,52 +20,102 @@
 import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB;
 
 import android.app.Activity;
+import android.content.ComponentName;
 import android.content.Intent;
 import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
 
 import com.android.settings.SettingsActivity;
 import com.android.settings.SubSettings;
 import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.overlay.FeatureFactory;
 
+import java.net.URISyntaxException;
+
 /**
  * A trampoline activity that launches setting result page.
  */
 public class SearchResultTrampoline extends Activity {
 
+    private static final String TAG = "SearchResultTrampoline";
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        final ComponentName callingActivity = getCallingActivity();
         // First make sure caller has privilege to launch a search result page.
         FeatureFactory.getFactory(this)
                 .getSearchFeatureProvider()
-                .verifyLaunchSearchResultPageCaller(this, getCallingActivity());
+                .verifyLaunchSearchResultPageCaller(this, callingActivity);
         // Didn't crash, proceed and launch the result as a subsetting.
-        final Intent intent = getIntent();
+        Intent intent = getIntent();
+        final String highlightMenuKey = intent.getStringExtra(
+                Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY);
 
-        // Hack to take EXTRA_FRAGMENT_ARG_KEY from intent and set into
-        // EXTRA_SHOW_FRAGMENT_ARGUMENTS. This is necessary because intent could be from external
-        // caller and args may not persisted.
-        final String settingKey = intent.getStringExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
-        final int tab = intent.getIntExtra(EXTRA_SHOW_FRAGMENT_TAB, 0);
-        final Bundle args = new Bundle();
-        args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, settingKey);
-        args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
-        intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
+        final String fragment = intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT);
+        if (!TextUtils.isEmpty(fragment)) {
+            // Hack to take EXTRA_FRAGMENT_ARG_KEY from intent and set into
+            // EXTRA_SHOW_FRAGMENT_ARGUMENTS. This is necessary because intent could be from
+            // external caller and args may not persisted.
+            final String settingKey = intent.getStringExtra(
+                    SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
+            final int tab = intent.getIntExtra(EXTRA_SHOW_FRAGMENT_TAB, 0);
+            final Bundle args = new Bundle();
+            args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, settingKey);
+            args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
+            intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
 
-        // Register SplirPairRule for SubSettings, set clearTop false to prevent unexpected back
-        // navigation behavior.
-        ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(this /* context */,
-                false /* clearTop*/);
+            // Reroute request to SubSetting.
+            intent.setClass(this /* context */, SubSettings.class);
+        } else {
+            // Direct link case
+            final String intentUriString = intent.getStringExtra(
+                    Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI);
+            if (TextUtils.isEmpty(intentUriString)) {
+                Log.e(TAG, "No EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI for deep link");
+                finish();
+                return;
+            }
 
-        // Reroute request to SubSetting.
-        intent.setClass(this /* context */, SubSettings.class)
-                .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
-        startActivity(intent);
+            try {
+                intent = Intent.parseUri(intentUriString, Intent.URI_INTENT_SCHEME);
+            } catch (URISyntaxException e) {
+                Log.e(TAG, "Failed to parse deep link intent: " + e);
+                finish();
+                return;
+            }
+        }
+
+        intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+
+        if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
+            startActivity(intent);
+        } else if (isFromSettingsIntelligence(callingActivity)) {
+            // Register SplitPairRule for SubSettings, set clearTop false to prevent unexpected back
+            // navigation behavior.
+            ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(this,
+                    false /* clearTop */);
+            // TODO: pass menu key to homepage
+            intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
+            startActivity(intent);
+        } else {
+            // Two-pane case
+            intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
+            startActivity(SettingsActivity.getTrampolineIntent(intent, highlightMenuKey));
+        }
 
         // Done.
         finish();
     }
 
+    private boolean isFromSettingsIntelligence(ComponentName callingActivity) {
+        return callingActivity != null && TextUtils.equals(
+                callingActivity.getPackageName(),
+                FeatureFactory.getFactory(this).getSearchFeatureProvider()
+                        .getSettingsIntelligencePkgName(this));
+    }
 }
diff --git a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
index feb9510..d6635a1 100644
--- a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
+++ b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
@@ -365,7 +365,6 @@
                 // The classname and intent information comes from the PreIndexData
                 // This will be more clear when provider conversion is done at PreIndex time.
                 raw.className = bundle.getTargetClass().getName();
-
             }
             rawList.addAll(providerRaws);
         }
diff --git a/src/com/android/settings/slices/Sliceable.java b/src/com/android/settings/slices/Sliceable.java
index 31555df..406cb3a 100644
--- a/src/com/android/settings/slices/Sliceable.java
+++ b/src/com/android/settings/slices/Sliceable.java
@@ -25,6 +25,7 @@
 import android.net.Uri;
 import android.widget.Toast;
 
+import androidx.annotation.StringRes;
 import androidx.slice.Slice;
 
 import com.android.settings.R;
@@ -135,10 +136,16 @@
     }
 
     /**
-     * @return a resource ID that indicates which menu entry should be highlighted in multi-pane
-     * mode.
+     * Used to mark a {@link Sliceable} that has no highlight menu string resource.
      */
-    default int getSliceHighlightMenuRes() {
-        return 0;
+    int NO_RES = 0;
+
+    /**
+     * @return a string resource declared in res/values/menu_keys.xml that indicates which menu
+     * entry should be highlighted in two-pane mode, or {@link #NO_RES} representing highlighting is
+     * not applicable.
+     */
+    @StringRes default int getSliceHighlightMenuRes() {
+        return NO_RES;
     }
 }
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index 19a91f6..bf92bbd 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.widget;
 
-import android.app.Activity;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
@@ -34,6 +33,7 @@
 
 import com.android.settings.Utils;
 import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.SettingsHomepageActivity;
 
 /**
  *  Adapter for highlighting top level preferences
@@ -54,7 +54,7 @@
     final int mIconColorHighlight;
 
     private final Context mContext;
-    private final Activity mActivity;
+    private final SettingsHomepageActivity mHomepageActivity;
     private final RecyclerView mRecyclerView;
     private final int mNormalBackgroundRes;
     private String mHighlightKey;
@@ -63,13 +63,13 @@
     private boolean mHighlightNeeded;
     private boolean mScrolled;
 
-    public HighlightableTopLevelPreferenceAdapter(Activity activity,
+    public HighlightableTopLevelPreferenceAdapter(SettingsHomepageActivity homepageActivity,
             PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) {
         super(preferenceGroup);
         mRecyclerView = recyclerView;
         mHighlightKey = key;
         mContext = preferenceGroup.getContext();
-        mActivity = activity;
+        mHomepageActivity = homepageActivity;
         final TypedValue outValue = new TypedValue();
         mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
                 outValue, true /* resolveRefs */);
@@ -115,7 +115,7 @@
      * A function can highlight a specific setting in recycler view.
      */
     public void requestHighlight() {
-        if (mRecyclerView == null || TextUtils.isEmpty(mHighlightKey)) {
+        if (mRecyclerView == null) {
             return;
         }
 
@@ -194,6 +194,11 @@
             return;
         }
 
+        if (mHomepageActivity.registerHomepageLoadedListenerIfNeeded(
+                () -> scrollToPositionIfNeeded(position))) {
+            return;
+        }
+
         // Only when the recyclerView is loaded, it can be scrolled
         final View view = mRecyclerView.getChildAt(position);
         if (view == null) {
@@ -236,6 +241,6 @@
     }
 
     private boolean isHighlightNeeded() {
-        return ActivityEmbeddingUtils.isTwoPaneResolution(mActivity);
+        return ActivityEmbeddingUtils.isTwoPaneResolution(mHomepageActivity);
     }
 }
diff --git a/src/com/android/settings/wifi/RequestToggleWiFiActivity.java b/src/com/android/settings/wifi/RequestToggleWiFiActivity.java
index 34ef7cf..6887b78 100644
--- a/src/com/android/settings/wifi/RequestToggleWiFiActivity.java
+++ b/src/com/android/settings/wifi/RequestToggleWiFiActivity.java
@@ -19,6 +19,8 @@
 import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
 
 import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.IActivityManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -29,11 +31,13 @@
 import android.content.pm.PackageManager;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
+import android.os.RemoteException;
 import android.text.TextUtils;
 import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.app.AlertActivity;
 import com.android.settings.R;
 
@@ -63,6 +67,8 @@
 
     private @NonNull WifiManager mWiFiManager;
     private @NonNull CharSequence mAppLabel;
+    @VisibleForTesting
+    protected IActivityManager mActivityManager = ActivityManager.getService();
 
     private int mState = STATE_UNKNOWN;
     private int mLastUpdateState = STATE_UNKNOWN;
@@ -75,20 +81,8 @@
 
         setResult(Activity.RESULT_CANCELED);
 
-        String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
-        if (TextUtils.isEmpty(packageName)) {
-            finish();
-            return;
-        }
-
-        try {
-            ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
-                    packageName, 0);
-            mAppLabel = applicationInfo.loadSafeLabel(getPackageManager(),
-                    PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX, PackageItemInfo.SAFE_LABEL_FLAG_TRIM
-                            | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(LOG_TAG, "Couldn't find app with package name " + packageName);
+        mAppLabel = getAppLabel();
+        if (TextUtils.isEmpty(mAppLabel)) {
             finish();
             return;
         }
@@ -140,7 +134,6 @@
     @Override
     protected void onStart() {
         super.onStart();
-
         mReceiver.register();
 
         final int wifiState = mWiFiManager.getWifiState();
@@ -223,6 +216,32 @@
         super.onStop();
     }
 
+    @VisibleForTesting
+    protected CharSequence getAppLabel() {
+        String packageName;
+        try {
+            packageName = mActivityManager.getLaunchedFromPackage(getActivityToken());
+            if (TextUtils.isEmpty(packageName)) {
+                Log.d(LOG_TAG, "Package name is null");
+                return null;
+            }
+        } catch (RemoteException e) {
+            Log.e(LOG_TAG, "Can not get the package from activity manager");
+            return null;
+        }
+
+        try {
+            ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
+                    packageName, 0);
+            return applicationInfo.loadSafeLabel(getPackageManager(),
+                    PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX, PackageItemInfo.SAFE_LABEL_FLAG_TRIM
+                            | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(LOG_TAG, "Couldn't find app with package name " + packageName);
+            return null;
+        }
+    }
+
     private void updateUi() {
         if (mLastUpdateState == mState) {
             return;
diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
index 7b5eaa9..6bf9104 100644
--- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
+++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
@@ -16,9 +16,14 @@
 
 package com.android.settings.wifi.addappnetworks;
 
+import android.app.ActivityManager;
+import android.app.IActivityManager;
 import android.content.Intent;
 import android.os.Bundle;
+import android.os.RemoteException;
 import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.Window;
 import android.view.WindowManager;
@@ -48,12 +53,17 @@
 
     @VisibleForTesting
     final Bundle mBundle = new Bundle();
+    @VisibleForTesting
+    IActivityManager mActivityManager = ActivityManager.getService();
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.settings_panel);
-        showAddNetworksFragment();
+        if (!showAddNetworksFragment()) {
+            finish();
+            return;
+        }
         getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
 
         // Move the window to the bottom of screen, and make it take up the entire screen width.
@@ -67,13 +77,22 @@
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
         setIntent(intent);
-        showAddNetworksFragment();
+        if (!showAddNetworksFragment()) {
+            finish();
+            return;
+        }
     }
 
     @VisibleForTesting
-    void showAddNetworksFragment() {
+    protected boolean showAddNetworksFragment() {
+        String packageName = getCallingAppPackageName();
+        if (TextUtils.isEmpty(packageName)) {
+            Log.d(TAG, "Package name is null");
+            return false;
+        }
+
         // TODO: Check the new intent status.
-        mBundle.putString(KEY_CALLING_PACKAGE_NAME, getCallingPackage());
+        mBundle.putString(KEY_CALLING_PACKAGE_NAME, packageName);
         mBundle.putParcelableArrayList(Settings.EXTRA_WIFI_NETWORK_LIST,
                 getIntent().getParcelableArrayListExtra(Settings.EXTRA_WIFI_NETWORK_LIST));
 
@@ -86,5 +105,19 @@
         } else {
             ((AddAppNetworksFragment) fragment).createContent(mBundle);
         }
+
+        return true;
+    }
+
+    @VisibleForTesting
+    protected String getCallingAppPackageName() {
+        String packageName;
+        try {
+            packageName = mActivityManager.getLaunchedFromPackage(getActivityToken());
+        } catch (RemoteException e) {
+            Log.e(TAG, "Can not get the package from activity manager");
+            return null;
+        }
+        return packageName;
     }
 }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
index b4f4f97..5c23238 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
@@ -99,20 +99,6 @@
     }
 
     @Test
-    public void createDialog_untetheredDevice_showUntetheredMessage() {
-        when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
-                .thenReturn("true".getBytes());
-
-        FragmentController.setupFragment(mFragment, FragmentActivity.class,
-                0 /* containerViewId */, null /* bundle */);
-        final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-        ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
-
-        assertThat(shadowDialog.getMessage()).isEqualTo(
-                mContext.getString(R.string.bluetooth_untethered_unpair_dialog_body, DEVICE_NAME));
-    }
-
-    @Test
     public void createDialog_normalDevice_showNormalMessage() {
         when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
                 .thenReturn("false".getBytes());
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 3501726..db002cb 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -792,14 +792,39 @@
         assertThat(mOptimizePreference.isChecked()).isTrue();
         assertThat(mRestrictedPreference.isChecked()).isFalse();
         assertThat(mUnrestrictedPreference.isChecked()).isFalse();
+    }
+
+    @Test
+    public void testOnPause_optimizationModeChanged_logPreference() {
+        final int mode = BatteryOptimizeUtils.MODE_RESTRICTED;
+        mFragment.mOptimizationMode = mode;
+        when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+        mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+
+        mFragment.onRadioButtonClicked(mOptimizePreference);
+        mFragment.onPause();
+
         verify(mMetricsFeatureProvider)
-            .action(
-                mContext,
-                SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
-                (Pair<Integer, Object>[]) new Pair[] {
-                    new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null),
-                    new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
-                });
+                .action(
+                        mContext,
+                        SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
+                        (Pair<Integer, Object>[]) new Pair[] {
+                                new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null),
+                                new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
+                        });
+    }
+
+    @Test
+    public void testOnPause_optimizationModeIsNotChanged_notInvokeLogging() {
+        final int mode = BatteryOptimizeUtils.MODE_OPTIMIZED;
+        mFragment.mOptimizationMode = mode;
+        when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+        mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+
+        mFragment.onRadioButtonClicked(mOptimizePreference);
+        mFragment.onPause();
+
+        verifyZeroInteractions(mMetricsFeatureProvider);
     }
 
     @Test
@@ -831,7 +856,7 @@
                 .thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
         mFragment.mEnableTriState = false;
 
-        mFragment.notifyBackupManager();
+        mFragment.onPause();
 
         verifyZeroInteractions(mBackupManager);
     }
diff --git a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
index 444a813..5de57b6 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
@@ -19,7 +19,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.Intent;
@@ -29,6 +28,8 @@
 import android.provider.Settings;
 import android.widget.Toolbar;
 
+import androidx.fragment.app.FragmentActivity;
+
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.shadow.ShadowUtils;
@@ -46,13 +47,13 @@
 public class SearchFeatureProviderImplTest {
 
     private SearchFeatureProviderImpl mProvider;
-    private Activity mActivity;
+    private FragmentActivity mActivity;
     private ShadowPackageManager mPackageManager;
 
     @Before
     public void setUp() {
         FakeFeatureFactory.setupForTest();
-        mActivity = Robolectric.setupActivity(Activity.class);
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mProvider = new SearchFeatureProviderImpl();
         mPackageManager = Shadows.shadowOf(mActivity.getPackageManager());
         Settings.Global.putInt(mActivity.getContentResolver(),
diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
index b614698..39408e2 100644
--- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
@@ -18,27 +18,70 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.robolectric.Shadows.shadowOf;
+import android.annotation.Nullable;
+import android.app.IActivityManager;
+import android.os.RemoteException;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class AddAppNetworksActivityTest {
 
+    @Mock
+    private IActivityManager mIActivityManager;
+
+    private AddAppNetworksActivity mActivity;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mActivity = Robolectric.buildActivity(AddAppNetworksActivity.class).create().get();
+        mActivity.mActivityManager = mIActivityManager;
+    }
+
     @Test
-    public void startActivity_withPackageName_bundleShouldHaveRightPackageName() {
-        final String packageName = RuntimeEnvironment.application.getPackageName();
-        final AddAppNetworksActivity activity =
-                Robolectric.buildActivity(AddAppNetworksActivity.class).create().get();
-        shadowOf(activity).setCallingPackage(packageName);
+    public void getCallingAppPackageName_nullPackageName_returnNotNull() {
+        fakeCallingPackage("com.android.settings");
 
-        activity.showAddNetworksFragment();
+        assertThat(mActivity.getCallingAppPackageName()).isNotNull();
+    }
 
-        assertThat(activity.mBundle.getString(AddAppNetworksActivity.KEY_CALLING_PACKAGE_NAME))
-                .isEqualTo(packageName);
+    @Test
+    public void getCallingAppPackageName_withPackageName_returnNull()  {
+        fakeCallingPackage(null);
+
+        assertThat(mActivity.getCallingAppPackageName()).isNull();
+    }
+
+    @Test
+    public void showAddNetworksFragment_nullPackageName_returnFalse()  {
+        fakeCallingPackage(null);
+
+        assertThat(mActivity.showAddNetworksFragment()).isFalse();
+    }
+
+    @Test
+    public void showAddNetworksFragment_withPackageName_returnTrue()  {
+        fakeCallingPackage("com.android.settings");
+
+        assertThat(mActivity.showAddNetworksFragment()).isTrue();
+    }
+
+    private void fakeCallingPackage(@Nullable String packageName) {
+        try {
+            when(mIActivityManager.getLaunchedFromPackage(any())).thenReturn(packageName);
+        } catch (RemoteException e) {
+            // Do nothing.
+        }
     }
 }
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
index df6a38b..8687e5a 100644
--- a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
@@ -305,7 +305,7 @@
 
         @Override
         public int getSliceHighlightMenuRes() {
-            return 0;
+            return NO_RES;
         }
     }
 
diff --git a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
index 490b7bd..38347e9 100644
--- a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
+++ b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
@@ -146,7 +146,7 @@
 
         @Override
         public int getSliceHighlightMenuRes() {
-            return 0;
+            return NO_RES;
         }
     }
 }
diff --git a/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java b/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java
new file mode 100644
index 0000000..0e3dd40
--- /dev/null
+++ b/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import android.annotation.Nullable;
+import android.app.IActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+import android.os.RemoteException;
+
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class RequestToggleWiFiActivityTest {
+
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Spy
+    private final Context mContext = ApplicationProvider.getApplicationContext();
+    @Mock
+    private WifiManager mWifiManager;
+    @Mock
+    private IActivityManager mIActivityManager;
+
+    private ActivityScenario<RequestToggleWiFiActivity> mActivityScenario;
+    private RequestToggleWiFiActivity mActivity;
+
+    @Before
+    public void setUp() {
+        when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+        when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+
+        mActivityScenario = ActivityScenario.launch(new Intent(WifiManager.ACTION_REQUEST_ENABLE));
+        mActivityScenario.onActivity(activity -> mActivity = activity);
+
+    }
+
+    @After
+    public void cleanUp() {
+        mActivity = null;
+        if (mActivityScenario != null) {
+            mActivityScenario.close();
+        }
+    }
+
+    @Test
+    public void getAppLabel_nullPackageName_returnNull() {
+        fakeCallingPackage(null);
+
+        assertThat(mActivity.getAppLabel()).isNull();
+    }
+
+    @Test
+    public void getAppLabel_settingsPackageName_returnNotNull() {
+        fakeCallingPackage("com.android.settings");
+
+        assertThat(mActivity.getAppLabel()).isNotNull();
+    }
+
+    private void fakeCallingPackage(@Nullable String packageName) {
+        assertThat(mActivity).isNotNull();
+        mActivity.mActivityManager = mIActivityManager;
+        try {
+            when(mIActivityManager.getLaunchedFromPackage(any())).thenReturn(packageName);
+        } catch (RemoteException e) {
+            // Do nothing.
+        }
+    }
+}