Merge "Revert "Clean up fully rolled out HeadlessSingleUserFixes"" into main
diff --git a/aconfig/settings_biometrics_framework_flag_declarations.aconfig b/aconfig/settings_biometrics_framework_flag_declarations.aconfig
index e787da0..e81c68e 100644
--- a/aconfig/settings_biometrics_framework_flag_declarations.aconfig
+++ b/aconfig/settings_biometrics_framework_flag_declarations.aconfig
@@ -14,3 +14,10 @@
   description: "This flag enables or disables the Fingerprint v2 enrollment"
   bug: "295206723"
 }
+
+flag {
+  name: "active_unlock_finish_parent"
+  namespace: "biometrics_framework"
+  description: "This flag enables the Active Unlock settings activity to finish its parent activity"
+  bug: "343576960"
+}
diff --git a/aconfig/settings_experience_flag_declarations.aconfig b/aconfig/settings_experience_flag_declarations.aconfig
index e79b515..d5caccf 100644
--- a/aconfig/settings_experience_flag_declarations.aconfig
+++ b/aconfig/settings_experience_flag_declarations.aconfig
@@ -17,13 +17,3 @@
         purpose: PURPOSE_BUGFIX
     }
 }
-
-flag {
-    name: "internet_preference_controller_v2"
-    namespace: "settings_experience"
-    description: "New InternetPreferenceControllerV2."
-    bug: "339884322"
-    metadata {
-        purpose: PURPOSE_BUGFIX
-    }
-}
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 8cbf5dc..8e5519f 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1536,6 +1536,7 @@
         <item>@*android:drawable/ic_zen_mode_icon_group_of_people</item>
         <item>@*android:drawable/ic_zen_mode_icon_lightbulb</item>
         <item>@*android:drawable/ic_zen_mode_type_schedule_calendar</item>
+        <item>@*android:drawable/ic_zen_mode_type_special_dnd</item>
         <!-- Sports -->
         <item>@*android:drawable/ic_zen_mode_icon_running</item>
         <item>@*android:drawable/ic_zen_mode_icon_golf</item>
@@ -1561,7 +1562,6 @@
         <!-- Other activities -->
         <item>@*android:drawable/ic_zen_mode_icon_train</item>
         <item>@*android:drawable/ic_zen_mode_type_driving</item> <!-- Car -->
-        <item>@*android:drawable/ic_zen_mode_icon_croissant</item>
         <item>@*android:drawable/ic_zen_mode_icon_fork_and_knife</item>
         <item>@*android:drawable/ic_zen_mode_icon_shopping_cart</item>
         <item>@*android:drawable/ic_zen_mode_icon_child</item>
@@ -1587,6 +1587,7 @@
         <item>Group of people</item>
         <item>Lightbulb</item>
         <item>Calendar</item>
+        <item>Do Not Disturb</item>
         <!-- Sports -->
         <item>Person running</item>
         <item>Golf</item>
@@ -1612,7 +1613,6 @@
         <!-- Other activities -->
         <item>Train</item>
         <item>Car</item>
-        <item>Croissant</item>
         <item>Fork and knife</item>
         <item>Shopping cart</item>
         <item>Child</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7b7dd19..56d13a2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -937,7 +937,7 @@
     <!-- Message showing that multiple fingerprints, face, and the current watch is set up. Shown for a menu item that launches fingerprint, face,  and active unlock settings or enrollment. [CHAR LIMIT=80]-->
     <string name="security_settings_fingerprint_multiple_face_watch_preference_summary">Face, fingerprints, and <xliff:g id="watch" example="Dani's Watch">%s</xliff:g> added</string>
     <!-- Description for mandatory biometrics prompt-->
-    <string name="mandatory_biometrics_prompt_description">Identity Check is on</string>
+    <string name="mandatory_biometrics_prompt_description">Identity Check is on and requires a biometric</string>
     <!-- RemoteAuth unlock enrollment and settings --><skip />
     <!-- Title shown for menu item that launches watch unlock settings. [CHAR LIMIT=40] -->
     <string name ="security_settings_remoteauth_preference_title">Remote Authenticator Unlock</string>
diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml
index 2a08aae..e4ebe788 100644
--- a/res/xml/network_provider_internet.xml
+++ b/res/xml/network_provider_internet.xml
@@ -29,7 +29,8 @@
         android:order="-30"
         settings:allowDividerAbove="true"
         settings:keywords="@string/keywords_internet"
-        settings:useAdminDisabledSummary="true" />
+        settings:useAdminDisabledSummary="true"
+        settings:controller="com.android.settings.network.InternetPreferenceControllerV2" />
 
     <com.android.settingslib.RestrictedPreference
         android:key="calls_and_sms"
diff --git a/src/com/android/settings/applications/AppInfoBase.java b/src/com/android/settings/applications/AppInfoBase.java
index c056add..1d77482 100644
--- a/src/com/android/settings/applications/AppInfoBase.java
+++ b/src/com/android/settings/applications/AppInfoBase.java
@@ -136,14 +136,14 @@
                 mPackageName = intent.getData().getSchemeSpecificPart();
             }
         }
-        if (!hasInteractAcrossUsersPermission()) {
-            Log.w(TAG, "Intent not valid.");
-            finish();
-            return "";
-        }
         if (intent != null && intent.hasExtra(Intent.EXTRA_USER_HANDLE)) {
-            mUserId = ((UserHandle) intent.getParcelableExtra(
-                    Intent.EXTRA_USER_HANDLE)).getIdentifier();
+            mUserId = ((UserHandle) intent.getParcelableExtra(Intent.EXTRA_USER_HANDLE))
+                    .getIdentifier();
+            if (mUserId != UserHandle.myUserId() && !hasInteractAcrossUsersFullPermission()) {
+                Log.w(TAG, "Intent not valid.");
+                finish();
+                return "";
+            }
         } else {
             mUserId = UserHandle.myUserId();
         }
@@ -171,7 +171,7 @@
     }
 
     @VisibleForTesting
-    protected boolean hasInteractAcrossUsersPermission() {
+    protected boolean hasInteractAcrossUsersFullPermission() {
         Activity activity = getActivity();
         if (!(activity instanceof SettingsActivity)) {
             return false;
diff --git a/src/com/android/settings/biometrics/combination/CombinedBiometricSettings.java b/src/com/android/settings/biometrics/combination/CombinedBiometricSettings.java
index 671a5b6..7b3a724 100644
--- a/src/com/android/settings/biometrics/combination/CombinedBiometricSettings.java
+++ b/src/com/android/settings/biometrics/combination/CombinedBiometricSettings.java
@@ -24,14 +24,19 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 
+import androidx.activity.result.ActivityResult;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
 import androidx.annotation.Nullable;
 import androidx.preference.Preference;
 
 import com.android.settings.R;
+import com.android.settings.biometrics.BiometricEnrollBase;
 import com.android.settings.biometrics.activeunlock.ActiveUnlockContentListener.OnContentChangedListener;
 import com.android.settings.biometrics.activeunlock.ActiveUnlockDeviceNameListener;
 import com.android.settings.biometrics.activeunlock.ActiveUnlockRequireBiometricSetup;
 import com.android.settings.biometrics.activeunlock.ActiveUnlockStatusUtils;
+import com.android.settings.flags.Flags;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.search.SearchIndexable;
 
@@ -52,6 +57,10 @@
     private CombinedBiometricStatusUtils mCombinedBiometricStatusUtils;
     @Nullable private ActiveUnlockDeviceNameListener mActiveUnlockDeviceNameListener;
 
+    private final ActivityResultLauncher<Intent> mActiveUnlockPreferenceLauncher =
+            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
+                    this::onActiveUnlockPreferenceResult);
+
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
@@ -158,12 +167,25 @@
             intent = mActiveUnlockStatusUtils.getIntent();
         }
         if (intent != null) {
-            startActivityForResult(intent, ACTIVE_UNLOCK_REQUEST);
+            if (Flags.activeUnlockFinishParent()) {
+                mActiveUnlockPreferenceLauncher.launch(intent);
+            } else {
+                startActivityForResult(intent, ACTIVE_UNLOCK_REQUEST);
+            }
         }
         return true;
 
     }
 
