Merge "Rename calls to isGlobalModeEnabled" into rvc-dev
diff --git a/res/layout/notification_history_log_row.xml b/res/layout/notification_history_log_row.xml
index 136af38..c77b005 100644
--- a/res/layout/notification_history_log_row.xml
+++ b/res/layout/notification_history_log_row.xml
@@ -28,19 +28,21 @@
         android:layout_height="wrap_content"
         android:orientation="vertical"
         android:layout_marginBottom="6dp">
-        <RelativeLayout
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="@*android:dimen/status_bar_icon_size"
             android:gravity="center_vertical">
 
             <TextView
                 android:id="@+id/title"
-                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:layout_width="0dp"
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
                 android:ellipsize="end"
                 android:singleLine="true"
                 android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification.Title"
+                android:layout_toStartOf="@id/alerted_icon"
                 android:textAlignment="viewStart"/>
 
             <ImageView
@@ -51,8 +53,9 @@
                 android:layout_marginStart="6dp"
                 android:paddingTop="1dp"
                 android:scaleType="fitCenter"
-                android:visibility="gone"
+                android:visibility="invisible"
                 android:layout_toEndOf="@id/title"
+                android:layout_toStartOf="@id/timestamp"
                 android:tint="?android:attr/textColorSecondary"
                 android:src="@drawable/ic_notifications_alert"/>
 
@@ -67,7 +70,7 @@
                 android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Notification"
                 android:textAlignment="viewEnd"
                 />
-        </RelativeLayout>
+        </LinearLayout>
 
         <TextView
             android:id="@+id/text"
diff --git a/res/layout/notification_sbn_log_row.xml b/res/layout/notification_sbn_log_row.xml
index e94150d..40c81fa 100644
--- a/res/layout/notification_sbn_log_row.xml
+++ b/res/layout/notification_sbn_log_row.xml
@@ -79,7 +79,6 @@
             android:layout_marginEnd="6dp"
             android:paddingTop="1dp"
             android:scaleType="fitCenter"
-            android:visibility="gone"
             android:layout_toStartOf="@id/timestamp"
         />
 
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index a3ad4207..45ecd61 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -470,7 +470,7 @@
                     <EditText android:id="@+id/proxy_pac"
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            style="@style/wifi_item_content"
+                            style="@style/wifi_item_edit_content"
                             android:hint="@string/proxy_url_hint"
                             android:inputType="textNoSuggestions"
                             android:singleLine="true"/>
@@ -559,27 +559,6 @@
 
             </LinearLayout>
 
-            <LinearLayout android:id="@+id/privacy_settings_fields"
-                          android:layout_width="match_parent"
-                          android:layout_height="wrap_content"
-                          style="@style/wifi_item"
-                          android:visibility="gone">
-
-                <TextView android:id="@+id/privacy_settings_title"
-                          android:layout_width="wrap_content"
-                          android:layout_height="wrap_content"
-                          style="@style/wifi_item_label"
-                          android:text="@string/wifi_privacy_settings" />
-
-                <Spinner android:id="@+id/privacy_settings"
-                         android:layout_width="match_parent"
-                         android:layout_height="wrap_content"
-                         style="@style/wifi_item_spinner"
-                         android:prompt="@string/wifi_privacy_settings"
-                         android:entries="@array/wifi_privacy_entries"/>
-
-            </LinearLayout>
-
             <LinearLayout android:id="@+id/staticip"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -680,6 +659,26 @@
                 </LinearLayout>
             </LinearLayout>
 
+            <LinearLayout android:id="@+id/privacy_settings_fields"
+                          android:layout_width="match_parent"
+                          android:layout_height="wrap_content"
+                          style="@style/wifi_item"
+                          android:visibility="gone">
+
+                <TextView android:id="@+id/privacy_settings_title"
+                          android:layout_width="wrap_content"
+                          android:layout_height="wrap_content"
+                          style="@style/wifi_item_label"
+                          android:text="@string/wifi_privacy_settings" />
+
+                <Spinner android:id="@+id/privacy_settings"
+                         android:layout_width="match_parent"
+                         android:layout_height="wrap_content"
+                         style="@style/wifi_item_spinner"
+                         android:prompt="@string/wifi_privacy_settings"
+                         android:entries="@array/wifi_privacy_entries"/>
+            </LinearLayout>
+
             <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0c9fa05..da4583b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11002,6 +11002,7 @@
     <string-array name="graphics_driver_all_apps_preference_values">
         <item>@string/graphics_driver_app_preference_default</item>
         <item>@string/graphics_driver_app_preference_game_driver</item>
+        <item>@string/graphics_driver_app_preference_prerelease_driver</item>
     </string-array>
     <!-- All the values of graphics driver for app preference [CHAR LIMIT=50] -->
     <string-array name="graphics_driver_app_preference_values">
@@ -11431,22 +11432,6 @@
     <!-- Mobile network details page. Label for an option that lets the user delete an eSIM from
          the device. [CHAR LIMIT=60] -->
     <string name="mobile_network_erase_sim">Erase SIM</string>
-    <!-- Title of a confirmation dialog for deleting an eSIM from the device.
-         [CHAR LIMIT=60] -->
-    <string name="mobile_network_erase_sim_dialog_title">Erase this downloaded SIM?</string>
-    <!-- Body text of of a confirmation dialog for deleting an eSIM from the device.
-         [CHAR LIMIT=NONE] -->
-    <string name="mobile_network_erase_sim_dialog_body">
-        Erasing this SIM removes <xliff:g id="carrier" example="Verizon">%1$s</xliff:g> service
-        from this device.\n\nService for <xliff:g id="carrier" example="Verizon">%2$s</xliff:g>
-        won\u2019t be canceled.
-    </string>
-    <!-- OK button on a confirmation dialog for deleting an eSIM from the device.
-         [CHAR LIMIT=30] -->
-    <string name="mobile_network_erase_sim_dialog_ok">Erase</string>
-    <!-- Body text of the progress dialog we show while deleting an eSIM from the device.
-         [CHAR LIMIT=NONE] -->
-    <string name="mobile_network_erase_sim_dialog_progress">Erasing SIM\u2026</string>
 
     <!-- Title of a dialog indicating that an error ocurred when deleting an eSIM from the device
          [CHAR LIMIT=60] -->
@@ -11636,6 +11621,8 @@
     <string name="media_output_panel_title">Switch output</string>
     <!-- Summary for represent which device is playing media [CHAR LIMIT=NONE] -->
     <string name="media_output_panel_summary_of_playing_device">Currently playing on <xliff:g id="device_name" example="Bose headphone">%1$s</xliff:g></string>
