Merge "Update R accessibility assets and strings (5/n)" into rvc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 580ca88..6ff3a00 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6157,13 +6157,13 @@
     <!-- Title of Wi-Fi certificate [CHAR LIMIT=30] -->
     <string name="wifi_certificate">Wi\u2011Fi certificate</string>
     <!-- Title of warning shown to the user before they can install a CA certificate [CHAR LIMIT=NONE] -->
-    <string name="ca_certificate_warning_title">Your privacy is at risk</string>
+    <string name="ca_certificate_warning_title">Your data won\u2019t be private</string>
     <!-- Description of warning shown to the user before they can install a CA certificate [CHAR LIMIT=NONE] -->
-    <string name="ca_certificate_warning_description">CA certificates are used by websites, apps, and VPNs for encryption. Only install CA certificates from organizations you trust. \n\n If you install a CA certificate, the certificate owner could access your information, such as passwords, messages, or credit card details, from websites you visit or apps you use - even if that information is encrypted.</string>
+    <string name="ca_certificate_warning_description">CA certificates are used by websites, apps, and VPNs for encryption. Only install CA certificates from organizations you trust. \n\n If you install a CA certificate, the certificate owner could access your data, such as passwords or credit card details, from websites you visit or apps you use – even if your data is encrypted.</string>
     <!-- Label for button to not install a certificate [CHAR_LIMIT=50] -->
     <string name="certificate_warning_dont_install">Don\u2019t install</string>
     <!-- Label for button to continue installing a certificate [CHAR_LIMIT=50] -->