+    private void onActiveUnlockPreferenceResult(@Nullable ActivityResult result) {
+        if (result != null && result.getResultCode() == BiometricEnrollBase.RESULT_TIMEOUT) {
+            mDoNotFinishActivity = false;
+            // When "Watch Unlock" is closed due to entering onStop(),
+            // "Face & Fingerprint Unlock" shall also close itself and back to "Security" page.
+            finish();
+        }
+    }
+
     @Override
     protected String getUseAnyBiometricSummary() {
         // either Active Unlock is not enabled or no device is enrolled.
diff --git a/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java b/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java
index 3a1f995..8eccf31 100644
--- a/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java
+++ b/src/com/android/settings/datetime/AutoTimeZonePreferenceController.java
@@ -27,6 +27,8 @@
 import android.app.time.TimeZoneConfiguration;
 import android.content.Context;
 
+import androidx.preference.Preference;
+
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.core.TogglePreferenceController;
@@ -116,6 +118,12 @@
     }
 
     @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        refreshSummary(preference);
+    }
+
+    @Override
     public CharSequence getSummary() {
         // If auto time zone cannot enable telephony fallback and is capable of location, then auto
         // time zone must use location.
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index da8481d..ebe7996 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -172,13 +172,21 @@
     /** Gets the {@link BatteryUsageStats} from system service. */
     @Nullable
     public static BatteryUsageStats getBatteryUsageStats(final Context context) {
+        final long startTime = System.currentTimeMillis();
         final BatteryUsageStatsQuery batteryUsageStatsQuery =
                 new BatteryUsageStatsQuery.Builder()
                         .includeBatteryHistory()
                         .includeProcessStateData()
                         .build();
-        return context.getSystemService(BatteryStatsManager.class)
-                .getBatteryUsageStats(batteryUsageStatsQuery);
+        final BatteryUsageStats batteryUsageStats =
+                context.getSystemService(BatteryStatsManager.class)
+                        .getBatteryUsageStats(batteryUsageStatsQuery);
+        Log.d(
+                TAG,
+                String.format(
+                        "getBatteryUsageStats() from BatteryStatsManager in %d/ms",
+                        System.currentTimeMillis() - startTime));
+        return batteryUsageStats;
     }
 
     /** Gets the {@link UsageEvents} from system service for all unlocked users. */
@@ -1693,8 +1701,14 @@
         final UserManager userManager = context.getSystemService(UserManager.class);
         final SparseArray<BatteryEntry> batteryEntryList = new SparseArray<>();
         final ArrayList<BatteryEntry> results = new ArrayList<>();
+        final long startTime = System.currentTimeMillis();
         final List<UidBatteryConsumer> uidBatteryConsumers =
                 batteryUsageStats.getUidBatteryConsumers();
+        Log.d(
+                TAG,
+                String.format(
+                        "get %d uidBatteryConsumers from BatteryUsageStats in %d/ms",
+                        uidBatteryConsumers.size(), (System.currentTimeMillis() - startTime)));
 
         // Sort to have all apps with "real" UIDs first, followed by apps that are supposed
         // to be combined with the real ones.
@@ -1763,9 +1777,11 @@
                             deviceConsumer.getConsumedPowerForCustomComponent(componentId)));
         }
 
+        final int numComponentEntries = batteryEntryList.size();
         final List<UserBatteryConsumer> userBatteryConsumers =
                 batteryUsageStats.getUserBatteryConsumers();