+    <!-- Summary for disconnected status [CHAR LIMIT=50] -->
+    <string name="media_output_disconnected_status"><xliff:g id="device_name" example="My device">%1$s</xliff:g> (disconnected)</string>
 
     <!-- Label for the title on wfc disclaimer fragment. [CHAR LIMIT=40] -->
     <string name="wfc_disclaimer_title_text">Important information</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index dee8176..6ffd6df 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -144,8 +144,9 @@
     <style name="wifi_item_edit_content">
         <item name="android:paddingStart">4dip</item>
         <item name="android:layout_marginStart">4dip</item>
-        <item name="android:textSize">18sp</item>
         <item name="android:textAlignment">viewStart</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
+        <item name="android:textColorHint">?android:attr/textColorSecondary</item>
         <item name="android:minHeight">@dimen/min_tap_target_size</item>
     </style>
 
diff --git a/res/xml/graphics_driver_settings.xml b/res/xml/graphics_driver_settings.xml
index c72c8fb..a1fa78c 100644
--- a/res/xml/graphics_driver_settings.xml
+++ b/res/xml/graphics_driver_settings.xml
@@ -24,8 +24,6 @@
         android:key="graphics_driver_all_apps_preference"
         android:title="@string/graphics_driver_all_apps_preference_title"
         android:dialogTitle="@string/graphics_driver_all_apps_preference_title"
-        android:entries="@array/graphics_driver_all_apps_preference_values"
-        android:entryValues="@array/graphics_driver_all_apps_preference_values"
         settings:controller="com.android.settings.development.graphicsdriver.GraphicsDriverEnableForAllAppsPreferenceController">
     </ListPreference>
 
diff --git a/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java b/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java
index 5a69035..7933062 100644
--- a/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java
+++ b/src/com/android/settings/applications/AppStateManageExternalStorageBridge.java
@@ -22,20 +22,25 @@
 
 import com.android.settingslib.applications.ApplicationsState;
 
+import java.util.List;
+
 /**
  * Retrieves information from {@link AppOpsManager} and {@link android.content.pm.PackageManager}
  * regarding {@link AppOpsManager#OP_MANAGE_EXTERNAL_STORAGE} and
  * {@link Manifest.permission#MANAGE_EXTERNAL_STORAGE}.
  */
 public class AppStateManageExternalStorageBridge extends AppStateAppOpsBridge {
-    private static final int APP_OPS_OP_CODE = AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE;
+    private static final String APP_OP_STR = AppOpsManager.OPSTR_MANAGE_EXTERNAL_STORAGE;
     private static final String[] PERMISSIONS = {
             Manifest.permission.MANAGE_EXTERNAL_STORAGE
     };
 
+    private final AppOpsManager mAppOpsManager;
+
     public AppStateManageExternalStorageBridge(Context context, ApplicationsState appState,
             Callback callback) {
-        super(context, appState, callback, APP_OPS_OP_CODE, PERMISSIONS);
+        super(context, appState, callback, AppOpsManager.strOpToOp(APP_OP_STR), PERMISSIONS);
+        mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
     }
 
     @Override
@@ -43,6 +48,25 @@
         app.extraInfo = getManageExternalStoragePermState(pkg, uid);
     }
 