-    <string name="certificate_warning_install_anyway">Install anyways</string>
+    <string name="certificate_warning_install_anyway">Install anyway</string>
     <!-- Toast message that a certificate was not installed -->
     <string name="cert_not_installed">Certificate not installed</string>
 
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 6bb75a5..a9b496a 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -28,6 +28,8 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionInfo;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -53,6 +55,7 @@
 
 import com.android.settings.network.ProxySubscriptionManager;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -220,8 +223,30 @@
             Bundle savedInstanceState) {
 
         final int numSims = mProxySubscriptionMgr.getActiveSubscriptionInfoCountMax();
+        final List<SubscriptionInfo> subInfoList =
+                mProxySubscriptionMgr.getActiveSubscriptionsInfo();
         mSlotId = 0;
-        if (numSims > 1) {
+        final List<SubscriptionInfo> componenterList = new ArrayList<>();
+
+        for (int i = 0; i < numSims; ++i) {
+            final SubscriptionInfo subInfo =
+                    getActiveSubscriptionInfoForSimSlotIndex(subInfoList, i);
+            final CarrierConfigManager carrierConfigManager = getContext().getSystemService(
+                    CarrierConfigManager.class);
+            final PersistableBundle bundle = carrierConfigManager.getConfigForSubId(
+                    subInfo.getSubscriptionId());
+            if (bundle != null
+                    && !bundle.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
+                componenterList.add(subInfo);
+            }
+        }
+
+        if (componenterList.size() == 0) {
+            Log.e(TAG, "onCreateView: no sim info");
+            return null;
+        }
+
+        if (componenterList.size() > 1) {
             final View view = inflater.inflate(R.layout.icc_lock_tabs, container, false);
             final ViewGroup prefs_container = (ViewGroup) view.findViewById(R.id.prefs_container);
             Utils.prepareCustomPreferencesList(container, view, prefs_container, false);
@@ -236,25 +261,22 @@
             mTabHost.setOnTabChangedListener(mTabListener);
             mTabHost.clearAllTabs();
 
-            final List<SubscriptionInfo> subInfoList =
-                    mProxySubscriptionMgr.getActiveSubscriptionsInfo();
-            for (int i = 0; i < numSims; ++i) {
-                final SubscriptionInfo subInfo =
-                        getActiveSubscriptionInfoForSimSlotIndex(subInfoList, i);
-                mTabHost.addTab(buildTabSpec(String.valueOf(i),
+            for (SubscriptionInfo subInfo : componenterList) {
+                int slot = subInfo.getSimSlotIndex();
+                mTabHost.addTab(buildTabSpec(String.valueOf(slot),
                         String.valueOf(subInfo == null
-                            ? getContext().getString(R.string.sim_editor_title, i + 1)
-                            : subInfo.getDisplayName())));
+                                ? getContext().getString(R.string.sim_editor_title, slot + 1)
+                                : subInfo.getDisplayName())));
             }
-            final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(
-                    subInfoList, mSlotId);
-            mSubId = sir.getSubscriptionId();
+
+            mSubId = componenterList.get(0).getSubscriptionId();
 
             if (savedInstanceState != null && savedInstanceState.containsKey(CURRENT_TAB)) {
                 mTabHost.setCurrentTabByTag(savedInstanceState.getString(CURRENT_TAB));
             }
             return view;
         } else {
+            mSlotId = componenterList.get(0).getSimSlotIndex();
             return super.onCreateView(inflater, container, savedInstanceState);
         }
     }
diff --git a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
index 300dc0f..bf5c51b 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
@@ -39,7 +39,7 @@
     public void onReceive(Context context, Intent intent) {
         if (DEBUG) Log.d(TAG, "Received " + intent.getAction());
         String action = intent.getAction();
-        if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
+        if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
             if (mBatterySaverListener != null) {
                 mBatterySaverListener.onPowerSaveModeChanged();
             }
@@ -55,7 +55,7 @@
     public void setListening(boolean listening) {
         if (listening && !mRegistered) {
             final IntentFilter ifilter = new IntentFilter();
-            ifilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
+            ifilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
             ifilter.addAction(Intent.ACTION_BATTERY_CHANGED);
             mContext.registerReceiver(this, ifilter);
             mRegistered = true;
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index b505c2f..076a87b 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -26,6 +26,10 @@
 import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_TD_SCDMA;
 import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_UNKNOWN;
 import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.WCDMA;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -379,8 +383,10 @@
                     context.getContentResolver(),
                     android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId,
                     TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
-            if (settingsNetworkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA
-                    || settingsNetworkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO) {
+            if (settingsNetworkMode == NETWORK_MODE_LTE_GSM_WCDMA
+                    || settingsNetworkMode == NETWORK_MODE_LTE_CDMA_EVDO
+                    || settingsNetworkMode == NETWORK_MODE_NR_LTE_GSM_WCDMA
+                    || settingsNetworkMode == NETWORK_MODE_NR_LTE_CDMA_EVDO) {
                 return true;
             }
 
@@ -407,8 +413,10 @@
                 android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId,
                 TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
         if (isWorldMode(context, subId)) {
-            if (networkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO
-                    || networkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA) {
+            if (networkMode == NETWORK_MODE_LTE_CDMA_EVDO
+                    || networkMode == NETWORK_MODE_LTE_GSM_WCDMA
+                    || networkMode == NETWORK_MODE_NR_LTE_CDMA_EVDO
+                    || networkMode == NETWORK_MODE_NR_LTE_GSM_WCDMA) {
                 return true;
             } else if (shouldSpeciallyUpdateGsmCdma(context, subId)) {
                 return true;
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
index e90a240..023f89e 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
@@ -16,6 +16,9 @@
 
 package com.android.settings.network.telephony.cdma;
 
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA;
+
 import android.content.Context;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
@@ -53,8 +56,9 @@
                 mContext.getContentResolver(),
                 Settings.Global.PREFERRED_NETWORK_MODE + mSubId,
                 TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
-        listPreference.setEnabled(
-                settingsNetworkMode != TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
+        final boolean enableList = settingsNetworkMode != NETWORK_MODE_LTE_GSM_WCDMA
+                && settingsNetworkMode != NETWORK_MODE_NR_LTE_GSM_WCDMA;
+        listPreference.setEnabled(enableList);
     }
 
     @Override
diff --git a/src/com/android/settings/panel/MediaOutputGroupPanel.java b/src/com/android/settings/panel/MediaOutputGroupPanel.java
index 4a37c52..d98c0b1 100644
--- a/src/com/android/settings/panel/MediaOutputGroupPanel.java
+++ b/src/com/android/settings/panel/MediaOutputGroupPanel.java
@@ -148,7 +148,7 @@
     @Override
     public void onDeviceListUpdate(List<MediaDevice> devices) {
         if (mCallback != null) {
-            mCallback.onGroupChanged();
+            mCallback.onHeaderChanged();
         }
     }
 
diff --git a/src/com/android/settings/panel/MediaOutputPanel.java b/src/com/android/settings/panel/MediaOutputPanel.java
index 1145c42..2a9669a 100644
--- a/src/com/android/settings/panel/MediaOutputPanel.java
+++ b/src/com/android/settings/panel/MediaOutputPanel.java
@@ -82,20 +82,6 @@
     private MediaOutputPanel(Context context, String packageName) {
         mContext = context.getApplicationContext();
         mPackageName = TextUtils.isEmpty(packageName) ? "" : packageName;
-
-        if (!TextUtils.isEmpty(mPackageName)) {
-            mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
-            for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) {
-                if (TextUtils.equals(controller.getPackageName(), mPackageName)) {
-                    mMediaController = controller;
-                    break;
-                }
-            }
-        }
-
-        if (mMediaController == null) {
-            Log.e(TAG, "Unable to find " + mPackageName + " media controller");
-        }
     }
 
     @Override
@@ -228,6 +214,19 @@
 
     @OnLifecycleEvent(ON_START)
     public void onStart() {
+        if (!TextUtils.isEmpty(mPackageName)) {
+            mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
+            for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) {
+                if (TextUtils.equals(controller.getPackageName(), mPackageName)) {
+                    mMediaController = controller;
+                    mMediaController.registerCallback(mCb);
+                    break;
+                }
+            }
+        }
+        if (mMediaController == null) {
+            Log.d(TAG, "No media controller for " + mPackageName);
+        }
         if (mLocalMediaManager == null) {
             mLocalMediaManager = new LocalMediaManager(mContext, mPackageName, null);
         }
@@ -237,6 +236,9 @@
 
     @OnLifecycleEvent(ON_STOP)
     public void onStop() {
+        if (mMediaController != null) {
+            mMediaController.unregisterCallback(mCb);
+        }
         mLocalMediaManager.unregisterCallback(this);
         mLocalMediaManager.stopScan();
     }
@@ -245,4 +247,13 @@
     public int getViewType() {
         return PanelContent.VIEW_TYPE_SLIDER;
     }
+
+    private final MediaController.Callback mCb = new MediaController.Callback() {
+        @Override
+        public void onMetadataChanged(MediaMetadata metadata) {
+            if (mCallback != null) {
+                mCallback.onHeaderChanged();
+            }
+        }
+    };
 }
diff --git a/src/com/android/settings/panel/PanelContentCallback.java b/src/com/android/settings/panel/PanelContentCallback.java
index ce8ea22..989082f 100644
--- a/src/com/android/settings/panel/PanelContentCallback.java
+++ b/src/com/android/settings/panel/PanelContentCallback.java
@@ -28,8 +28,8 @@
     void onCustomizedButtonStateChanged();
 
     /**
-     * It will be called when group content is changed. For example, to add/remove a device into
+     * It will be called when header content is changed. For example, to add/remove a device into
      * a group
      */
-    void onGroupChanged();
+    void onHeaderChanged();
 }
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 30cc2a8..ed5c755 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -426,8 +426,10 @@
         }
 
         @Override
-        public void onGroupChanged() {
+        public void onHeaderChanged() {
             ThreadUtils.postOnMainThread(() -> {
+                mTitleIcon.setImageIcon(mPanel.getIcon().toIcon(getContext()));
+                mHeaderTitle.setText(mPanel.getTitle());
                 mHeaderSubtitle.setText(mPanel.getSubTitle());
             });
         }
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 6809f35..755d158 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -42,6 +42,7 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.os.storage.StorageManager;
+import android.service.persistentdata.PersistentDataBlockManager;
 import android.text.TextUtils;
 import android.util.EventLog;
 import android.util.Log;
@@ -281,7 +282,11 @@
         }
 
         protected boolean canRunBeforeDeviceProvisioned() {
-            return false;
+            PersistentDataBlockManager pdbm = (PersistentDataBlockManager)
+                    getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
+
+            // Can only run during setup if factory reset protection has already been cleared
+            return (pdbm != null && pdbm.getDataBlockSize() == 0);
         }
 
         protected Class<? extends ChooseLockGeneric.InternalActivity> getInternalActivityClass() {
diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java
index 4bffbf5..19f2941 100644
--- a/src/com/android/settings/password/SetNewPasswordActivity.java
+++ b/src/com/android/settings/password/SetNewPasswordActivity.java
@@ -110,7 +110,7 @@
 
     @Override
     public void launchChooseLock(Bundle chooseLockFingerprintExtras) {
-        final boolean isInSetupWizard = !WizardManagerHelper.isDeviceProvisioned(this);
+        final boolean isInSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
         Intent intent = isInSetupWizard ? new Intent(this, SetupChooseLockGeneric.class)
                 : new Intent(this, ChooseLockGeneric.class);
         intent.setAction(mNewPasswordAction);
diff --git a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
index 237e58f..bb3c762 100644
--- a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
+++ b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
@@ -61,12 +61,14 @@
 import androidx.annotation.Nullable;
 import androidx.slice.SliceViewManager;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.slices.SettingsSliceProvider;
 import com.android.settingslib.drawer.ActivityTile;
+import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.search.Indexable;
@@ -379,9 +381,7 @@
         final String currentPackageName = context.getPackageName();
         for (DashboardCategory category : dashboardFeatureProvider.getAllCategories()) {
             for (Tile tile : category.getTiles()) {
-                if (currentPackageName.equals(tile.getPackageName())
-                        && tile instanceof ActivityTile) {
-                    // Skip Settings injected items because they should be indexed in the sub-pages.
+                if (!isEligibleForIndexing(currentPackageName, tile)) {
                     continue;
                 }
                 final SearchIndexableRaw raw = new SearchIndexableRaw(context);
@@ -402,6 +402,20 @@
         return rawList;
     }
 
+    @VisibleForTesting
+    boolean isEligibleForIndexing(String packageName, Tile tile) {
+        if (TextUtils.equals(packageName, tile.getPackageName())
+                && tile instanceof ActivityTile) {
+            // Skip Settings injected items because they should be indexed in the sub-pages.
+            return false;
+        }
+        if (TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
+            // Skip homepage injected items since we would like to index their target activity.
+            return false;
+        }
+        return true;
+    }
+
     private static Object[] createIndexableRawColumnObjects(SearchIndexableRaw raw) {
         final Object[] ref = new Object[INDEXABLES_RAW_COLUMNS.length];
         ref[COLUMN_INDEX_RAW_TITLE] = raw.title;
diff --git a/src/com/android/settings/security/SimLockPreferenceController.java b/src/com/android/settings/security/SimLockPreferenceController.java
index ffc1d6b..03983b5 100644
--- a/src/com/android/settings/security/SimLockPreferenceController.java
+++ b/src/com/android/settings/security/SimLockPreferenceController.java
@@ -52,13 +52,19 @@
 
     @Override
     public int getAvailabilityStatus() {
-        final PersistableBundle b = mCarrierConfigManager.getConfig();
-        final boolean IsAdmin = mUserManager.isAdminUser();
-        if (!IsAdmin || !isSimIccReady() ||
-                b.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
+        final List<SubscriptionInfo> subInfoList =
+                mSubscriptionManager.getActiveSubscriptionInfoList();
+
+        if (subInfoList == null) {
             return DISABLED_FOR_USER;
         }
-        return AVAILABLE;
+
+        final boolean isAdmin = mUserManager.isAdminUser();
+        if (isAdmin && (!isHideSimLockSetting(subInfoList))) {
+            return AVAILABLE;
+        }
+
+        return DISABLED_FOR_USER;
     }
 
     @Override
@@ -78,34 +84,37 @@
     private boolean isSimReady() {
         final List<SubscriptionInfo> subInfoList =
                 mSubscriptionManager.getActiveSubscriptionInfoList();
-        if (subInfoList != null) {
-            for (SubscriptionInfo subInfo : subInfoList) {
-                final int simState = mTelephonyManager.getSimState(subInfo.getSimSlotIndex());
-                if ((simState != TelephonyManager.SIM_STATE_ABSENT) &&
-                        (simState != TelephonyManager.SIM_STATE_UNKNOWN)) {
-                    return true;
-                }
+        if (subInfoList == null) {
+            return false;
+        }
+
+        for (SubscriptionInfo subInfo : subInfoList) {
+            final int simState = mTelephonyManager.getSimState(subInfo.getSimSlotIndex());
+            if ((simState != TelephonyManager.SIM_STATE_ABSENT)
+                    && (simState != TelephonyManager.SIM_STATE_UNKNOWN)) {
+                return true;
             }
         }
         return false;
     }
 
-    /**
-     * Return true if a there is a Slot that has Icc
-     */
-    private boolean isSimIccReady() {
-        final List<SubscriptionInfo> subInfoList =
-                mSubscriptionManager.getActiveSubscriptionInfoList();
+    private boolean isHideSimLockSetting(List<SubscriptionInfo> subInfoList) {
+        if (subInfoList == null) {
+            return true;
+        }
 
-        if (subInfoList != null) {
-            for (SubscriptionInfo subInfo : subInfoList) {
-                mTelephonyManager = mTelephonyManager
-                        .createForSubscriptionId(subInfo.getSimSlotIndex());
-                if (mTelephonyManager.hasIccCard()) {
-                    return true;
-                }
+        for (SubscriptionInfo subInfo : subInfoList) {
+            final TelephonyManager telephonyManager = mTelephonyManager
+                    .createForSubscriptionId(subInfo.getSubscriptionId());
+            final PersistableBundle bundle = mCarrierConfigManager.getConfigForSubId(
+                    subInfo.getSubscriptionId());
+            if (telephonyManager.hasIccCard() && bundle != null
+                    && !bundle.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
+                // one or more sims show sim lock setting UI.
+                return false;
             }
         }
-        return false;
+
+        return true;
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
index ec6436a..e411531 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
@@ -68,7 +68,7 @@
 
     @Test
     public void testOnReceive_powerSaveModeChanged_invokeCallback() {
-        Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
+        Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
 
         mBatterySaverReceiver.onReceive(mContext, intent);
 
diff --git a/tests/robotests/src/com/android/settings/panel/FakePanelContent.java b/tests/robotests/src/com/android/settings/panel/FakePanelContent.java
index 4d91f52..bf2ac0d 100644
--- a/tests/robotests/src/com/android/settings/panel/FakePanelContent.java
+++ b/tests/robotests/src/com/android/settings/panel/FakePanelContent.java
@@ -42,6 +42,7 @@
 
     public static final Intent INTENT = new Intent();
 
+    private CharSequence mTitle = TITLE;
     private CharSequence mSubTitle;
     private IconCompat mIcon;
     private int mViewType;
@@ -51,22 +52,26 @@
         return mIcon;
     }
 
+    public void setIcon(IconCompat icon) {
+        mIcon = icon;
+    }
+
     @Override
     public CharSequence getSubTitle() {
         return mSubTitle;
     }
 
-    public void setIcon(IconCompat icon) {
-        mIcon = icon;
-    }
-
     public void setSubTitle(CharSequence subTitle) {
         mSubTitle = subTitle;
     }
 
     @Override
     public CharSequence getTitle() {
-        return TITLE;
+        return mTitle;
+    }
+
+    public void setTitle(CharSequence title) {
+        mTitle = title;
     }
 
     @Override
diff --git a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
index b95c9d0..07f01fc 100644
--- a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
+++ b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
@@ -41,6 +41,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
@@ -62,7 +63,6 @@
     private MediaController mMediaController;
     @Mock
     private MediaMetadata mMediaMetadata;
-
     @Mock
     private LocalMediaManager mLocalMediaManager;
     @Mock
@@ -71,6 +71,8 @@
     private MediaOutputPanel mPanel;
     private Context mContext;
     private List<MediaController> mMediaControllers = new ArrayList<>();
+    private ArgumentCaptor<MediaController.Callback> mControllerCbs =
+            ArgumentCaptor.forClass(MediaController.Callback.class);
 
     @Before
     public void setUp() {
@@ -112,6 +114,7 @@
     public void onStart_shouldRegisterCallback() {
         mPanel.onStart();
 
+        verify(mMediaController).registerCallback(any());
         verify(mLocalMediaManager).registerCallback(any());
         verify(mLocalMediaManager).startScan();
     }
@@ -167,6 +170,7 @@
 
     @Test
     public void getTitle_withMetadata_returnArtistName() {
+        mPanel.onStart();
         when(mMediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST)).thenReturn(TEST_ARTIST);
         when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
 
@@ -201,6 +205,7 @@
 
     @Test
     public void getSubTitle_withMetadata_returnAlbumName() {
+        mPanel.onStart();
         when(mMediaMetadata.getString(MediaMetadata.METADATA_KEY_ALBUM)).thenReturn(TEST_ALBUM);
         when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
 
@@ -243,4 +248,15 @@
 
         verify(mLocalMediaManager).releaseSession();
     }
+
+    @Test
+    public void onMetadataChanged_verifyCallOnHeaderChanged() {
+        mPanel.onStart();
+        verify(mMediaController).registerCallback(mControllerCbs.capture());
+        final MediaController.Callback controllerCallbacks = mControllerCbs.getValue();
+
+        controllerCallbacks.onMetadataChanged(mMediaMetadata);
+
+        verify(mCallback).onHeaderChanged();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
index 1976557..07ca48b 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
@@ -41,6 +41,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
@@ -51,7 +52,10 @@
 @RunWith(RobolectricTestRunner.class)
 public class PanelFragmentTest {
 
+    private static final String TITLE = "title";
+    private static final String TITLE2 = "title2";
     private static final String SUBTITLE = "subtitle";
+    private static final String SUBTITLE2 = "subtitle2";
 
     private Context mContext;
     private PanelFragment mPanelFragment;
@@ -59,6 +63,8 @@
     private FakeFeatureFactory mFakeFeatureFactory;
     private PanelFeatureProvider mPanelFeatureProvider;
     private FakePanelContent mFakePanelContent;
+    private ArgumentCaptor<PanelContentCallback> mPanelContentCbs = ArgumentCaptor.forClass(
+            PanelContentCallback.class);
 
     private final String FAKE_EXTRA = "fake_extra";
 
@@ -69,9 +75,11 @@
         mPanelFeatureProvider = spy(new PanelFeatureProviderImpl());
         mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
         mFakeFeatureFactory.panelFeatureProvider = mPanelFeatureProvider;
-        mFakePanelContent = new FakePanelContent();
+        mFakePanelContent = spy(new FakePanelContent());
         doReturn(mFakePanelContent).when(mPanelFeatureProvider).getPanel(any(), any());
+    }
 
+    private void initFakeActivity() {
         mActivity = spy(Robolectric.buildActivity(FakeSettingsPanelActivity.class).setup().get());
 
         mPanelFragment =
@@ -86,6 +94,7 @@
 
     @Test
     public void onCreateView_countdownLatch_setup() {
+        initFakeActivity();
         mPanelFragment.onCreateView(LayoutInflater.from(mContext),
                 new LinearLayout(mContext), null);
         PanelSlicesLoaderCountdownLatch countdownLatch =
@@ -99,6 +108,7 @@
 
     @Test
     public void onCreate_logsOpenEvent() {
+        initFakeActivity();
         verify(mFakeFeatureFactory.metricsFeatureProvider).action(
                 0,
                 SettingsEnums.PAGE_VISIBLE,
@@ -109,6 +119,7 @@
 
     @Test
     public void onDestroy_logCloseEvent() {
+        initFakeActivity();
         mPanelFragment.onDestroyView();
         verify(mFakeFeatureFactory.metricsFeatureProvider).action(
                 0,
@@ -120,6 +131,7 @@
 
     @Test
     public void panelSeeMoreClick_logsCloseEvent() {
+        initFakeActivity();
         final View.OnClickListener listener = mPanelFragment.getSeeMoreListener();
         listener.onClick(null);
         verify(mActivity).finish();
@@ -136,6 +148,7 @@
 
     @Test
     public void panelDoneClick_logsCloseEvent() {
+        initFakeActivity();
         final View.OnClickListener listener = mPanelFragment.getCloseListener();
         listener.onClick(null);
         verify(mActivity).finish();
@@ -178,10 +191,49 @@
 
     @Test
     public void notSupportIcon_displayDefaultHeaderLayout() {
-        final View titleView = mPanelFragment.mLayoutView.findViewById(R.id.panel_title);
-        final View panelHeader = mPanelFragment.mLayoutView.findViewById(R.id.panel_header);
+        final ActivityController<FakeSettingsPanelActivity> activityController =
+                Robolectric.buildActivity(FakeSettingsPanelActivity.class);
+        activityController.setup();
+        final PanelFragment panelFragment = (PanelFragment)
+                Objects.requireNonNull(activityController
+                        .get()
+                        .getSupportFragmentManager()
+                        .findFragmentById(R.id.main_content));
+
+        final View titleView = panelFragment.mLayoutView.findViewById(R.id.panel_title);
+        final View panelHeader = panelFragment.mLayoutView.findViewById(R.id.panel_header);
 
         assertThat(panelHeader.getVisibility()).isEqualTo(View.GONE);
         assertThat(titleView.getVisibility()).isEqualTo(View.VISIBLE);
     }
+
+    @Test
+    public void onHeaderChanged_updateHeader_verifyTitle() {
+        mFakePanelContent.setIcon(IconCompat.createWithResource(mContext, R.drawable.ic_android));
+        mFakePanelContent.setTitle(TITLE);
+        mFakePanelContent.setSubTitle(SUBTITLE);
+        final ActivityController<FakeSettingsPanelActivity> activityController =
+                Robolectric.buildActivity(FakeSettingsPanelActivity.class);
+        activityController.setup();
+        final PanelFragment panelFragment = (PanelFragment)
+                Objects.requireNonNull(activityController
+                        .get()
+                        .getSupportFragmentManager()
+                        .findFragmentById(R.id.main_content));
+        final TextView headerTitle = panelFragment.mLayoutView.findViewById(R.id.header_title);
+        final TextView headerSubtitle = panelFragment.mLayoutView.findViewById(
+                R.id.header_subtitle);
+
+        assertThat(headerTitle.getText()).isEqualTo(TITLE);
+        assertThat(headerSubtitle.getText()).isEqualTo(SUBTITLE);
+
+        mFakePanelContent.setTitle(TITLE2);
+        mFakePanelContent.setSubTitle(SUBTITLE2);
+        verify(mFakePanelContent).registerCallback(mPanelContentCbs.capture());
+        final PanelContentCallback panelContentCallbacks = mPanelContentCbs.getValue();
+        panelContentCallbacks.onHeaderChanged();
+
+        assertThat(headerTitle.getText()).isEqualTo(TITLE2);
+        assertThat(headerSubtitle.getText()).isEqualTo(SUBTITLE2);
+    }
 }
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
index 1bdadb2..6b3fdf4 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -46,6 +46,7 @@
 import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
 import com.android.settings.search.SearchFeatureProvider;
 import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
+import com.android.settings.testutils.shadow.ShadowPersistentDataBlockManager;
 import com.android.settings.testutils.shadow.ShadowStorageManager;
 import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settings.testutils.shadow.ShadowUtils;
@@ -63,6 +64,7 @@
 @Config(
         shadows = {
                 ShadowLockPatternUtils.class,
+                ShadowPersistentDataBlockManager.class,
                 ShadowStorageManager.class,
                 ShadowUserManager.class,
                 ShadowUtils.class
@@ -82,11 +84,13 @@
     public void tearDown() {
         Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 1);
         ShadowStorageManager.reset();
+        ShadowPersistentDataBlockManager.reset();
     }
 
     @Test
-    public void onCreate_deviceNotProvisioned_shouldFinishActivity() {
+    public void onCreate_deviceNotProvisioned_persistentDataExists_shouldFinishActivity() {
         Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 0);
+        ShadowPersistentDataBlockManager.setDataBlockSize(1000);
 
         initActivity(null);
         assertThat(mActivity.isFinishing()).isTrue();
@@ -191,7 +195,18 @@
     }
 
     @Test
-    public void updatePreferencesOrFinish_callingAppIsAdmin_footerInvisible() {
+    public void updatePreferencesOrFinish_callingAppIsAdmin_deviceProvisioned_footerInvisible() {
+        initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true));
+
+        mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false);
+
+        FooterPreference footer = mFragment.findPreference(KEY_LOCK_SETTINGS_FOOTER);
+        assertThat(footer.isVisible()).isFalse();
+    }
+
+    @Test
+    public void updatePreferencesOrFinish_callingAppIsAdmin_deviceNotProvisioned_footerInvisible() {
+        Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 0);
         initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true));
 
         mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false);
diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
index 04a2157..b36af98 100644
--- a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
@@ -45,6 +45,8 @@
 import com.android.settings.testutils.shadow.ShadowPasswordUtils;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -111,6 +113,7 @@
         activity.launchChooseLock(new Bundle());
         ShadowActivity shadowActivity = Shadows.shadowOf(activity);
         Intent intent = getLaunchChooseLockIntent(shadowActivity);
+        intent.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true);
 
         assertThat(intent.getComponent())
                 .isEqualTo(new ComponentName(activity, SetupChooseLockGeneric.class));
diff --git a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
index 0db684e..c9bff38 100644
--- a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
@@ -6,6 +6,7 @@
 import static org.mockito.Mockito.spy;
 
 import android.Manifest;
+import android.content.pm.ActivityInfo;
 import android.content.pm.ProviderInfo;
 import android.database.Cursor;
 import android.net.Uri;
@@ -13,6 +14,8 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.drawer.ActivityTile;
+import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.search.SearchIndexableData;
 
 import org.junit.After;
@@ -29,7 +32,8 @@
 @RunWith(RobolectricTestRunner.class)
 public class SettingsSearchIndexablesProviderTest {
 
-    private static final String BASE_AUTHORITY = "com.android.settings";
+    private static final String PACKAGE_NAME = "com.android.settings";
+    private static final String BASE_AUTHORITY = "content://" + PACKAGE_NAME + "/";
 
     private SettingsSearchIndexablesProvider mProvider;
     private FakeFeatureFactory mFakeFeatureFactory;
@@ -40,7 +44,7 @@
         ProviderInfo info = new ProviderInfo();
         info.exported = true;
         info.grantUriPermissions = true;
-        info.authority = BASE_AUTHORITY;
+        info.authority = PACKAGE_NAME;
         info.readPermission = Manifest.permission.READ_SEARCH_INDEXABLES;
         mProvider.attachInfo(RuntimeEnvironment.application, info);
 
@@ -60,8 +64,7 @@
 
     @Test
     public void testRawColumnFetched() {
-        Uri rawUri = Uri.parse("content://" + BASE_AUTHORITY + "/" +
-                SearchIndexablesContract.INDEXABLES_RAW_PATH);
+        Uri rawUri = Uri.parse(BASE_AUTHORITY + SearchIndexablesContract.INDEXABLES_RAW_PATH);
 
         final Cursor cursor = mProvider.query(rawUri,
                 SearchIndexablesContract.INDEXABLES_RAW_COLUMNS, null, null, null);
@@ -83,8 +86,7 @@
 
     @Test
     public void testResourcesColumnFetched() {
-        Uri rawUri = Uri.parse("content://" + BASE_AUTHORITY + "/" +
-                SearchIndexablesContract.INDEXABLES_XML_RES_PATH);
+        Uri rawUri = Uri.parse(BASE_AUTHORITY + SearchIndexablesContract.INDEXABLES_XML_RES_PATH);
 
         final Cursor cursor = mProvider.query(rawUri,
                 SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS, null, null, null);
@@ -102,8 +104,8 @@
     @Test
     @Config(qualifiers = "mcc999")
     public void testNonIndexablesColumnFetched() {
-        final Uri rawUri = Uri.parse("content://" + BASE_AUTHORITY + "/" +
-                SearchIndexablesContract.NON_INDEXABLES_KEYS_PATH);
+        final Uri rawUri = Uri.parse(
+                BASE_AUTHORITY + SearchIndexablesContract.NON_INDEXABLES_KEYS_PATH);
 
         final List<String> keys = new ArrayList<>();
 
@@ -117,4 +119,37 @@
         assertThat(keys).hasSize(3);
         assertThat(keys).containsAllOf("pref_key_1", "pref_key_3", "pref_key_5");
     }
+
+    @Test
+    public void testIsEligibleForIndexing_isSettingsInjectedItem_ShouldBeFalse() {
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = PACKAGE_NAME;
+        activityInfo.name = "class";
+        final ActivityTile activityTile = new ActivityTile(activityInfo,
+                CategoryKey.CATEGORY_SYSTEM);
+
+        assertThat(mProvider.isEligibleForIndexing(PACKAGE_NAME, activityTile)).isFalse();
+    }
+
+    @Test
+    public void testIsEligibleForIndexing_isHomepageInjectedItem_ShouldBeFalse() {
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "pkg";
+        activityInfo.name = "class";
+        final ActivityTile activityTile = new ActivityTile(activityInfo,
+                CategoryKey.CATEGORY_HOMEPAGE);
+
+        assertThat(mProvider.isEligibleForIndexing(PACKAGE_NAME, activityTile)).isFalse();
+    }
+
+    @Test
+    public void testIsEligibleForIndexing_normalInjectedItem_ShouldBeTrue() {
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "pkg";
+        activityInfo.name = "class";
+        final ActivityTile activityTile = new ActivityTile(activityInfo,
+                CategoryKey.CATEGORY_CONNECT);
+
+        assertThat(mProvider.isEligibleForIndexing(PACKAGE_NAME, activityTile)).isTrue();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
index 89be17a..0ab4256 100644
--- a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
@@ -103,7 +103,7 @@
         setupMockIcc();
         final PersistableBundle pb = new PersistableBundle();
         pb.putBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL, true);
-        when(mCarrierManager.getConfig()).thenReturn(pb);
+        when(mCarrierManager.getConfigForSubId(anyInt())).thenReturn(pb);
 
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.DISABLED_FOR_USER);
@@ -114,7 +114,7 @@
         when(mUserManager.isAdminUser()).thenReturn(true);
         setupMockIcc();
         final PersistableBundle pb = new PersistableBundle();
-        when(mCarrierManager.getConfig()).thenReturn(pb);
+        when(mCarrierManager.getConfigForSubId(anyInt())).thenReturn(pb);
 
         assertThat(mController.getAvailabilityStatus())
                 .isEqualTo(BasePreferenceController.AVAILABLE);
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java
new file mode 100644
index 0000000..dbbdd3d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java
@@ -0,0 +1,42 @@
+/*
+ * 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.testutils.shadow;
+
+import android.service.persistentdata.PersistentDataBlockManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(PersistentDataBlockManager.class)
+public class ShadowPersistentDataBlockManager {
+    private static int sDataBlockSize = 0;
+
+    @Resetter
+    public static void reset() {
+        sDataBlockSize = 0;
+    }
+
+    @Implementation
+    protected int getDataBlockSize() {
+        return sDataBlockSize;
+    }
+
+    public static void setDataBlockSize(int dataBlockSize) {
+        sDataBlockSize = dataBlockSize;
+    }
+}