-        for (int i = 0, size = userBatteryConsumers.size(); i < size; i++) {
+        final int numUserEntries = userBatteryConsumers.size();
+        for (int i = 0; i < numUserEntries; i++) {
             final UserBatteryConsumer consumer = userBatteryConsumers.get(i);
             results.add(
                     new BatteryEntry(
@@ -1785,6 +1801,13 @@
             results.add(batteryEntryList.valueAt(i));
         }
 
+        Log.d(
+                TAG,
+                String.format(
+                        "getCoalescedUsageList(): uidEntries = %d, "
+                                + "userEntries = %d, componentEntries = %d",
+                        numUidSippers, numUserEntries, numComponentEntries));
+
         // The sort order must have changed, so re-sort based on total power use.
         results.sort(BatteryEntry.COMPARATOR);
         return results;
diff --git a/src/com/android/settings/network/InternetPreferenceController.java b/src/com/android/settings/network/InternetPreferenceController.java
deleted file mode 100644
index aed44d5..0000000
--- a/src/com/android/settings/network/InternetPreferenceController.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Copyright (C) 2020 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.network;
-
-import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
-
-import static com.android.settings.network.InternetUpdater.INTERNET_CELLULAR;
-import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET;
-import static com.android.settings.network.InternetUpdater.INTERNET_NETWORKS_AVAILABLE;
-import static com.android.settings.network.InternetUpdater.INTERNET_OFF;
-import static com.android.settings.network.InternetUpdater.INTERNET_WIFI;
-import static com.android.settingslib.wifi.WifiUtils.getHotspotIconResource;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.telephony.SubscriptionManager;
-
-import androidx.annotation.IdRes;
-import androidx.annotation.VisibleForTesting;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.OnLifecycleEvent;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.widget.SummaryUpdater;
-import com.android.settings.wifi.WifiPickerTrackerHelper;
-import com.android.settings.wifi.WifiSummaryUpdater;
-import com.android.settings.wifi.repository.SharedConnectivityRepository;
-import com.android.settingslib.Utils;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
-import com.android.settingslib.utils.ThreadUtils;
-import com.android.wifitrackerlib.HotspotNetworkEntry;
-import com.android.wifitrackerlib.WifiEntry;
-import com.android.wifitrackerlib.WifiPickerTracker;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * PreferenceController to update the internet state.
- */
-public class InternetPreferenceController extends AbstractPreferenceController implements
-        LifecycleObserver, SummaryUpdater.OnSummaryChangeListener,
-        InternetUpdater.InternetChangeListener, MobileNetworkRepository.MobileNetworkCallback,
-        DefaultSubscriptionReceiver.DefaultSubscriptionListener,
-        WifiPickerTracker.WifiPickerTrackerCallback {
-
-    public static final String KEY = "internet_settings";
-
-    private Preference mPreference;
-    @VisibleForTesting
-    WifiSummaryUpdater mSummaryHelper;
-    private InternetUpdater mInternetUpdater;
-    private @InternetUpdater.InternetType int mInternetType;
-    private LifecycleOwner mLifecycleOwner;
-    private MobileNetworkRepository mMobileNetworkRepository;
-    private List<SubscriptionInfoEntity> mSubInfoEntityList = new ArrayList<>();
-    private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-    private DefaultSubscriptionReceiver mDataSubscriptionChangedReceiver;
-    private boolean mIsHotspotNetworkEnabled = SharedConnectivityRepository.isDeviceConfigEnabled();
-    @VisibleForTesting
-    WifiPickerTrackerHelper mWifiPickerTrackerHelper;
-
-    @VisibleForTesting
-    static Map<Integer, Integer> sIconMap = new HashMap<>();
-    static {
-        sIconMap.put(INTERNET_OFF, R.drawable.ic_no_internet_unavailable);
-        sIconMap.put(INTERNET_NETWORKS_AVAILABLE, R.drawable.ic_no_internet_available);
-        sIconMap.put(INTERNET_WIFI, R.drawable.ic_wifi_signal_4);
-        sIconMap.put(INTERNET_CELLULAR, R.drawable.ic_network_cell);
-        sIconMap.put(INTERNET_ETHERNET, R.drawable.ic_settings_ethernet);
-    }
-
-    private static Map<Integer, Integer> sSummaryMap = new HashMap<>();
-    static {
-        sSummaryMap.put(INTERNET_OFF, R.string.condition_airplane_title);
-        sSummaryMap.put(INTERNET_NETWORKS_AVAILABLE, R.string.networks_available);
-        sSummaryMap.put(INTERNET_WIFI, 0);
-        sSummaryMap.put(INTERNET_CELLULAR, 0);
-        sSummaryMap.put(INTERNET_ETHERNET, R.string.to_switch_networks_disconnect_ethernet);
-    }
-
-    public InternetPreferenceController(Context context, Lifecycle lifecycle,
-            LifecycleOwner lifecycleOwner) {
-        super(context);
-        if (lifecycle == null) {
-            throw new IllegalArgumentException("Lifecycle must be set");
-        }
-        mSummaryHelper = new WifiSummaryUpdater(mContext, this);
-        mInternetUpdater = new InternetUpdater(context, lifecycle, this);
-        mInternetType = mInternetUpdater.getInternetType();
-        mLifecycleOwner = lifecycleOwner;
-        mMobileNetworkRepository = MobileNetworkRepository.getInstance(context);
-        mDataSubscriptionChangedReceiver = new DefaultSubscriptionReceiver(context, this);
-        if (mIsHotspotNetworkEnabled) {
-            mWifiPickerTrackerHelper = new WifiPickerTrackerHelper(lifecycle, context, this);
-        }
-        lifecycle.addObserver(this);
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        mPreference = screen.findPreference(KEY);
-    }
-
-    private void drawIcon(int iconResId) {
-        Drawable drawable = mContext.getDrawable(iconResId);
-        if (drawable != null) {
-            drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorControlNormal));
-            mPreference.setIcon(drawable);
-        }
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        if (mPreference == null) {
-            return;
-        }
-
-        if (mInternetType == INTERNET_WIFI && updateHotspotNetwork()) {
-            return;
-        }
-
-        final @IdRes int icon = sIconMap.get(mInternetType);
-        if (icon != 0) {
-            drawIcon(icon);
-        }
-
-        if (mInternetType == INTERNET_WIFI) {
-            mPreference.setSummary(mSummaryHelper.getSummary());
-            return;
-        }
-
-        if (mInternetType == INTERNET_CELLULAR) {
-            updateCellularSummary();
-            return;
-        }
-
-        final @IdRes int summary = sSummaryMap.get(mInternetType);
-        if (summary != 0) {
-            mPreference.setSummary(summary);
-        }
-    }
-
-    @VisibleForTesting
-    boolean updateHotspotNetwork() {
-        if (mWifiPickerTrackerHelper == null) {
-            return false;
-        }
-        WifiEntry entry = mWifiPickerTrackerHelper.getWifiPickerTracker().getConnectedWifiEntry();
-        if (!(entry instanceof HotspotNetworkEntry)) {
-            return false;
-        }
-        drawIcon(getHotspotIconResource(((HotspotNetworkEntry) entry).getDeviceType()));
-        mPreference.setSummary(((HotspotNetworkEntry) entry).getAlternateSummary());
-        return true;
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return mContext.getResources().getBoolean(R.bool.config_show_internet_settings);
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        return KEY;
-    }
-
-    /** @OnLifecycleEvent(ON_RESUME) */
-    @OnLifecycleEvent(ON_RESUME)
-    public void onResume() {
-        mMobileNetworkRepository.addRegister(mLifecycleOwner, this,
-                SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-        mMobileNetworkRepository.updateEntity();
-        mSummaryHelper.register(true);
-        mDataSubscriptionChangedReceiver.registerReceiver();
-        mDefaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
-    }
-
-    /** @OnLifecycleEvent(ON_PAUSE) */
-    @OnLifecycleEvent(ON_PAUSE)
-    public void onPause() {
-        mMobileNetworkRepository.removeRegister(this);
-        mSummaryHelper.register(false);
-        mDataSubscriptionChangedReceiver.unRegisterReceiver();
-    }
-
-    /**
-     * Called when internet type is changed.
-     *
-     * @param internetType the internet type
-     */
-    @Override
-    public void onInternetTypeChanged(@InternetUpdater.InternetType int internetType) {
-        final boolean needUpdate = (internetType != mInternetType);
-        mInternetType = internetType;
-        if (needUpdate) {
-            ThreadUtils.postOnMainThread(() -> {
-                updateState(mPreference);
-            });
-        }
-    }
-
-    /**
-     * Called when airplane mode state is changed.
-     */
-    @Override
-    public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
-        ThreadUtils.postOnMainThread(() -> {
-            updateState(mPreference);
-        });
-    }
-
-    @Override
-    public void onSummaryChanged(String summary) {
-        if (mInternetType == INTERNET_WIFI) {
-            updateState(mPreference);
-        }
-    }
-
-    @VisibleForTesting
-    void updateCellularSummary() {
-        CharSequence summary = null;
-        SubscriptionInfoEntity activeSubInfo = null;
-        SubscriptionInfoEntity defaultSubInfo = null;
-
-        for (SubscriptionInfoEntity subInfo : getSubscriptionInfoList()) {
-            if (subInfo.isActiveDataSubscriptionId) {
-                activeSubInfo = subInfo;
-            }
-            if (subInfo.getSubId() == getDefaultDataSubscriptionId()) {
-                defaultSubInfo = subInfo;
-            }
-        }
-        if (activeSubInfo == null || defaultSubInfo == null) {
-            return;
-        }
-        activeSubInfo = activeSubInfo.isSubscriptionVisible ? activeSubInfo : defaultSubInfo;
-
-        if (activeSubInfo.equals(defaultSubInfo)) {
-            // DDS is active
-            summary = activeSubInfo.uniqueName;
-        } else {
-            summary = mContext.getString(
-                    R.string.mobile_data_temp_using, activeSubInfo.uniqueName);
-        }
-
-        mPreference.setSummary(summary);
-    }
-
-    @VisibleForTesting
-    protected List<SubscriptionInfoEntity> getSubscriptionInfoList() {
-        return mSubInfoEntityList;
-    }
-
-    @VisibleForTesting
-    protected int getDefaultDataSubscriptionId() {
-        return mDefaultDataSubId;
-    }
-
-    @Override
-    public void onAvailableSubInfoChanged(List<SubscriptionInfoEntity> subInfoEntityList) {
-        mSubInfoEntityList = subInfoEntityList;
-        updateState(mPreference);
-    }
-
-    @Override
-    public void onDefaultDataChanged(int defaultDataSubId) {
-        mDefaultDataSubId = defaultDataSubId;
-        updateState(mPreference);
-    }
-
-    @Override
-    public void onWifiEntriesChanged() {
-        if (mInternetType == INTERNET_WIFI) {
-            updateState(mPreference);
-        }
-    }
-
-    @Override
-    public void onWifiStateChanged() {
-        // Do nothing
-    }
-
-    @Override
-    public void onNumSavedNetworksChanged() {
-        // Do nothing
-    }
-
-    @Override
-    public void onNumSavedSubscriptionsChanged() {
-        // Do nothing
-    }
-}
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index 3bc5358..aff9130 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -25,7 +25,6 @@
 import com.android.settings.SettingsDumpService;
 import com.android.settings.core.OnActivityResultListener;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.flags.Flags;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -90,14 +89,6 @@
 
         controllers.add(new MobileNetworkSummaryController(context, lifecycle, lifecycleOwner));
         controllers.add(vpnPreferenceController);
-
-        if (Flags.internetPreferenceControllerV2()) {
-            controllers.add(
-                    new InternetPreferenceControllerV2(context, InternetPreferenceController.KEY));
-        } else {
-            controllers.add(new InternetPreferenceController(context, lifecycle, lifecycleOwner));
-        }
-
         controllers.add(privateDnsPreferenceController);
 
         // Start SettingsDumpService after the MobileNetworkRepository is created.
diff --git a/src/com/android/settings/notification/modes/AbstractZenModeHeaderController.java b/src/com/android/settings/notification/modes/AbstractZenModeHeaderController.java
index af64231..1d1b07d 100644
--- a/src/com/android/settings/notification/modes/AbstractZenModeHeaderController.java
+++ b/src/com/android/settings/notification/modes/AbstractZenModeHeaderController.java
@@ -43,15 +43,18 @@
 abstract class AbstractZenModeHeaderController extends AbstractZenModePreferenceController {
 
     private final DashboardFragment mFragment;
+    private final ZenIconLoader mIconLoader;
     private EntityHeaderController mHeaderController;
     @Nullable private ZenIcon.Key mCurrentIconKey;
 
     AbstractZenModeHeaderController(
             @NonNull Context context,
+            @NonNull ZenIconLoader iconLoader,
             @NonNull String key,
             @NonNull DashboardFragment fragment) {
         super(context, key);
         mFragment = fragment;
+        mIconLoader = iconLoader;
     }
 
     @Override
@@ -90,7 +93,7 @@
         if (!Objects.equal(mCurrentIconKey, zenMode.getIconKey())) {
             mCurrentIconKey = zenMode.getIconKey();
             FutureUtil.whenDone(
-                    ZenIconLoader.getInstance().getIcon(mContext, zenMode),
+                    mIconLoader.getIcon(mContext, zenMode),
                     icon -> {
                         checkNotNull(mHeaderController)
                                 .setIcon(iconStylist.apply(icon.drawable()))
diff --git a/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentBase.java b/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentBase.java
index 96cbf91..6dd9076 100644
--- a/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentBase.java
+++ b/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentBase.java
@@ -30,6 +30,7 @@
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.notification.modes.ZenIconLoader;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
@@ -102,7 +103,8 @@
     protected final List<AbstractPreferenceController> createPreferenceControllers(
             Context context) {
         return ImmutableList.of(
-                new ZenModeIconPickerIconPreferenceController(context, "chosen_icon", this),
+                new ZenModeIconPickerIconPreferenceController(context, ZenIconLoader.getInstance(),
+                        "chosen_icon", this),
                 new ZenModeEditNamePreferenceController(context, "name", this::setModeName),
                 new ZenModeIconPickerListPreferenceController(context, "icon_list",
                         this::setModeIcon),
diff --git a/src/com/android/settings/notification/modes/ZenModeFragment.java b/src/com/android/settings/notification/modes/ZenModeFragment.java
index 6889cac..8eef708 100644
--- a/src/com/android/settings/notification/modes/ZenModeFragment.java
+++ b/src/com/android/settings/notification/modes/ZenModeFragment.java
@@ -32,6 +32,7 @@
 
 import com.android.settings.R;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.notification.modes.ZenIconLoader;
 import com.android.settingslib.notification.modes.ZenMode;
 
 import java.util.ArrayList;
@@ -54,7 +55,8 @@
     @Override
     protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
         List<AbstractPreferenceController> prefControllers = new ArrayList<>();
-        prefControllers.add(new ZenModeHeaderController(context, "header", this));
+        prefControllers.add(
+                new ZenModeHeaderController(context, ZenIconLoader.getInstance(), "header", this));
         prefControllers.add(new ZenModeBlurbPreferenceController(context, "mode_blurb"));
         prefControllers.add(
                 new ZenModeButtonPreferenceController(context, "activate", this, mBackend));
diff --git a/src/com/android/settings/notification/modes/ZenModeHeaderController.java b/src/com/android/settings/notification/modes/ZenModeHeaderController.java
index ae6eacc..e901b9f 100644
--- a/src/com/android/settings/notification/modes/ZenModeHeaderController.java
+++ b/src/com/android/settings/notification/modes/ZenModeHeaderController.java
@@ -23,15 +23,14 @@
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.notification.modes.ZenIconLoader;
 import com.android.settingslib.notification.modes.ZenMode;
 
 class ZenModeHeaderController extends AbstractZenModeHeaderController {
 
-    ZenModeHeaderController(
-            @NonNull  Context context,
-            @NonNull String key,
-            @NonNull DashboardFragment fragment) {
-        super(context, key, fragment);
+    ZenModeHeaderController(@NonNull Context context, @NonNull ZenIconLoader iconLoader,
+            @NonNull String key, @NonNull DashboardFragment fragment) {
+        super(context, iconLoader, key, fragment);
     }
 
     @Override
diff --git a/src/com/android/settings/notification/modes/ZenModeIconPickerIconPreferenceController.java b/src/com/android/settings/notification/modes/ZenModeIconPickerIconPreferenceController.java
index 6c8d41f..dc0be10 100644
--- a/src/com/android/settings/notification/modes/ZenModeIconPickerIconPreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModeIconPickerIconPreferenceController.java
@@ -24,14 +24,16 @@
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settingslib.notification.modes.ZenIconLoader;
 import com.android.settingslib.notification.modes.ZenMode;
 
 /** Controller used for displaying the currently-chosen icon at the top of the icon picker. */
 class ZenModeIconPickerIconPreferenceController extends AbstractZenModeHeaderController {
 
-    ZenModeIconPickerIconPreferenceController(@NonNull Context context, @NonNull String key,
+    ZenModeIconPickerIconPreferenceController(@NonNull Context context,
+            @NonNull ZenIconLoader iconLoader, @NonNull String key,
             @NonNull DashboardFragment fragment) {
-        super(context, key, fragment);
+        super(context, iconLoader, key, fragment);
     }
 
     @Override
diff --git a/src/com/android/settings/notification/modes/ZenModesListFragment.java b/src/com/android/settings/notification/modes/ZenModesListFragment.java
index 588b320..37772b3 100644
--- a/src/com/android/settings/notification/modes/ZenModesListFragment.java
+++ b/src/com/android/settings/notification/modes/ZenModesListFragment.java
@@ -31,6 +31,7 @@
 import com.android.settings.notification.modes.ZenModesListAddModePreferenceController.OnAddModeListener;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.notification.modes.ZenIconLoader;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.search.SearchIndexable;
@@ -56,7 +57,7 @@
     private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
             ZenModesBackend backend, OnAddModeListener onAddModeListener) {
         return ImmutableList.of(
-                new ZenModesListPreferenceController(context, backend),
+                new ZenModesListPreferenceController(context, backend, ZenIconLoader.getInstance()),
                 new ZenModesListAddModePreferenceController(context, onAddModeListener)
         );
     }
diff --git a/src/com/android/settings/notification/modes/ZenModesListItemPreference.java b/src/com/android/settings/notification/modes/ZenModesListItemPreference.java
index 0c31d8f..0909c6f 100644
--- a/src/com/android/settings/notification/modes/ZenModesListItemPreference.java
+++ b/src/com/android/settings/notification/modes/ZenModesListItemPreference.java
@@ -31,6 +31,8 @@
 
 import com.google.common.base.Strings;
 
+import java.util.concurrent.Executor;
+
 /**
  * Preference representing a single mode item on the modes aggregator page. Clicking on this
  * preference leads to an individual mode's configuration page.
@@ -38,18 +40,29 @@
 class ZenModesListItemPreference extends RestrictedPreference {
 
     private final Context mContext;
+    private final ZenIconLoader mIconLoader;
+    private final Executor mUiExecutor;
     private ZenMode mZenMode;
 
     private TextView mTitleView;
     private TextView mSummaryView;
 
-    ZenModesListItemPreference(Context context, ZenMode zenMode) {
+    ZenModesListItemPreference(Context context, ZenIconLoader iconLoader, ZenMode zenMode) {
+        this(context, iconLoader, context.getMainExecutor(), zenMode);
+    }
+
+    @VisibleForTesting
+    ZenModesListItemPreference(Context context, ZenIconLoader iconLoader, Executor uiExecutor,
+            ZenMode zenMode) {
         super(context);
         mContext = context;
+        mIconLoader = iconLoader;
+        mUiExecutor = uiExecutor;
         setZenMode(zenMode);
         setKey(zenMode.getId());
     }
 
+
     @Override
     public void onBindViewHolder(PreferenceViewHolder holder) {
         super.onBindViewHolder(holder);
@@ -93,12 +106,12 @@
 
         setIconSize(ICON_SIZE_SMALL);
         FutureUtil.whenDone(
-                ZenIconLoader.getInstance().getIcon(mContext, mZenMode),
+                mIconLoader.getIcon(mContext, mZenMode),
                 icon -> setIcon(
                         zenMode.isActive()
                                 ? IconUtil.applyAccentTint(mContext, icon.drawable())
                                 : IconUtil.applyNormalTint(mContext, icon.drawable())),
-                mContext.getMainExecutor());
+                mUiExecutor);
 
         updateTextColor(zenMode);
     }
diff --git a/src/com/android/settings/notification/modes/ZenModesListPreferenceController.java b/src/com/android/settings/notification/modes/ZenModesListPreferenceController.java
index 12b7278..5e36469 100644
--- a/src/com/android/settings/notification/modes/ZenModesListPreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModesListPreferenceController.java
@@ -25,6 +25,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.notification.modes.ZenIconLoader;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.search.SearchIndexableRaw;
@@ -42,11 +43,14 @@
         implements BasePreferenceController.UiBlocker {
     protected static final String KEY = "zen_modes_list";
 
-    protected ZenModesBackend mBackend;
+    private final ZenModesBackend mBackend;
+    private final ZenIconLoader mIconLoader;
 
-    ZenModesListPreferenceController(Context context, @NonNull ZenModesBackend backend) {
+    ZenModesListPreferenceController(Context context, @NonNull ZenModesBackend backend, @NonNull
+            ZenIconLoader iconLoader) {
         super(context, KEY);
         mBackend = backend;
+        mIconLoader = iconLoader;
     }
 
     @Override
@@ -82,7 +86,7 @@
                 modePreference.setZenMode(mode);
             } else {
                 // new rule; create a new ZenRulePreference & add it to the preference category
-                modePreference = new ZenModesListItemPreference(mContext, mode);
+                modePreference = new ZenModesListItemPreference(mContext, mIconLoader, mode);
                 category.addPreference(modePreference);
             }
             modePreference.setOrder(modes.indexOf(mode));
diff --git a/src/com/android/settings/wifi/WifiSummaryUpdater.java b/src/com/android/settings/wifi/WifiSummaryUpdater.java
deleted file mode 100644
index 645d2ea..0000000
--- a/src/com/android/settings/wifi/WifiSummaryUpdater.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2017 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 android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.NetworkScoreManager;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.text.TextUtils;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.widget.SummaryUpdater;
-import com.android.settingslib.wifi.WifiStatusTracker;
-
-/**
- * Helper class that listeners to wifi callback and notify client when there is update in
- * wifi summary info.
- */
-public class WifiSummaryUpdater extends SummaryUpdater {
-
-    private final WifiStatusTracker mWifiTracker;
-    private final BroadcastReceiver mReceiver;
-
-    private static final IntentFilter INTENT_FILTER;
-    static {
-        INTENT_FILTER = new IntentFilter();
-        INTENT_FILTER.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
-        INTENT_FILTER.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-        INTENT_FILTER.addAction(WifiManager.RSSI_CHANGED_ACTION);
-    }
-
-    public WifiSummaryUpdater(Context context, OnSummaryChangeListener listener) {
-        this(context, listener, null);
-    }
-
-    @VisibleForTesting
-    public WifiSummaryUpdater(Context context, OnSummaryChangeListener listener,
-        WifiStatusTracker wifiTracker) {
-        super(context, listener);
-        mWifiTracker = wifiTracker != null ? wifiTracker :
-                new WifiStatusTracker(context, context.getSystemService(WifiManager.class),
-                context.getSystemService(NetworkScoreManager.class),
-                context.getSystemService(ConnectivityManager.class),
-                        this::notifyChangeIfNeeded);
-        mReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                mWifiTracker.handleBroadcast(intent);
-                notifyChangeIfNeeded();
-            }
-        };
-    }
-
-    @Override
-    public void register(boolean register) {
-        if (register) {
-            mWifiTracker.fetchInitialState();
-            notifyChangeIfNeeded();
-            mContext.registerReceiver(mReceiver, INTENT_FILTER,
-                    Context.RECEIVER_EXPORTED_UNAUDITED);
-        } else {
-            mContext.unregisterReceiver(mReceiver);
-        }
-        mWifiTracker.setListening(register);
-    }
-
-    @Override
-    public String getSummary() {
-        if (!mWifiTracker.enabled) {
-            return mContext.getString(R.string.switch_off_text);
-        }
-        if (!mWifiTracker.connected) {
-            return mContext.getString(R.string.disconnected);
-        }
-        String ssid = WifiInfo.sanitizeSsid(mWifiTracker.ssid);
-        if (TextUtils.isEmpty(mWifiTracker.statusLabel)) {
-            return ssid;
-        }
-        return mContext.getResources().getString(
-                com.android.settingslib.R.string.preference_summary_default_combination,
-                ssid, mWifiTracker.statusLabel);
-    }
-
-    /**
-     * return true if Wi-Fi connected.
-     */
-    public boolean isWifiConnected() {
-        return mWifiTracker.connected;
-    }
-}
diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPageProvider.kt b/src/com/android/settings/wifi/details2/WifiPrivacyPageProvider.kt
index 7744a73..8888f0d 100644
--- a/src/com/android/settings/wifi/details2/WifiPrivacyPageProvider.kt
+++ b/src/com/android/settings/wifi/details2/WifiPrivacyPageProvider.kt
@@ -55,6 +55,7 @@
 import com.android.wifitrackerlib.WifiEntry
 import java.time.Clock
 import java.time.ZoneOffset
+import java.util.Base64
 
 const val WIFI_ENTRY_KEY = "wifiEntryKey"
 
@@ -68,7 +69,8 @@
 
     @Composable
     override fun Page(arguments: Bundle?) {
-        val wifiEntryKey = arguments!!.getString(WIFI_ENTRY_KEY)
+        val wifiEntryKey =
+            String(Base64.getUrlDecoder().decode(arguments!!.getString(WIFI_ENTRY_KEY)))
         if (wifiEntryKey != null) {
             val context = LocalContext.current
             val lifecycle = LocalLifecycleOwner.current.lifecycle
@@ -81,7 +83,7 @@
 
     fun getRoute(
         wifiEntryKey: String,
-    ): String = "${name}/$wifiEntryKey"
+    ): String = "${name}/${Base64.getUrlEncoder().encodeToString(wifiEntryKey.toByteArray())}"
 }
 
 @Composable
diff --git a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
index cb121ea..0ed56c0 100644
--- a/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppInfoWithHeaderTest.java
@@ -250,7 +250,7 @@
         }
 
         @Override
-        protected boolean hasInteractAcrossUsersPermission() {
+        protected boolean hasInteractAcrossUsersFullPermission() {
             return true;
         }
 
@@ -267,7 +267,7 @@
 
     private static final class TestFragmentWithoutPermission extends TestFragment {
         @Override
-        protected boolean hasInteractAcrossUsersPermission() {
+        protected boolean hasInteractAcrossUsersFullPermission() {
             return false;
         }
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java
index ea3c04c..8212166 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PeriodicJobReceiverTest.java
@@ -108,7 +108,7 @@
 
         mReceiver.onReceive(mContext, JOB_UPDATE_INTENT);
 
-        TimeUnit.MILLISECONDS.sleep(100);
+        TimeUnit.MILLISECONDS.sleep(1000);
         assertThat(mDao.getAllAfter(0)).hasSize(1);
     }
 
@@ -119,7 +119,7 @@
 
         mReceiver.onReceive(mContext, JOB_UPDATE_INTENT);
 
-        TimeUnit.MILLISECONDS.sleep(100);
+        TimeUnit.MILLISECONDS.sleep(1000);
         assertThat(mDao.getAllAfter(0)).hasSize(3);
     }
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java
index f5d5160..3722e41 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java
@@ -36,7 +36,6 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.shadows.ShadowLooper;
 
 @RunWith(RobolectricTestRunner.class)
 @EnableFlags(Flags.FLAG_MODES_UI)
@@ -45,18 +44,18 @@
     public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     private Context mContext;
+    private final ZenIconLoader mIconLoader = new ZenIconLoader(
+            MoreExecutors.newDirectExecutorService());
 
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
         mContext = RuntimeEnvironment.application;
-        ZenIconLoader.setInstance(new ZenIconLoader(MoreExecutors.newDirectExecutorService()));
     }
 
     @Test
     public void constructor_setsMode() {
-        ZenModesListItemPreference preference = new ZenModesListItemPreference(mContext,
-                TestModeBuilder.EXAMPLE);
+        ZenModesListItemPreference preference = newPreference(TestModeBuilder.EXAMPLE);
 
         assertThat(preference.getKey()).isEqualTo(TestModeBuilder.EXAMPLE.getId());
         assertThat(preference.getZenMode()).isEqualTo(TestModeBuilder.EXAMPLE);
@@ -70,8 +69,7 @@
                 .setEnabled(true)
                 .build();
 
-        ZenModesListItemPreference preference = new ZenModesListItemPreference(mContext, mode);
-        ShadowLooper.idleMainLooper(); // To load icon.
+        ZenModesListItemPreference preference = newPreference(mode);
 
         assertThat(preference.getTitle()).isEqualTo("Enabled mode");
         assertThat(preference.getSummary()).isEqualTo("When the thrush knocks");
@@ -87,8 +85,7 @@
                 .setActive(true)
                 .build();
 
-        ZenModesListItemPreference preference = new ZenModesListItemPreference(mContext, mode);
-        ShadowLooper.idleMainLooper();
+        ZenModesListItemPreference preference = newPreference(mode);
 
         assertThat(preference.getTitle()).isEqualTo("Active mode");
         assertThat(preference.getSummary()).isEqualTo("ON • When Birnam forest comes to Dunsinane");
@@ -103,8 +100,7 @@
                 .setEnabled(false, /* byUser= */ false)
                 .build();
 
-        ZenModesListItemPreference preference = new ZenModesListItemPreference(mContext, mode);
-        ShadowLooper.idleMainLooper();
+        ZenModesListItemPreference preference = newPreference(mode);
 
         assertThat(preference.getTitle()).isEqualTo("Mode disabled by app");
         assertThat(preference.getSummary()).isEqualTo("Not set");
@@ -119,11 +115,15 @@
                 .setEnabled(false, /* byUser= */ true)
                 .build();
 
-        ZenModesListItemPreference preference = new ZenModesListItemPreference(mContext, mode);
-        ShadowLooper.idleMainLooper();
+        ZenModesListItemPreference preference = newPreference(mode);
 
         assertThat(preference.getTitle()).isEqualTo("Mode disabled by user");
         assertThat(preference.getSummary()).isEqualTo("Disabled");
         assertThat(preference.getIcon()).isNotNull();
     }
+
+    private ZenModesListItemPreference newPreference(ZenMode zenMode) {
+        return new ZenModesListItemPreference(mContext, mIconLoader, MoreExecutors.directExecutor(),
+                zenMode);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
index 4fa8b8a..69568ce 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
@@ -40,11 +40,13 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settingslib.notification.modes.TestModeBuilder;
+import com.android.settingslib.notification.modes.ZenIconLoader;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.search.SearchIndexableRaw;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.MoreExecutors;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -95,7 +97,8 @@
         PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext);
         preferenceScreen.addPreference(mPreference);
 
-        mPrefController = new ZenModesListPreferenceController(mContext, mBackend);
+        mPrefController = new ZenModesListPreferenceController(mContext, mBackend,
+                new ZenIconLoader(MoreExecutors.newDirectExecutorService()));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSummaryUpdaterTest.java b/tests/robotests/src/com/android/settings/wifi/WifiSummaryUpdaterTest.java
deleted file mode 100644
index 99040db..0000000
--- a/tests/robotests/src/com/android/settings/wifi/WifiSummaryUpdaterTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2017 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.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.WifiManager;
-
-import com.android.settings.R;
-import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
-import com.android.settingslib.wifi.WifiStatusTracker;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class WifiSummaryUpdaterTest {
-    @Mock private WifiStatusTracker mWifiTracker;
-    @Mock private SummaryListener mListener;
-
-    private Context mContext;
-    private WifiSummaryUpdater mSummaryUpdater;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application.getApplicationContext());
-        doReturn(mock(Intent.class)).when(mContext).registerReceiver(any(), any(), anyInt());
-        doNothing().when(mContext).unregisterReceiver(any(BroadcastReceiver.class));
-
-        mSummaryUpdater = new WifiSummaryUpdater(mContext, mListener, mWifiTracker);
-    }
-
-    @Test
-    public void register_true_shouldRegisterListenerAndTracker() {
-        mSummaryUpdater.register(true);
-
-        verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class),
-                anyInt());
-        verify(mWifiTracker).setListening(true);
-    }
-
-    @Test
-    public void register_true_shouldFetchInitialStateAndSendSummaryChange() {
-        mSummaryUpdater.register(true);
-
-        verify(mWifiTracker).fetchInitialState();
-        verify(mListener).onSummaryChanged(anyString());
-    }
-
-    @Test
-    public void register_false_shouldUnregisterListenerAndTracker() {
-        mSummaryUpdater.register(true);
-        mSummaryUpdater.register(false);
-
-        verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
-        verify(mWifiTracker).setListening(false);
-    }
-
-    @Test
-    public void onReceive_networkStateChanged_shouldSendSummaryChange() {
-        mSummaryUpdater.register(true);
-        mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION));
-
-        verify(mListener).onSummaryChanged(anyString());
-    }
-
-    @Test
-    public void onReceive_rssiChanged_shouldSendSummaryChange() {
-        mSummaryUpdater.register(true);
-        mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION));
-
-        verify(mListener).onSummaryChanged(anyString());
-    }
-
-    @Test
-    public void getSummary_wifiDisabled_shouldReturnDisabled() {
-        mWifiTracker.enabled = false;
-
-        assertThat(mSummaryUpdater.getSummary())
-            .isEqualTo(mContext.getString(R.string.switch_off_text));
-    }
-
-    @Test
-    public void getSummary_wifiDisconnected_shouldReturnDisconnected() {
-        mWifiTracker.enabled = true;
-        mWifiTracker.connected = false;
-
-        assertThat(mSummaryUpdater.getSummary())
-            .isEqualTo(mContext.getString(R.string.disconnected));
-    }
-
-    @Test
-    public void getSummary_wifiConnected_shouldReturnSsid() {
-        mWifiTracker.enabled = true;
-        mWifiTracker.connected = true;
-        mWifiTracker.ssid = "Test Ssid";
-
-        assertThat(mSummaryUpdater.getSummary()).isEqualTo("Test Ssid");
-    }
-
-    @Test
-    public void getSummary_wifiConnected_withSpeedLabel_shouldReturnSsid_withSpeedLabel() {
-        mWifiTracker.enabled = true;
-        mWifiTracker.connected = true;
-        mWifiTracker.ssid = "Test Ssid";
-        mWifiTracker.statusLabel = "Very Fast";
-
-        assertThat(mSummaryUpdater.getSummary()).isEqualTo("Test Ssid / Very Fast");
-    }
-
-    private class SummaryListener implements OnSummaryChangeListener {
-        private String summary;
-
-        @Override
-        public void onSummaryChanged(String summary) {
-            this.summary = summary;
-        }
-    }
-}
diff --git a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
deleted file mode 100644
index 1c482ef..0000000
--- a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (C) 2020 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.network;
-
-import static com.android.settings.network.InternetUpdater.INTERNET_NETWORKS_AVAILABLE;
-import static com.android.settings.network.InternetUpdater.INTERNET_WIFI;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.NetworkRequest;
-import android.net.NetworkScoreManager;
-import android.net.wifi.WifiManager;
-import android.os.Handler;
-import android.os.Looper;
-
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.LifecycleRegistry;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceManager;
-import androidx.preference.PreferenceScreen;
-import androidx.test.annotation.UiThreadTest;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.R;
-import com.android.settings.testutils.ResourcesUtils;
-import com.android.settings.wifi.WifiPickerTrackerHelper;
-import com.android.settings.wifi.WifiSummaryUpdater;
-import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
-import com.android.wifitrackerlib.HotspotNetworkEntry;
-import com.android.wifitrackerlib.StandardWifiEntry;
-import com.android.wifitrackerlib.WifiPickerTracker;
-
-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;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class InternetPreferenceControllerTest {
-
-    private static final String TEST_SUMMARY = "test summary";
-    private static final String TEST_ALTERNATE_SUMMARY = "test alternate summary";
-    private static final String NOT_CONNECTED = "Not connected";
-    private static final String SUB_ID_1 = "1";
-    private static final String SUB_ID_2 = "2";
-    private static final String DISPLAY_NAME_1 = "Sub 1";
-    private static final String DISPLAY_NAME_2 = "Sub 2";
-
-    @Rule
-    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
-    @Spy
-    private Context mContext = ApplicationProvider.getApplicationContext();
-    @Mock
-    private SubscriptionInfoEntity mActiveSubInfo;
-    @Mock
-    private SubscriptionInfoEntity mDefaultDataSubInfo;
-    @Mock
-    private ConnectivityManager mConnectivityManager;
-    @Mock
-    private LifecycleOwner mLifecycleOwner;
-    @Mock
-    private WifiManager mWifiManager;
-    @Mock
-    private WifiSummaryUpdater mSummaryHelper;
-    @Mock
-    private WifiPickerTrackerHelper mWifiPickerTrackerHelper;
-    @Mock
-    private WifiPickerTracker mWifiPickerTracker;
-    @Mock
-    private HotspotNetworkEntry mHotspotNetworkEntry;
-
-    private LifecycleRegistry mLifecycleRegistry;
-
-    private MockInternetPreferenceController mController;
-    private PreferenceScreen mScreen;
-    private Preference mPreference;
-    private List<SubscriptionInfoEntity> mSubscriptionInfoEntityList = new ArrayList<>();
-
-    @Before
-    public void setUp() {
-        when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
-        when(mContext.getSystemService(NetworkScoreManager.class))
-                .thenReturn(mock(NetworkScoreManager.class));
-        when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
-        when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
-        when(mWifiPickerTrackerHelper.getWifiPickerTracker()).thenReturn(mWifiPickerTracker);
-        when(mWifiPickerTracker.getConnectedWifiEntry()).thenReturn(null /* WifiEntry */);
-        when(mHotspotNetworkEntry.getAlternateSummary()).thenReturn(TEST_ALTERNATE_SUMMARY);
-
-        if (Looper.myLooper() == null) {
-            Looper.prepare();
-        }
-        mLifecycleRegistry = new LifecycleRegistry(mLifecycleOwner);
-        when(mLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry);
-        mController = new MockInternetPreferenceController(mContext, mock(Lifecycle.class),
-                mLifecycleOwner);
-        mController.sIconMap.put(INTERNET_WIFI, 0);
-        mController.mWifiPickerTrackerHelper = mWifiPickerTrackerHelper;
-
-        final PreferenceManager preferenceManager = new PreferenceManager(mContext);
-        mScreen = preferenceManager.createPreferenceScreen(mContext);
-        mPreference = new Preference(mContext);
-        mPreference.setKey(InternetPreferenceController.KEY);
-        mScreen.addPreference(mPreference);
-    }
-
-    private class MockInternetPreferenceController extends
-            com.android.settings.network.InternetPreferenceController {
-
-        private int mDefaultDataSubscriptionId;
-        public MockInternetPreferenceController(Context context, Lifecycle lifecycle,
-                LifecycleOwner lifecycleOwner) {
-            super(context, lifecycle, lifecycleOwner);
-        }
-
-        private List<SubscriptionInfoEntity> mSubscriptionInfoEntity;
-
-        @Override
-        protected List<SubscriptionInfoEntity> getSubscriptionInfoList() {
-            return mSubscriptionInfoEntity;
-        }
-
-        public void setSubscriptionInfoList(List<SubscriptionInfoEntity> list) {
-            mSubscriptionInfoEntity = list;
-        }
-
-        @Override
-        protected int getDefaultDataSubscriptionId() {
-            return mDefaultDataSubscriptionId;
-        }
-
-        public void setDefaultDataSubscriptionId(int subscriptionId) {
-            mDefaultDataSubscriptionId = subscriptionId;
-        }
-
-    }
-
-    private SubscriptionInfoEntity setupSubscriptionInfoEntity(String subId, int slotId,
-            String displayName, boolean isVisible, boolean isValid, boolean isActive,
-            boolean isActiveData) {
-        return new SubscriptionInfoEntity(subId, slotId, false, false, displayName, isVisible,
-                false, isValid, isActive, isActiveData);
-    }
-
-    @Test
-    public void isAvailable_shouldMatchPrefFlag() {
-        assertThat(mController.isAvailable()).isEqualTo(
-                mContext.getResources().getBoolean(R.bool.config_show_internet_settings));
-    }
-
-    @Test
-    @UiThreadTest
-    public void onResume_shouldRegisterCallback() {
-        mController.onResume();
-
-        verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class),
-                any(int.class));
-        verify(mConnectivityManager).registerNetworkCallback(
-                any(NetworkRequest.class),
-                any(ConnectivityManager.NetworkCallback.class),
-                any(Handler.class));
-    }
-
-    @Test
-    @UiThreadTest
-    public void onPause_shouldUnregisterCallback() {
-        mController.onResume();
-        mController.onPause();
-
-        verify(mContext, times(2)).unregisterReceiver(any(BroadcastReceiver.class));
-        verify(mConnectivityManager, times(2)).unregisterNetworkCallback(
-                any(ConnectivityManager.NetworkCallback.class));
-    }
-
-    @Test
-    public void onSummaryChanged_internetWifi_updateSummary() {
-        when(mSummaryHelper.getSummary()).thenReturn(TEST_SUMMARY);
-        mController.mSummaryHelper = mSummaryHelper;
-        mController.onInternetTypeChanged(INTERNET_WIFI);
-        mController.displayPreference(mScreen);
-
-        mController.onSummaryChanged(TEST_SUMMARY);
-
-        assertThat(mPreference.getSummary()).isEqualTo(TEST_SUMMARY);
-    }
-
-    @Test
-    public void onSummaryChanged_internetNetworksAvailable_notUpdateSummary() {
-        when(mSummaryHelper.getSummary()).thenReturn(TEST_SUMMARY);
-        mController.mSummaryHelper = mSummaryHelper;
-        mController.onInternetTypeChanged(INTERNET_NETWORKS_AVAILABLE);
-        mController.displayPreference(mScreen);
-        mPreference.setSummary(NOT_CONNECTED);
-
-        mController.onSummaryChanged(TEST_SUMMARY);
-
-        assertThat(mPreference.getSummary()).isNotEqualTo(TEST_SUMMARY);
-    }
-
-    @Test
-    public void updateCellularSummary_getNullSubscriptionInfo_shouldNotCrash() {
-        mController.setSubscriptionInfoList(mSubscriptionInfoEntityList);
-
-        mController.updateCellularSummary();
-    }
-
-    @Test
-    public void updateCellularSummary_getActiveSubscriptionInfo_cbrs() {
-        mController.setDefaultDataSubscriptionId(Integer.parseInt(SUB_ID_2));
-        mActiveSubInfo = setupSubscriptionInfoEntity(SUB_ID_1, 1, DISPLAY_NAME_1,
-                false, true, true, true);
-        mDefaultDataSubInfo = setupSubscriptionInfoEntity(SUB_ID_2, 1, DISPLAY_NAME_2,
-                false, true, true, false);
-        mSubscriptionInfoEntityList.add(mActiveSubInfo);
-        mSubscriptionInfoEntityList.add(mDefaultDataSubInfo);
-        mController.setSubscriptionInfoList(mSubscriptionInfoEntityList);
-        mController.displayPreference(mScreen);
-
-        mController.updateCellularSummary();
-        assertThat(mPreference.getSummary()).isEqualTo(DISPLAY_NAME_2);
-
-        mActiveSubInfo = setupSubscriptionInfoEntity(SUB_ID_1, 1, DISPLAY_NAME_1,
-                true, true, true, true);
-        mSubscriptionInfoEntityList.add(mActiveSubInfo);
-        mController.setSubscriptionInfoList(mSubscriptionInfoEntityList);
-        mController.onAvailableSubInfoChanged(mSubscriptionInfoEntityList);
-        final String expectedSummary =
-                ResourcesUtils.getResourcesString(mContext, "mobile_data_temp_using",
-                        DISPLAY_NAME_1);
-        mController.updateCellularSummary();
-        assertThat(mPreference.getSummary()).isEqualTo(expectedSummary);
-    }
-
-    @Test
-    public void updateHotspotNetwork_isHotspotNetworkEntry_updateAlternateSummary() {
-        when(mWifiPickerTracker.getConnectedWifiEntry()).thenReturn(mHotspotNetworkEntry);
-        mController.onInternetTypeChanged(INTERNET_WIFI);
-        mController.displayPreference(mScreen);
-        mPreference.setSummary(TEST_SUMMARY);
-
-        mController.updateHotspotNetwork();
-
-        assertThat(mPreference.getSummary().toString()).isEqualTo(TEST_ALTERNATE_SUMMARY);
-    }
-
-    @Test
-    public void updateHotspotNetwork_notHotspotNetworkEntry_notChangeSummary() {
-        when(mWifiPickerTracker.getConnectedWifiEntry()).thenReturn(mock(StandardWifiEntry.class));
-        mController.onInternetTypeChanged(INTERNET_WIFI);
-        mController.displayPreference(mScreen);
-        mPreference.setSummary(TEST_SUMMARY);
-
-        mController.updateHotspotNetwork();
-
-        assertThat(mPreference.getSummary().toString()).isEqualTo(TEST_SUMMARY);
-    }
-
-    @Test
-    public void updateHotspotNetwork_hotspotNetworkNotEnabled_returnFalse() {
-        mController.mWifiPickerTrackerHelper = null;
-
-        assertThat(mController.updateHotspotNetwork()).isFalse();
-    }
-}