+    @Override
+    protected void loadAllExtraInfo() {
+        super.loadAllExtraInfo();
+        List<ApplicationsState.AppEntry> apps = mAppSession.getAllApps();
+        for (ApplicationsState.AppEntry app : apps) {
+            if (app.extraInfo instanceof PermissionState) {
+                ((PermissionState) app.extraInfo).appOpMode =  mAppOpsManager.unsafeCheckOpNoThrow(
+                        APP_OP_STR, app.info.uid, app.info.packageName);
+            }
+        }
+    }
+
+    @Override
+    public PermissionState getPermissionInfo(String pkg, int uid) {
+        PermissionState ps = super.getPermissionInfo(pkg, uid);
+        ps.appOpMode = mAppOpsManager.unsafeCheckOpNoThrow(APP_OP_STR, uid, pkg);
+        return ps;
+    }
+
     /**
      * Returns the MANAGE_EXTERNAL_STORAGE {@link AppStateAppOpsBridge.PermissionState} object
      * associated with the given package and user.
diff --git a/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java b/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java
index 63ce440..6c840d5 100644
--- a/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java
+++ b/src/com/android/settings/applications/appinfo/ManageExternalStorageDetails.java
@@ -23,7 +23,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
 import androidx.preference.Preference;
 import androidx.preference.Preference.OnPreferenceChangeListener;
@@ -110,8 +109,8 @@
      */
     private void setManageExternalStorageState(boolean newState) {
         logSpecialPermissionChange(newState, mPackageName);
-        mAppOpsManager.setMode(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE,
-                mPackageInfo.applicationInfo.uid, mPackageName, newState
+        mAppOpsManager.setUidMode(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE,
+                mPackageInfo.applicationInfo.uid, newState
                         ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
     }
 
diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java
index 0cfb831..8db32e9 100644
--- a/src/com/android/settings/datausage/DataUsageList.java
+++ b/src/com/android/settings/datausage/DataUsageList.java
@@ -90,8 +90,10 @@
     private static final String KEY_APP = "app";
     private static final String KEY_FIELDS = "fields";
 
-    private static final int LOADER_CHART_DATA = 2;
-    private static final int LOADER_SUMMARY = 3;
+    @VisibleForTesting
+    static final int LOADER_CHART_DATA = 2;
+    @VisibleForTesting
+    static final int LOADER_SUMMARY = 3;
 
     @VisibleForTesting
     MobileDataEnabledListener mDataStateListener;
@@ -188,6 +190,13 @@
     public void onResume() {
         super.onResume();
         mDataStateListener.start(mSubId);
+
+        // kick off loader for network history
+        // TODO: consider chaining two loaders together instead of reloading
+        // network history when showing app detail.
+        getLoaderManager().restartLoader(LOADER_CHART_DATA,
+                buildArgs(mTemplate), mNetworkCycleDataCallbacks);
+
         updateBody();
     }
 
@@ -195,6 +204,9 @@
     public void onPause() {
         super.onPause();
         mDataStateListener.stop();
+
+        getLoaderManager().destroyLoader(LOADER_CHART_DATA);
+        getLoaderManager().destroyLoader(LOADER_SUMMARY);
     }
 
     @Override
@@ -246,12 +258,6 @@
 
         final Context context = getActivity();
 
-        // kick off loader for network history
-        // TODO: consider chaining two loaders together instead of reloading
-        // network history when showing app detail.
-        getLoaderManager().restartLoader(LOADER_CHART_DATA,
-                buildArgs(mTemplate), mNetworkCycleDataCallbacks);
-
         // detail mode can change visible menus, invalidate
         getActivity().invalidateOptionsMenu();
 
diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java
index 2013b45..b1a31fb 100644
--- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverAppPreferenceController.java
@@ -26,9 +26,7 @@
 import android.content.res.Resources;
 import android.os.Handler;
 import android.os.Looper;
-import android.os.SystemProperties;
 import android.provider.Settings;
-import android.text.TextUtils;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.ListPreference;
@@ -60,9 +58,6 @@
         GraphicsDriverContentObserver.OnGraphicsDriverContentChangedListener, LifecycleObserver,
         OnStart, OnStop {
 
-    private static final String PROPERTY_GFX_DRIVER_GAME = "ro.gfx.driver.0";
-    private static final String PROPERTY_GFX_DRIVER_PRERELEASE = "ro.gfx.driver.1";
-
     private final Context mContext;
     private final ContentResolver mContentResolver;
     private final String mPreferenceTitle;
@@ -98,7 +93,8 @@
         mPreferencePrereleaseDriver =
                 resources.getString(R.string.graphics_driver_app_preference_prerelease_driver);
         mPreferenceSystem = resources.getString(R.string.graphics_driver_app_preference_system);
-        mEntryList = constructEntryList();
+        mEntryList = GraphicsDriverEnableForAllAppsPreferenceController.constructEntryList(
+                mContext, true);
 
         // TODO: Move this task to background if there's potential ANR/Jank.
         // Update the UI when all the app infos are ready.
@@ -195,28 +191,6 @@
         updateState(mPreferenceGroup);
     }
 
-    /**
-     * Constructs and returns a list of graphics driver choices.
-     */
-    public CharSequence[] constructEntryList() {
-        final String prereleaseDriverPackageName =
-                SystemProperties.get(PROPERTY_GFX_DRIVER_PRERELEASE);
-        final String gameDriverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER_GAME);
-
-        List<CharSequence> entryList = new ArrayList<>();
-        entryList.add(mPreferenceDefault);
-        if (!TextUtils.isEmpty(prereleaseDriverPackageName)) {
-            entryList.add(mPreferencePrereleaseDriver);
-        }
-        if (!TextUtils.isEmpty(gameDriverPackageName)) {
-            entryList.add(mPreferenceGameDriver);
-        }
-        entryList.add(mPreferenceSystem);
-        CharSequence[] filteredEntryList = new CharSequence[entryList.size()];
-        filteredEntryList = entryList.toArray(filteredEntryList);
-        return filteredEntryList;
-    }
-
     // AppInfo class to achieve loading the application label only once
     class AppInfo {
         AppInfo(PackageManager packageManager, ApplicationInfo applicationInfo) {
diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceController.java
index 4baa993..29f1014 100644
--- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceController.java
@@ -18,10 +18,15 @@
 
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.content.res.Resources;
+import android.os.Build;
 import android.os.Handler;
 import android.os.Looper;
+import android.os.SystemProperties;
 import android.provider.Settings;
+import android.text.TextUtils;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.ListPreference;
@@ -35,6 +40,11 @@
 import com.android.settingslib.core.lifecycle.events.OnStop;
 import com.android.settingslib.development.DevelopmentSettingsEnabler;
 
+import dalvik.system.VMRuntime;
+
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Controller of global switch to enable Game Driver for all Apps.
  */
@@ -47,6 +57,8 @@
     public static final int GAME_DRIVER_ALL_APPS = 1;
     public static final int GAME_DRIVER_PRERELEASE_ALL_APPS = 2;
     public static final int GAME_DRIVER_OFF = 3;
+    public static final String PROPERTY_GFX_DRIVER_GAME = "ro.gfx.driver.0";
+    public static final String PROPERTY_GFX_DRIVER_PRERELEASE = "ro.gfx.driver.1";
 
     private final Context mContext;
     private final ContentResolver mContentResolver;
@@ -54,6 +66,8 @@
     private final String mPreferenceGameDriver;
     private final String mPreferencePrereleaseDriver;
     @VisibleForTesting
+    CharSequence[] mEntryList;
+    @VisibleForTesting
     GraphicsDriverContentObserver mGraphicsDriverContentObserver;
 
     private ListPreference mPreference;
@@ -69,6 +83,7 @@
                 resources.getString(R.string.graphics_driver_app_preference_game_driver);
         mPreferencePrereleaseDriver =
                 resources.getString(R.string.graphics_driver_app_preference_prerelease_driver);
+        mEntryList = constructEntryList(mContext, false);
         mGraphicsDriverContentObserver =
                 new GraphicsDriverContentObserver(new Handler(Looper.getMainLooper()), this);
     }
@@ -87,6 +102,8 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         mPreference = screen.findPreference(getPreferenceKey());
+        mPreference.setEntries(mEntryList);
+        mPreference.setEntryValues(mEntryList);
         mPreference.setOnPreferenceChangeListener(this);
     }
 
@@ -147,4 +164,64 @@
     public void onGraphicsDriverContentChanged() {
         updateState(mPreference);
     }
+
+    /**
+     * Constructs and returns a list of graphics driver choices.
+     */
+    public static CharSequence[] constructEntryList(Context context, boolean withSystem) {
+        final Resources resources = context.getResources();
+        final String prereleaseDriverPackageName =
+                SystemProperties.get(PROPERTY_GFX_DRIVER_PRERELEASE);
+        final String gameDriverPackageName = SystemProperties.get(PROPERTY_GFX_DRIVER_GAME);
+
+        List<CharSequence> entryList = new ArrayList<>();
+        entryList.add(resources.getString(R.string.graphics_driver_app_preference_default));
+        final PackageManager pm = context.getPackageManager();
+        if (!TextUtils.isEmpty(prereleaseDriverPackageName)
+                && hasDriverPackage(pm, prereleaseDriverPackageName)) {
+            entryList.add(resources.getString(
+                    R.string.graphics_driver_app_preference_prerelease_driver));
+        }
+        if (!TextUtils.isEmpty(gameDriverPackageName)
+                && hasDriverPackage(pm, gameDriverPackageName)) {
+            entryList.add(resources.getString(R.string.graphics_driver_app_preference_game_driver));
+        }
+        if (withSystem) {
+            entryList.add(resources.getString(R.string.graphics_driver_app_preference_system));
+        }
+        CharSequence[] filteredEntryList = new CharSequence[entryList.size()];
+        filteredEntryList = entryList.toArray(filteredEntryList);
+        return filteredEntryList;
+    }
+
+    private static boolean hasDriverPackage(PackageManager pm, String driverPackageName) {
+        final ApplicationInfo driverAppInfo;
+        try {
+            driverAppInfo = pm.getApplicationInfo(driverPackageName,
+                    PackageManager.MATCH_SYSTEM_ONLY);
+        } catch (PackageManager.NameNotFoundException e) {
+            return false;
+        }
+        if (driverAppInfo.targetSdkVersion < Build.VERSION_CODES.O) {
+            return false;
+        }
+        final String abi = chooseAbi(driverAppInfo);
+        if (abi == null) {
+            return false;
+        }
+        return true;
+    }
+
+    private static String chooseAbi(ApplicationInfo ai) {
+        final String isa = VMRuntime.getCurrentInstructionSet();
+        if (ai.primaryCpuAbi != null
+                && isa.equals(VMRuntime.getInstructionSet(ai.primaryCpuAbi))) {
+            return ai.primaryCpuAbi;
+        }
+        if (ai.secondaryCpuAbi != null
+                && isa.equals(VMRuntime.getInstructionSet(ai.secondaryCpuAbi))) {
+            return ai.secondaryCpuAbi;
+        }
+        return null;
+    }
 }
diff --git a/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java b/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java
index 97ee221..530a541 100644
--- a/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java
+++ b/src/com/android/settings/display/darkmode/DarkModeSettingsFragment.java
@@ -15,19 +15,19 @@
 package com.android.settings.display.darkmode;
 
 import android.app.Dialog;
-import android.app.TimePickerDialog;
-import android.app.UiModeManager;
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.Bundle;
-import android.app.settings.SettingsEnums;
+import android.os.PowerManager;
+
 import androidx.preference.Preference;
+
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.search.SearchIndexable;
 
-import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -143,5 +143,11 @@
     }
 
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.dark_mode_settings);
+            new BaseSearchIndexProvider(R.xml.dark_mode_settings) {
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    return !context.getSystemService(PowerManager.class).isPowerSaveMode();
+                }
+            };
+
 }
diff --git a/src/com/android/settings/media/MediaOutputSlice.java b/src/com/android/settings/media/MediaOutputSlice.java
index 3c9999e..92fa843 100644
--- a/src/com/android/settings/media/MediaOutputSlice.java
+++ b/src/com/android/settings/media/MediaOutputSlice.java
@@ -17,6 +17,7 @@
 package com.android.settings.media;
 
 import static android.app.slice.Slice.EXTRA_RANGE_VALUE;
+import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
 
 import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
 
@@ -24,9 +25,12 @@
 import android.bluetooth.BluetoothAdapter;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
+import android.text.SpannableString;
 import android.text.TextUtils;
+import android.text.style.ForegroundColorSpan;
 import android.util.Log;
 
 import androidx.annotation.VisibleForTesting;
@@ -162,7 +166,7 @@
     }
 
     private ListBuilder.RowBuilder getMediaDeviceRow(MediaDevice device) {
-        final String title = device.getName();
+        final String deviceName = device.getName();
         final PendingIntent broadcastAction =
                 getBroadcastIntent(mContext, device.getId(), device.hashCode());
         final IconCompat deviceIcon = getDeviceIconCompat(device);
@@ -170,9 +174,22 @@
         final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
                 .setTitleItem(deviceIcon, ListBuilder.ICON_IMAGE)
                 .setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon,
-                        ListBuilder.ICON_IMAGE, title))
-                .setTitle(title)
-                .setSubtitle(device.isConnected() ? null : device.getSummary());
+                        ListBuilder.ICON_IMAGE, deviceName));
+        // Append status to tile only for the disconnected Bluetooth device.
+        if (device.getDeviceType() == MediaDevice.MediaDeviceType.TYPE_BLUETOOTH_DEVICE
+                && !device.isConnected()) {
+            final SpannableString spannableTitle = new SpannableString(
+                    mContext.getString(R.string.media_output_disconnected_status, deviceName));
+            spannableTitle.setSpan(new ForegroundColorSpan(Color.GRAY), deviceName.length(),
+                    spannableTitle.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
+            rowBuilder.setTitle(spannableTitle);
+            rowBuilder.setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon,
+                    ListBuilder.ICON_IMAGE, spannableTitle));
+        } else {
+            rowBuilder.setTitle(deviceName);
+            rowBuilder.setPrimaryAction(SliceAction.create(broadcastAction, deviceIcon,
+                    ListBuilder.ICON_IMAGE, deviceName));
+        }
 
         return rowBuilder;
     }
diff --git a/src/com/android/settings/network/telephony/NetworkScanHelper.java b/src/com/android/settings/network/telephony/NetworkScanHelper.java
index eb0d020..6d3cdbb 100644
--- a/src/com/android/settings/network/telephony/NetworkScanHelper.java
+++ b/src/com/android/settings/network/telephony/NetworkScanHelper.java
@@ -25,6 +25,7 @@
 import android.telephony.TelephonyScanManager;
 import android.util.Log;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Executor;
 
@@ -75,37 +76,6 @@
     private static final int MAX_SEARCH_TIME_SEC = 300;
     private static final int INCREMENTAL_RESULTS_PERIODICITY_SEC = 3;
 
-    private static final NetworkScanRequest NETWORK_SCAN_REQUEST =
-            new NetworkScanRequest(
-                    NetworkScanRequest.SCAN_TYPE_ONE_SHOT,
-                    new RadioAccessSpecifier[]{
-                            // GSM
-                            new RadioAccessSpecifier(
-                                    AccessNetworkType.GERAN,
-                                    null /* bands */,
-                                    null /* channels */),
-                            // LTE
-                            new RadioAccessSpecifier(
-                                    AccessNetworkType.EUTRAN,
-                                    null /* bands */,
-                                    null /* channels */),
-                            // WCDMA
-                            new RadioAccessSpecifier(
-                                    AccessNetworkType.UTRAN,
-                                    null /* bands */,
-                                    null /* channels */),
-                            // NR
-                            new RadioAccessSpecifier(
-                                    AccessNetworkType.NGRAN,
-                                    null /* bands */,
-                                    null /* channels */)
-                    },
-                    SEARCH_PERIODICITY_SEC,
-                    MAX_SEARCH_TIME_SEC,
-                    INCREMENTAL_RESULTS,
-                    INCREMENTAL_RESULTS_PERIODICITY_SEC,
-                    null /* List of PLMN ids (MCC-MNC) */);
-
     private final NetworkScanCallback mNetworkScanCallback;
     private final TelephonyManager mTelephonyManager;
     private final TelephonyScanManager.NetworkScanCallback mInternalNetworkScanCallback;
@@ -120,6 +90,47 @@
         mExecutor = executor;
     }
 
+    private NetworkScanRequest createNetworkScanForPreferredAccessNetworks() {
+        long networkTypeBitmap3gpp = mTelephonyManager.getPreferredNetworkTypeBitmask()
+                & TelephonyManager.NETWORK_STANDARDS_FAMILY_BITMASK_3GPP;
+
+        List<RadioAccessSpecifier> radioAccessSpecifiers = new ArrayList<>();
+        // If the allowed network types are unknown or if they are of the right class, scan for
+        // them; otherwise, skip them to save scan time and prevent users from being shown networks
+        // that they can't connect to.
+        if (networkTypeBitmap3gpp == 0
+                || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_2G) != 0) {
+            radioAccessSpecifiers.add(
+                    new RadioAccessSpecifier(AccessNetworkType.GERAN, null, null));
+        }
+        if (networkTypeBitmap3gpp == 0
+                || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_3G) != 0) {
+            radioAccessSpecifiers.add(
+                    new RadioAccessSpecifier(AccessNetworkType.UTRAN, null, null));
+        }
+        if (networkTypeBitmap3gpp == 0
+                || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_4G) != 0) {
+            radioAccessSpecifiers.add(
+                    new RadioAccessSpecifier(AccessNetworkType.EUTRAN, null, null));
+        }
+        if (networkTypeBitmap3gpp == 0
+                || (networkTypeBitmap3gpp & TelephonyManager.NETWORK_CLASS_BITMASK_5G) != 0) {
+            radioAccessSpecifiers.add(
+                    new RadioAccessSpecifier(AccessNetworkType.NGRAN, null, null));
+        }
+
+
+        return new NetworkScanRequest(
+                NetworkScanRequest.SCAN_TYPE_ONE_SHOT,
+                radioAccessSpecifiers.toArray(
+                        new RadioAccessSpecifier[radioAccessSpecifiers.size()]),
+                SEARCH_PERIODICITY_SEC,
+                MAX_SEARCH_TIME_SEC,
+                INCREMENTAL_RESULTS,
+                INCREMENTAL_RESULTS_PERIODICITY_SEC,
+                null /* List of PLMN ids (MCC-MNC) */);
+    }
+
     /**
      * Request a network scan.
      *
@@ -134,7 +145,7 @@
             return;
         }
         mNetworkScanRequester = mTelephonyManager.requestNetworkScan(
-                NETWORK_SCAN_REQUEST,
+                createNetworkScanForPreferredAccessNetworks(),
                 mExecutor,
                 mInternalNetworkScanCallback);
         if (mNetworkScanRequester == null) {
diff --git a/src/com/android/settings/notification/NotificationBackend.java b/src/com/android/settings/notification/NotificationBackend.java
index 138930b..e1b2138 100644
--- a/src/com/android/settings/notification/NotificationBackend.java
+++ b/src/com/android/settings/notification/NotificationBackend.java
@@ -37,14 +37,11 @@
 import android.content.pm.ParceledListSlice;
 import android.content.pm.ShortcutInfo;
 import android.content.pm.ShortcutManager;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.service.notification.ConversationChannelWrapper;
-import android.service.notification.NotifyingApp;
 import android.text.format.DateUtils;
 import android.util.IconDrawableFactory;
 import android.util.Log;
@@ -522,17 +519,17 @@
     }
 
     public Drawable getConversationDrawable(Context context, ShortcutInfo info, String pkg,
-            int uid) {
+            int uid, boolean important) {
         if (info == null) {
             return null;
         }
         ConversationIconFactory iconFactory = new ConversationIconFactory(context,
                 context.getSystemService(LauncherApps.class),
-                context.getPackageManager(), IconDrawableFactory.newInstance(context),
+                context.getPackageManager(),
+                IconDrawableFactory.newInstance(context, false),
                 context.getResources().getDimensionPixelSize(
                         R.dimen.conversation_icon_size));
-        return new BitmapDrawable(context.getResources(),
-                iconFactory.getConversationBitmap(info, pkg, uid));
+        return iconFactory.getConversationDrawable(info, pkg, uid, important);
     }
 
     public void requestPinShortcut(Context context, ShortcutInfo shortcutInfo) {
diff --git a/src/com/android/settings/notification/app/AppConversationListPreferenceController.java b/src/com/android/settings/notification/app/AppConversationListPreferenceController.java
index b36c294..32278db 100644
--- a/src/com/android/settings/notification/app/AppConversationListPreferenceController.java
+++ b/src/com/android/settings/notification/app/AppConversationListPreferenceController.java
@@ -127,7 +127,8 @@
                 conversation.getParentChannelLabel(), conversation.getGroupLabel())
                 : conversation.getParentChannelLabel());
         if (si != null) {
-            pref.setIcon(mBackend.getConversationDrawable(mContext, si, mAppRow.pkg, mAppRow.uid));
+            pref.setIcon(mBackend.getConversationDrawable(mContext, si, mAppRow.pkg, mAppRow.uid,
+                    conversation.getNotificationChannel().isImportantConversation()));
         }
         pref.setKey(conversation.getNotificationChannel().getId());
 
diff --git a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java
index 369f3af..c74b032 100644
--- a/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java
+++ b/src/com/android/settings/notification/app/ConversationHeaderPreferenceController.java
@@ -86,6 +86,7 @@
                     .setHasAppInfoLink(true)
                     .setRecyclerView(mFragment.getListView(), mFragment.getSettingsLifecycle())
                     .done(activity, mContext);
+
             pref.findViewById(R.id.entity_header).setVisibility(View.VISIBLE);
         }
     }
diff --git a/src/com/android/settings/notification/app/ConversationImportantPreferenceController.java b/src/com/android/settings/notification/app/ConversationImportantPreferenceController.java
index 35e1f7d..0b1ee16 100644
--- a/src/com/android/settings/notification/app/ConversationImportantPreferenceController.java
+++ b/src/com/android/settings/notification/app/ConversationImportantPreferenceController.java
@@ -74,8 +74,8 @@
         mChannel.setImportantConversation(value);
         if (value && bubbleImportantConversations()) {
             mChannel.setAllowBubbles(true);
-            mDependentFieldListener.onFieldValueChanged();
         }
+        mDependentFieldListener.onFieldValueChanged();
         saveChannel();
 
         return true;
diff --git a/src/com/android/settings/notification/app/ConversationListPreferenceController.java b/src/com/android/settings/notification/app/ConversationListPreferenceController.java
index 79ed28c..0ca31df 100644
--- a/src/com/android/settings/notification/app/ConversationListPreferenceController.java
+++ b/src/com/android/settings/notification/app/ConversationListPreferenceController.java
@@ -88,7 +88,8 @@
         pref.setTitle(getTitle(conversation));
         pref.setSummary(getSummary(conversation));
         pref.setIcon(mBackend.getConversationDrawable(mContext, conversation.getShortcutInfo(),
-                conversation.getPkg(), conversation.getUid()));
+                conversation.getPkg(), conversation.getUid(),
+                conversation.getNotificationChannel().isImportantConversation()));
         pref.setKey(conversation.getNotificationChannel().getId());
         pref.setIntent(getIntent(conversation, pref.getTitle()));
 
diff --git a/src/com/android/settings/notification/app/NotificationSettings.java b/src/com/android/settings/notification/app/NotificationSettings.java
index 9d52178..af1d9c1 100644
--- a/src/com/android/settings/notification/app/NotificationSettings.java
+++ b/src/com/android/settings/notification/app/NotificationSettings.java
@@ -49,6 +49,7 @@
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.notification.ConversationIconFactory;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -204,7 +205,8 @@
                 mContext, mPkg, mUid, mChannel.getConversationId());
         if (mConversationInfo != null) {
             mConversationDrawable = mBackend.getConversationDrawable(
-                    mContext, mConversationInfo, mAppRow.pkg, mAppRow.uid);
+                    mContext, mConversationInfo, mAppRow.pkg, mAppRow.uid,
+                    mChannel.isImportantConversation());
         }
     }
 
@@ -329,6 +331,12 @@
 
     protected class DependentFieldListener {
         protected void onFieldValueChanged() {
+            // Reload the conversation drawable, which shows some channel/conversation state
+            if (mConversationDrawable != null && mConversationDrawable
+                    instanceof ConversationIconFactory.ConversationIconDrawable) {
+                ((ConversationIconFactory.ConversationIconDrawable) mConversationDrawable)
+                        .setImportant(mChannel.isImportantConversation());
+            }
             final PreferenceScreen screen = getPreferenceScreen();
             for (NotificationPreferenceController controller : mControllers) {
                 controller.displayPreference(screen);
diff --git a/src/com/android/settings/notification/history/NotificationHistoryActivity.java b/src/com/android/settings/notification/history/NotificationHistoryActivity.java
index fbbda21..8c00b5d 100644
--- a/src/com/android/settings/notification/history/NotificationHistoryActivity.java
+++ b/src/com/android/settings/notification/history/NotificationHistoryActivity.java
@@ -241,7 +241,16 @@
 
         @Override
         public void onListenerConnected() {
-            StatusBarNotification[] snoozed = getSnoozedNotifications();
+            StatusBarNotification[] snoozed = null;
+            StatusBarNotification[] dismissed = null;
+            try {
+                snoozed = getSnoozedNotifications();
+                dismissed = mNm.getHistoricalNotifications(
+                    NotificationHistoryActivity.this.getPackageName(), 6, false);
+            } catch (SecurityException | RemoteException e) {
+                Log.d(TAG, "OnPaused called while trying to retrieve notifications");
+            }
+
             mSnoozedRv = mSnoozeView.findViewById(R.id.notification_list);
             LinearLayoutManager lm = new LinearLayoutManager(NotificationHistoryActivity.this);
             mSnoozedRv.setLayoutManager(lm);
@@ -259,26 +268,23 @@
                         new ArrayList<>(Arrays.asList(snoozed)));
             }
 
-            try {
-                StatusBarNotification[] dismissed = mNm.getHistoricalNotifications(
-                        NotificationHistoryActivity.this.getPackageName(), 6, false);
-                mDismissedRv = mDismissView.findViewById(R.id.notification_list);
-                LinearLayoutManager dismissLm =
-                        new LinearLayoutManager(NotificationHistoryActivity.this);
-                mDismissedRv.setLayoutManager(dismissLm);
-                mDismissedRv.setAdapter(
-                        new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm));
-                DividerItemDecoration dismissDivider = new DividerItemDecoration(
-                        mDismissedRv.getContext(), dismissLm.getOrientation());
-                mDismissedRv.addItemDecoration(dismissDivider);
-                mDismissedRv.setNestedScrollingEnabled(false);
+            mDismissedRv = mDismissView.findViewById(R.id.notification_list);
+            LinearLayoutManager dismissLm =
+                new LinearLayoutManager(NotificationHistoryActivity.this);
+            mDismissedRv.setLayoutManager(dismissLm);
+            mDismissedRv.setAdapter(
+                new NotificationSbnAdapter(NotificationHistoryActivity.this, mPm));
+            DividerItemDecoration dismissDivider = new DividerItemDecoration(
+                mDismissedRv.getContext(), dismissLm.getOrientation());
+            mDismissedRv.addItemDecoration(dismissDivider);
+            mDismissedRv.setNestedScrollingEnabled(false);
 
-                ((NotificationSbnAdapter) mDismissedRv.getAdapter()).onRebuildComplete(
-                        new ArrayList<>(Arrays.asList(dismissed)));
-                mDismissView.setVisibility(View.VISIBLE);
-            } catch (Exception e) {
-                Slog.e(TAG, "Cannot load recently dismissed", e);
+            if (dismissed == null || dismissed.length == 0) {
                 mDismissView.setVisibility(View.GONE);
+            } else {
+                mDismissView.setVisibility(View.VISIBLE);
+                ((NotificationSbnAdapter) mDismissedRv.getAdapter()).onRebuildComplete(
+                    new ArrayList<>(Arrays.asList(dismissed)));
             }
         }
 
diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java
index 61dee15..dd9b53c 100644
--- a/src/com/android/settings/panel/VolumePanel.java
+++ b/src/com/android/settings/panel/VolumePanel.java
@@ -48,7 +48,7 @@
 
     @Override
     public CharSequence getTitle() {
-        return mContext.getText(R.string.volume_connectivity_panel_title);
+        return mContext.getText(R.string.sound_settings);
     }
 
     @Override
diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java
index 440882f..654d50b 100644
--- a/src/com/android/settings/widget/EntityHeaderController.java
+++ b/src/com/android/settings/widget/EntityHeaderController.java
@@ -135,7 +135,8 @@
      */
     public EntityHeaderController setIcon(Drawable icon) {
         if (icon != null) {
-            mIcon = icon.getConstantState().newDrawable(mAppContext.getResources());
+            final Drawable.ConstantState state = icon.getConstantState();
+            mIcon = state != null ? state.newDrawable(mAppContext.getResources()) : icon;
         }
         return this;
     }
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index d9b9e3c..5264e10 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -82,6 +82,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.stream.Collectors;
 
 /**
  * The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigUiBase} to
@@ -133,6 +134,14 @@
     public static final int WIFI_TTLS_PHASE2_MSCHAPV2  = 2;
     public static final int WIFI_TTLS_PHASE2_GTC       = 3;
 
+    private static final String UNDESIRED_CERTIFICATE_MACRANDSECRET = "MacRandSecret";
+    private static final String UNDESIRED_CERTIFICATE_MACRANDSAPSECRET = "MacRandSapSecret";
+    @VisibleForTesting
+    static final String[] UNDESIRED_CERTIFICATES = {
+        UNDESIRED_CERTIFICATE_MACRANDSECRET,
+        UNDESIRED_CERTIFICATE_MACRANDSAPSECRET
+    };
+
     /* Phase2 methods supported by PEAP are limited */
     private ArrayAdapter<CharSequence> mPhase2PeapAdapter;
     /* Phase2 methods supported by TTLS are limited */
@@ -1425,7 +1434,8 @@
         return KeyStore.getInstance();
     }
 
-    private void loadCertificates(
+    @VisibleForTesting
+    void loadCertificates(
             Spinner spinner,
             String prefix,
             String noCertificateString,
@@ -1441,12 +1451,25 @@
         if (showUsePreinstalledCertOption) {
             certs.add(mUseSystemCertsString);
         }
+
+        String[] certificateNames = null;
         try {
-            certs.addAll(
-                Arrays.asList(getKeyStore().list(prefix, android.os.Process.WIFI_UID)));
+            certificateNames = getKeyStore().list(prefix, android.os.Process.WIFI_UID);
         } catch (Exception e) {
             Log.e(TAG, "can't get the certificate list from KeyStore");
         }
+        if (certificateNames != null && certificateNames.length != 0) {
+            certs.addAll(Arrays.stream(certificateNames)
+                    .filter(certificateName -> {
+                        for (String undesired : UNDESIRED_CERTIFICATES) {
+                            if (certificateName.startsWith(undesired)) {
+                                return false;
+                            }
+                        }
+                        return true;
+                    }).collect(Collectors.toList()));
+        }
+
         if (mAccessPointSecurity != AccessPoint.SECURITY_EAP_SUITE_B) {
             certs.add(noCertificateString);
         }
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index 8352a76..830f061 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -82,6 +82,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
+import java.util.stream.Collectors;
 
 /**
  * The class for allowing UIs like {@link WifiDialog2} and {@link WifiConfigUiBase2} to
@@ -133,6 +134,14 @@
     public static final int WIFI_TTLS_PHASE2_MSCHAPV2  = 2;
     public static final int WIFI_TTLS_PHASE2_GTC       = 3;
 
+    private static final String UNDESIRED_CERTIFICATE_MACRANDSECRET = "MacRandSecret";
+    private static final String UNDESIRED_CERTIFICATE_MACRANDSAPSECRET = "MacRandSapSecret";
+    @VisibleForTesting
+    static final String[] UNDESIRED_CERTIFICATES = {
+        UNDESIRED_CERTIFICATE_MACRANDSECRET,
+        UNDESIRED_CERTIFICATE_MACRANDSAPSECRET
+    };
+
     /* Phase2 methods supported by PEAP are limited */
     private ArrayAdapter<CharSequence> mPhase2PeapAdapter;
     /* Phase2 methods supported by TTLS are limited */
@@ -1421,7 +1430,8 @@
         return KeyStore.getInstance();
     }
 
-    private void loadCertificates(
+    @VisibleForTesting
+    void loadCertificates(
             Spinner spinner,
             String prefix,
             String noCertificateString,
@@ -1437,11 +1447,25 @@
         if (showUsePreinstalledCertOption) {
             certs.add(mUseSystemCertsString);
         }
+
+        String[] certificateNames = null;
         try {
-            certs.addAll(Arrays.asList(getKeyStore().list(prefix, android.os.Process.WIFI_UID)));
+            certificateNames = getKeyStore().list(prefix, android.os.Process.WIFI_UID);
         } catch (Exception e) {
             Log.e(TAG, "can't get the certificate list from KeyStore");
         }
+        if (certificateNames != null && certificateNames.length != 0) {
+            certs.addAll(Arrays.stream(certificateNames)
+                    .filter(certificateName -> {
+                        for (String undesired : UNDESIRED_CERTIFICATES) {
+                            if (certificateName.startsWith(undesired)) {
+                                return false;
+                            }
+                        }
+                        return true;
+                    }).collect(Collectors.toList()));
+        }
+
         if (mWifiEntrySecurity != WifiEntry.SECURITY_EAP_SUITE_B) {
             certs.add(noCertificateString);
         }
diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java
index 1b3a731..f88a4df 100644
--- a/src/com/android/settings/wifi/WifiSettings2.java
+++ b/src/com/android/settings/wifi/WifiSettings2.java
@@ -423,8 +423,8 @@
                 final WifiConfiguration wifiConfiguration = data.getParcelableExtra(
                         ConfigureWifiEntryFragment.NETWORK_CONFIG_KEY);
                 if (wifiConfiguration != null) {
-                    mWifiManager.save(wifiConfiguration,
-                            new WifiSaveThenConnectActionListener(wifiConfiguration));
+                    mWifiManager.connect(wifiConfiguration,
+                            new WifiConnectActionListener());
                 }
             }
             return;
@@ -970,29 +970,6 @@
                 fullScreenEdit));
     }
 
-    private class WifiSaveThenConnectActionListener implements WifiManager.ActionListener {
-        final WifiConfiguration mWifiConfiguration;
-
-        WifiSaveThenConnectActionListener(WifiConfiguration wifiConfiguration) {
-            mWifiConfiguration = wifiConfiguration;
-        }
-
-        @Override
-        public void onSuccess() {
-            mWifiManager.connect(mWifiConfiguration, new WifiConnectActionListener());
-        }
-
-        @Override
-        public void onFailure(int reason) {
-            final Activity activity = getActivity();
-            if (isFisishingOrDestroyed(activity)) {
-                return;
-            }
-
-            Toast.makeText(activity, R.string.wifi_failed_save_message, Toast.LENGTH_SHORT).show();
-        }
-    };
-
     private class WifiConnectActionListener implements WifiManager.ActionListener {
         @Override
         public void onSuccess() {
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
index 9aca92e..e4f5b1f 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageListTest.java
@@ -38,6 +38,7 @@
 import android.widget.Spinner;
 
 import androidx.fragment.app.FragmentActivity;
+import androidx.loader.app.LoaderManager;
 import androidx.preference.PreferenceManager;
 
 import com.android.settings.R;
@@ -71,6 +72,8 @@
     private MobileDataEnabledListener mMobileDataEnabledListener;
     @Mock
     private TemplatePreference.NetworkServices mNetworkServices;
+    @Mock
+    private LoaderManager mLoaderManager;
 
     private Activity mActivity;
     private DataUsageList mDataUsageList;
@@ -90,6 +93,7 @@
         ReflectionHelpers.setField(mDataUsageList, "mDataStateListener",
                 mMobileDataEnabledListener);
         ReflectionHelpers.setField(mDataUsageList, "services", mNetworkServices);
+        doReturn(mLoaderManager).when(mDataUsageList).getLoaderManager();
     }
 
     @Test
@@ -216,6 +220,14 @@
         assertThat(spinner.getVisibility()).isEqualTo(View.VISIBLE);
     }
 
+    @Test
+    public void onPause_shouldDestroyLoaders() {
+        mDataUsageList.onPause();
+
+        verify(mLoaderManager).destroyLoader(DataUsageList.LOADER_CHART_DATA);
+        verify(mLoaderManager).destroyLoader(DataUsageList.LOADER_SUMMARY);
+    }
+
     private View getHeader() {
         final View rootView = LayoutInflater.from(mActivity)
                 .inflate(R.layout.preference_list_fragment, null, false);
diff --git a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceControllerTest.java
index 366a18d..920e9d1 100644
--- a/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableForAllAppsPreferenceControllerTest.java
@@ -82,6 +82,8 @@
                 mResolver, Settings.Global.GAME_DRIVER_ALL_APPS, GAME_DRIVER_DEFAULT);
 
         mController = new GraphicsDriverEnableForAllAppsPreferenceController(mContext, "testKey");
+        mController.mEntryList = mContext.getResources().getStringArray(
+                R.array.graphics_driver_all_apps_preference_values);
         when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
         mController.displayPreference(mScreen);
     }
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
index fa926df..7097889 100644
--- a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
+++ b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java
@@ -35,6 +35,7 @@
 import android.media.session.MediaController;
 import android.media.session.MediaSession;
 import android.net.Uri;
+import android.os.Process;
 import android.text.TextUtils;
 
 import androidx.slice.Slice;
@@ -109,7 +110,7 @@
         mAudioManager.setMode(AudioManager.MODE_NORMAL);
         sMediaOutputIndicatorWorker = spy(new MediaOutputIndicatorWorker(mContext,
                 MEDIA_OUTPUT_INDICATOR_SLICE_URI));
-        mToken = new MediaSession.Token(null);
+        mToken = new MediaSession.Token(Process.myUid(), null);
         // Set-up specs for SliceMetadata.
         SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
         // Setup Bluetooth environment
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
index adbd14d..f71c090 100644
--- a/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
+++ b/tests/robotests/src/com/android/settings/media/MediaOutputSliceTest.java
@@ -44,6 +44,7 @@
 import androidx.slice.core.SliceQuery;
 import androidx.slice.widget.SliceLiveData;
 
+import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settingslib.media.LocalMediaManager;
 import com.android.settingslib.media.MediaDevice;
@@ -156,6 +157,26 @@
     }
 
     @Test
+    public void getSlice_disconnectedBluetooth_verifyTitle() {
+        mDevices.clear();
+        final MediaDevice device = mock(MediaDevice.class);
+        when(device.getName()).thenReturn(TEST_DEVICE_1_NAME);
+        when(device.getIcon()).thenReturn(mTestDrawable);
+        when(device.getMaxVolume()).thenReturn(100);
+        when(device.isConnected()).thenReturn(false);
+
+        mDevices.add(device);
+        mMediaDeviceUpdateWorker.onDeviceListUpdate(mDevices);
+
+        final Slice mediaSlice = mMediaOutputSlice.getSlice();
+        final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
+
+        final SliceAction primaryAction = metadata.getPrimaryAction();
+        assertThat(primaryAction.getTitle().toString()).isEqualTo(TEST_DEVICE_1_NAME + " ("
+                + mContext.getText(R.string.media_output_disconnected_status) + ")");
+    }
+
+    @Test
     public void onNotifyChange_foundMediaDevice_connect() {
         mDevices.clear();
         final MediaDevice device = mock(MediaDevice.class);
diff --git a/tests/robotests/src/com/android/settings/notification/app/ConversationImportantPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/app/ConversationImportantPreferenceControllerTest.java
index 783b40f..42b7859 100644
--- a/tests/robotests/src/com/android/settings/notification/app/ConversationImportantPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/app/ConversationImportantPreferenceControllerTest.java
@@ -26,7 +26,6 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -156,7 +155,7 @@
         assertTrue(channel.isImportantConversation());
         assertFalse(channel.canBubble());
         verify(mBackend, times(1)).updateChannel(any(), anyInt(), any());
-        verify(mDependentFieldListener, never()).onFieldValueChanged();
+        verify(mDependentFieldListener, times(1)).onFieldValueChanged();
     }
 
     @Test
@@ -202,6 +201,6 @@
         assertFalse(channel.isImportantConversation());
         assertFalse(channel.canBubble());
         verify(mBackend, times(1)).updateChannel(any(), anyInt(), any());
-        verify(mDependentFieldListener, never()).onFieldValueChanged();
+        verify(mDependentFieldListener, times(1)).onFieldValueChanged();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index e0dc97f..c9bc346 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -241,6 +241,20 @@
     }
 
     @Test
+    public void loadCertificates_undesiredCertificates_shouldNotLoadUndesiredCertificates() {
+        final Spinner spinner = new Spinner(mContext);
+        when(mKeyStore.list(anyString())).thenReturn(WifiConfigController.UNDESIRED_CERTIFICATES);
+
+        mController.loadCertificates(spinner,
+                "prefix",
+                "doNotProvideEapUserCertString",
+                false /* showMultipleCerts */,
+                false /* showUsePreinstalledCertOption */);
+
+        assertThat(spinner.getAdapter().getCount()).isEqualTo(1);   // doNotProvideEapUserCertString
+    }
+
+    @Test
     public void ssidGetFocus_addNewNetwork_shouldReturnTrue() {
         mController = new TestWifiConfigController2(mConfigUiBase, mView, null /* wifiEntry */,
                 WifiConfigUiBase2.MODE_CONNECT);
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index 3a17b6c..9146998 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -241,6 +241,20 @@
     }
 
     @Test
+    public void loadCertificates_undesiredCertificates_shouldNotLoadUndesiredCertificates() {
+        final Spinner spinner = new Spinner(mContext);
+        when(mKeyStore.list(anyString())).thenReturn(WifiConfigController.UNDESIRED_CERTIFICATES);
+
+        mController.loadCertificates(spinner,
+                "prefix",
+                "doNotProvideEapUserCertString",
+                false /* showMultipleCerts */,
+                false /* showUsePreinstalledCertOption */);
+
+        assertThat(spinner.getAdapter().getCount()).isEqualTo(1);   // doNotProvideEapUserCertString
+    }
+
+    @Test
     public void ssidGetFocus_addNewNetwork_shouldReturnTrue() {
         mController = new TestWifiConfigController(mConfigUiBase, mView, null /* accessPoint */,
                 WifiConfigUiBase.MODE_CONNECT);