Merge "Fix colors for dreams settings according to new spec" into udc-dev
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index a5e5f57..e0f402b 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -283,7 +283,9 @@
                     case MSG_REFRESH_FINGERPRINT_TEMPLATES:
                         removeFingerprintPreference(msg.arg1);
                         updateAddPreference();
-                        updateFingerprintUnlockCategoryVisibility();
+                        if (isSfps()) {
+                            updateFingerprintUnlockCategoryVisibility();
+                        }
                         updatePreferences();
                         break;
                     case MSG_FINGER_AUTH_SUCCESS:
@@ -494,9 +496,13 @@
         }
 
         private boolean isSfps() {
-            for (FingerprintSensorPropertiesInternal prop : mSensorProperties) {
-                if (prop.isAnySidefpsType()) {
-                    return true;
+            mFingerprintManager = Utils.getFingerprintManagerOrNull(getActivity());
+            if (mFingerprintManager != null) {
+                mSensorProperties = mFingerprintManager.getSensorPropertiesInternal();
+                for (FingerprintSensorPropertiesInternal prop : mSensorProperties) {
+                    if (prop.isAnySidefpsType()) {
+                        return true;
+                    }
                 }
             }
             return false;
@@ -838,18 +844,20 @@
 
         private List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
             final List<AbstractPreferenceController> controllers = new ArrayList<>();
-            mFingerprintUnlockCategoryPreferenceController =
+            if (isSfps()) {
+                mFingerprintUnlockCategoryPreferenceController =
                     new FingerprintUnlockCategoryController(
-                            context,
-                            KEY_FINGERPRINT_UNLOCK_CATEGORY
+                        context,
+                        KEY_FINGERPRINT_UNLOCK_CATEGORY
                     );
-            mRequireScreenOnToAuthPreferenceController =
-                    new FingerprintSettingsRequireScreenOnToAuthPreferenceController(
-                            context,
-                            KEY_REQUIRE_SCREEN_ON_TO_AUTH
-                    );
-            controllers.add(mFingerprintUnlockCategoryPreferenceController);
-            controllers.add(mRequireScreenOnToAuthPreferenceController);
+                mRequireScreenOnToAuthPreferenceController =
+                        new FingerprintSettingsRequireScreenOnToAuthPreferenceController(
+                                context,
+                                KEY_REQUIRE_SCREEN_ON_TO_AUTH
+                        );
+                controllers.add(mFingerprintUnlockCategoryPreferenceController);
+                controllers.add(mRequireScreenOnToAuthPreferenceController);
+            }
             return controllers;
         }
 
diff --git a/src/com/android/settings/datausage/DataSaverSummary.java b/src/com/android/settings/datausage/DataSaverSummary.java
deleted file mode 100644
index 67644a6..0000000
--- a/src/com/android/settings/datausage/DataSaverSummary.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2016 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.datausage;
-
-import android.app.Application;
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.icu.text.MessageFormat;
-import android.os.Bundle;
-import android.telephony.SubscriptionManager;
-import android.widget.Switch;
-
-import androidx.preference.Preference;
-
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.applications.AppStateBaseBridge.Callback;
-import com.android.settings.datausage.DataSaverBackend.Listener;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.widget.SettingsMainSwitchBar;
-import com.android.settingslib.applications.ApplicationsState;
-import com.android.settingslib.applications.ApplicationsState.AppEntry;
-import com.android.settingslib.applications.ApplicationsState.Callbacks;
-import com.android.settingslib.applications.ApplicationsState.Session;
-import com.android.settingslib.search.SearchIndexable;
-import com.android.settingslib.widget.OnMainSwitchChangeListener;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-@SearchIndexable
-public class DataSaverSummary extends SettingsPreferenceFragment
-        implements OnMainSwitchChangeListener, Listener, Callback, Callbacks {
-
-    private static final String KEY_UNRESTRICTED_ACCESS = "unrestricted_access";
-
-    private SettingsMainSwitchBar mSwitchBar;
-    private DataSaverBackend mDataSaverBackend;
-    private Preference mUnrestrictedAccess;
-    private ApplicationsState mApplicationsState;
-    private AppStateDataUsageBridge mDataUsageBridge;
-    private Session mSession;
-
-    // Flag used to avoid infinite loop due if user switch it on/off too quicky.
-    private boolean mSwitching;
-
-    private Runnable mLoadAppRunnable = () -> {
-        mApplicationsState = ApplicationsState.getInstance(
-                (Application) getContext().getApplicationContext());
-        mDataUsageBridge = new AppStateDataUsageBridge(mApplicationsState, this, mDataSaverBackend);
-        mSession = mApplicationsState.newSession(this, getSettingsLifecycle());
-        mDataUsageBridge.resume(true /* forceLoadAllApps */);
-    };
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        if (!isDataSaverVisible(getContext())) {
-            finishFragment();
-            return;
-        }
-
-        addPreferencesFromResource(R.xml.data_saver);
-        mUnrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS);
-        mDataSaverBackend = new DataSaverBackend(getContext());
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-        mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar();
-        mSwitchBar.setTitle(getContext().getString(R.string.data_saver_switch_title));
-        mSwitchBar.show();
-        mSwitchBar.addOnSwitchChangeListener(this);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        mDataSaverBackend.refreshAllowlist();
-        mDataSaverBackend.refreshDenylist();
-        mDataSaverBackend.addListener(this);
-        if (mDataUsageBridge != null) {
-            mDataUsageBridge.resume(true /* forceLoadAllApps */);
-        } else {
-            getView().post(mLoadAppRunnable);
-        }
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mDataSaverBackend.remListener(this);
-        if (mDataUsageBridge != null) {
-            mDataUsageBridge.pause();
-        }
-    }
-
-    @Override
-    public void onSwitchChanged(Switch switchView, boolean isChecked) {
-        synchronized (this) {
-            if (mSwitching) {
-                return;
-            }
-            mSwitching = true;
-            mDataSaverBackend.setDataSaverEnabled(isChecked);
-        }
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return SettingsEnums.DATA_SAVER_SUMMARY;
-    }
-
-    @Override
-    public int getHelpResource() {
-        return R.string.help_url_data_saver;
-    }
-
-    @Override
-    public void onDataSaverChanged(boolean isDataSaving) {
-        synchronized (this) {
-            mSwitchBar.setChecked(isDataSaving);
-            mSwitching = false;
-        }
-    }
-
-    @Override
-    public void onAllowlistStatusChanged(int uid, boolean isAllowlisted) {
-    }
-
-    @Override
-    public void onDenylistStatusChanged(int uid, boolean isDenylisted) {
-    }
-
-    @Override
-    public void onExtraInfoUpdated() {
-        updateUnrestrictedAccessSummary();
-    }
-
-    @Override
-    public void onRunningStateChanged(boolean running) {
-
-    }
-
-    @Override
-    public void onPackageListChanged() {
-
-    }
-
-    @Override
-    public void onRebuildComplete(ArrayList<AppEntry> apps) {
-
-    }
-
-    @Override
-    public void onPackageIconChanged() {
-
-    }
-
-    @Override
-    public void onPackageSizeChanged(String packageName) {
-
-    }
-
-    @Override
-    public void onAllSizesComputed() {
-        updateUnrestrictedAccessSummary();
-    }
-
-    @Override
-    public void onLauncherInfoChanged() {
-        updateUnrestrictedAccessSummary();
-    }
-
-    @Override
-    public void onLoadEntriesCompleted() {
-
-    }
-
-    private void updateUnrestrictedAccessSummary() {
-        if (!isAdded() || isFinishingOrDestroyed() || mSession == null) return;
-
-        int count = 0;
-        for (AppEntry entry : mSession.getAllApps()) {
-            if (!ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(entry)) {
-                continue;
-            }
-            if (entry.extraInfo != null && ((AppStateDataUsageBridge.DataUsageState)
-                    entry.extraInfo).isDataSaverAllowlisted) {
-                count++;
-            }
-        }
-        MessageFormat msgFormat = new MessageFormat(
-                getResources().getString(R.string.data_saver_unrestricted_summary),
-                Locale.getDefault());
-        Map<String, Object> arguments = new HashMap<>();
-        arguments.put("count", count);
-        mUnrestrictedAccess.setSummary(msgFormat.format(arguments));
-    }
-
-    public static boolean isDataSaverVisible(Context context) {
-        return context.getResources()
-            .getBoolean(R.bool.config_show_data_saver);
-    }
-
-    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider(R.xml.data_saver) {
-
-                @Override
-                protected boolean isPageSearchEnabled(Context context) {
-                    return isDataSaverVisible(context)
-                            && DataUsageUtils.hasMobileData(context)
-                            && DataUsageUtils.getDefaultSubscriptionId(context)
-                            != SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-                }
-            };
-}
diff --git a/src/com/android/settings/datausage/DataSaverSummary.kt b/src/com/android/settings/datausage/DataSaverSummary.kt
new file mode 100644
index 0000000..1d9cbb7
--- /dev/null
+++ b/src/com/android/settings/datausage/DataSaverSummary.kt
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2023 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.datausage
+
+import android.app.Application
+import android.app.settings.SettingsEnums
+import android.content.Context
+import android.os.Bundle
+import android.telephony.SubscriptionManager
+import android.widget.Switch
+import androidx.lifecycle.lifecycleScope
+import androidx.preference.Preference
+import com.android.settings.R
+import com.android.settings.SettingsActivity
+import com.android.settings.SettingsPreferenceFragment
+import com.android.settings.applications.AppStateBaseBridge
+import com.android.settings.datausage.AppStateDataUsageBridge.DataUsageState
+import com.android.settings.search.BaseSearchIndexProvider
+import com.android.settings.widget.SettingsMainSwitchBar
+import com.android.settingslib.applications.ApplicationsState
+import com.android.settingslib.search.SearchIndexable
+import com.android.settingslib.spa.framework.util.formatString
+import kotlinx.coroutines.launch
+
+@SearchIndexable
+class DataSaverSummary : SettingsPreferenceFragment() {
+    private lateinit var switchBar: SettingsMainSwitchBar
+    private lateinit var dataSaverBackend: DataSaverBackend
+    private lateinit var unrestrictedAccess: Preference
+    private var dataUsageBridge: AppStateDataUsageBridge? = null
+    private var session: ApplicationsState.Session? = null
+
+    // Flag used to avoid infinite loop due if user switch it on/off too quick.
+    private var switching = false
+
+    override fun onCreate(bundle: Bundle?) {
+        super.onCreate(bundle)
+
+        if (!requireContext().isDataSaverVisible()) {
+            finishFragment()
+            return
+        }
+
+        addPreferencesFromResource(R.xml.data_saver)
+        unrestrictedAccess = findPreference(KEY_UNRESTRICTED_ACCESS)!!
+        dataSaverBackend = DataSaverBackend(requireContext())
+    }
+
+    override fun onActivityCreated(savedInstanceState: Bundle?) {
+        super.onActivityCreated(savedInstanceState)
+        switchBar = (activity as SettingsActivity).switchBar.apply {
+            setTitle(getString(R.string.data_saver_switch_title))
+            show()
+            addOnSwitchChangeListener { _: Switch, isChecked: Boolean ->
+                onSwitchChanged(isChecked)
+            }
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        dataSaverBackend.refreshAllowlist()
+        dataSaverBackend.refreshDenylist()
+        dataSaverBackend.addListener(dataSaverBackendListener)
+        dataUsageBridge?.resume(/* forceLoadAllApps= */ true)
+            ?: viewLifecycleOwner.lifecycleScope.launch {
+                val applicationsState = ApplicationsState.getInstance(
+                    requireContext().applicationContext as Application
+                )
+                dataUsageBridge = AppStateDataUsageBridge(
+                    applicationsState, dataUsageBridgeCallbacks, dataSaverBackend
+                )
+                session =
+                    applicationsState.newSession(applicationsStateCallbacks, settingsLifecycle)
+                dataUsageBridge?.resume(/* forceLoadAllApps= */ true)
+            }
+    }
+
+    override fun onPause() {
+        super.onPause()
+        dataSaverBackend.remListener(dataSaverBackendListener)
+        dataUsageBridge?.pause()
+    }
+
+    private fun onSwitchChanged(isChecked: Boolean) {
+        synchronized(this) {
+            if (!switching) {
+                switching = true
+                dataSaverBackend.isDataSaverEnabled = isChecked
+            }
+        }
+    }
+
+    override fun getMetricsCategory() = SettingsEnums.DATA_SAVER_SUMMARY
+
+    override fun getHelpResource() = R.string.help_url_data_saver
+
+    private val dataSaverBackendListener = object : DataSaverBackend.Listener {
+        override fun onDataSaverChanged(isDataSaving: Boolean) {
+            synchronized(this) {
+                switchBar.isChecked = isDataSaving
+                switching = false
+            }
+        }
+
+        override fun onAllowlistStatusChanged(uid: Int, isAllowlisted: Boolean) {}
+
+        override fun onDenylistStatusChanged(uid: Int, isDenylisted: Boolean) {}
+    }
+
+    private val dataUsageBridgeCallbacks = AppStateBaseBridge.Callback {
+        updateUnrestrictedAccessSummary()
+    }
+
+    private val applicationsStateCallbacks = object : ApplicationsState.Callbacks {
+        override fun onRunningStateChanged(running: Boolean) {}
+
+        override fun onPackageListChanged() {}
+
+        override fun onRebuildComplete(apps: ArrayList<ApplicationsState.AppEntry>?) {}
+
+        override fun onPackageIconChanged() {}
+
+        override fun onPackageSizeChanged(packageName: String?) {}
+
+        override fun onAllSizesComputed() {
+            updateUnrestrictedAccessSummary()
+        }
+
+        override fun onLauncherInfoChanged() {
+            updateUnrestrictedAccessSummary()
+        }
+
+        override fun onLoadEntriesCompleted() {}
+    }
+
+    private fun updateUnrestrictedAccessSummary() {
+        if (!isAdded || isFinishingOrDestroyed) return
+        val allApps = session?.allApps ?: return
+        val count = allApps.count {
+            ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER.filterApp(it) &&
+                (it.extraInfo as? DataUsageState)?.isDataSaverAllowlisted == true
+        }
+        unrestrictedAccess.summary =
+            resources.formatString(R.string.data_saver_unrestricted_summary, "count" to count)
+    }
+
+    companion object {
+        private const val KEY_UNRESTRICTED_ACCESS = "unrestricted_access"
+
+        private fun Context.isDataSaverVisible(): Boolean =
+            resources.getBoolean(R.bool.config_show_data_saver)
+
+        @JvmField
+        val SEARCH_INDEX_DATA_PROVIDER = object : BaseSearchIndexProvider(R.xml.data_saver) {
+            override fun isPageSearchEnabled(context: Context): Boolean =
+                context.isDataSaverVisible() &&
+                    DataUsageUtils.hasMobileData(context) &&
+                    (DataUsageUtils.getDefaultSubscriptionId(context) !=
+                        SubscriptionManager.INVALID_SUBSCRIPTION_ID)
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
index 5bec7bd..d686594 100644
--- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
@@ -30,6 +30,7 @@
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
+import com.android.settingslib.Utils;
 import com.android.settingslib.utils.ThreadUtils;
 
 public class TopLevelBatteryPreferenceController extends BasePreferenceController implements
@@ -38,10 +39,12 @@
     private static final String TAG = "TopLvBatteryPrefControl";
 
     @VisibleForTesting
-    protected boolean mIsBatteryPresent = true;
-    @VisibleForTesting
     Preference mPreference;
+    @VisibleForTesting
+    protected boolean mIsBatteryPresent = true;
+
     private final BatteryBroadcastReceiver mBatteryBroadcastReceiver;
+
     private BatteryInfo mBatteryInfo;
     private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
     private String mBatteryStatusLabel;
@@ -55,8 +58,11 @@
                 mIsBatteryPresent = false;
             }
             BatteryInfo.getBatteryInfo(mContext, info -> {
+                Log.d(TAG, "getBatteryInfo: " + info);
                 mBatteryInfo = info;
                 updateState(mPreference);
+                // Update the preference summary text to the latest state.
+                setSummaryAsync(info);
             }, true /* shortString */);
         });
 
@@ -104,18 +110,19 @@
         if (info == null || context == null) {
             return null;
         }
-
-        Log.d(TAG, "getDashboardLabel: batteryStatusUpdate=" + batteryStatusUpdate);
+        Log.d(TAG, "getDashboardLabel: " + mBatteryStatusLabel + " batteryStatusUpdate="
+                + batteryStatusUpdate);
 
         if (batteryStatusUpdate) {
             setSummaryAsync(info);
         }
-
-        return (mBatteryStatusLabel == null) ? generateLabel(info) : mBatteryStatusLabel;
+        return mBatteryStatusLabel == null ? generateLabel(info) : mBatteryStatusLabel;
     }
 
     private void setSummaryAsync(BatteryInfo info) {
         ThreadUtils.postOnBackgroundThread(() -> {
+            // Return false if built-in status should be used, will use updateBatteryStatus()
+            // method to inject the customized battery status label.
             final boolean triggerBatteryStatusUpdate =
                     mBatteryStatusFeatureProvider.triggerBatteryStatusUpdate(this, info);
             ThreadUtils.postOnMainThread(() -> {
@@ -123,12 +130,15 @@
                     mBatteryStatusLabel = null; // will generateLabel()
                 }
                 mPreference.setSummary(
-                        (mBatteryStatusLabel == null) ? generateLabel(info) : mBatteryStatusLabel);
+                        mBatteryStatusLabel == null ? generateLabel(info) : mBatteryStatusLabel);
             });
         });
     }
 
     private CharSequence generateLabel(BatteryInfo info) {
+        if (Utils.containsIncompatibleChargers(mContext, TAG)) {
+            return mContext.getString(R.string.battery_info_status_not_charging);
+        }
         if (!info.discharging && info.chargeLabel != null) {
             return info.chargeLabel;
         } else if (info.remainingLabel == null) {
@@ -146,13 +156,13 @@
     @Override
     public void updateBatteryStatus(String label, BatteryInfo info) {
         mBatteryStatusLabel = label; // Null if adaptive charging is not active
-
-        if (mPreference != null) {
-            // Do not triggerBatteryStatusUpdate(), otherwise there will be an infinite loop
-            final CharSequence summary = getSummary(false /* batteryStatusUpdate */);
-            if (summary != null) {
-                mPreference.setSummary(summary);
-            }
+        if (mPreference == null) {
+            return;
+        }
+        // Do not triggerBatteryStatusUpdate() here to cause infinite loop
+        final CharSequence summary = getSummary(false /* batteryStatusUpdate */);
+        if (summary != null) {
+            mPreference.setSummary(summary);
         }
     }
 
@@ -170,4 +180,4 @@
         String pkgName = lastPkgIndex > 0 ? classPath.substring(0, lastPkgIndex) : "";
         return new ComponentName(pkgName, split[classNameIndex]);
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/spa/notification/AppNotificationRepository.kt b/src/com/android/settings/spa/notification/AppNotificationRepository.kt
index 8dc4f20..f35d308 100644
--- a/src/com/android/settings/spa/notification/AppNotificationRepository.kt
+++ b/src/com/android/settings/spa/notification/AppNotificationRepository.kt
@@ -123,13 +123,15 @@
     }
 
     override fun getNotificationSummary(app: ApplicationInfo): String {
-        if (!isEnabled(app)) return context.getString(R.string.off)
+        if (!isEnabled(app)) return context.getString(R.string.notifications_disabled)
         val channelCount = getChannelCount(app)
         if (channelCount == 0) {
             return calculateFrequencySummary(getSentCount(app))
         }
         val blockedChannelCount = getBlockedChannelCount(app)
-        if (channelCount == blockedChannelCount) return context.getString(R.string.off)
+        if (channelCount == blockedChannelCount) {
+            return context.getString(R.string.notifications_disabled)
+        }
         val frequencySummary = calculateFrequencySummary(getSentCount(app))
         if (blockedChannelCount == 0) return frequencySummary
         return context.getString(
diff --git a/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
index 1d8fb32..506882b 100644
--- a/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/SystemControlsFragmentTest.java
@@ -25,16 +25,19 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.XmlTestUtils;
+import com.android.settings.testutils.shadow.ShadowKeyCharacterMap;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
 
 import java.util.List;
 
 /** Tests for {@link SystemControlsFragment}. */
 @RunWith(RobolectricTestRunner.class)
+@Config(shadows = {ShadowKeyCharacterMap.class})
 public class SystemControlsFragmentTest {
 
     private final Context mContext = ApplicationProvider.getApplicationContext();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 85e2942..5f825ae 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -28,6 +28,9 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.hardware.usb.UsbManager;
+import android.hardware.usb.UsbPort;
+import android.hardware.usb.UsbPortStatus;
 
 import androidx.preference.Preference;
 import androidx.test.core.app.ApplicationProvider;
@@ -38,21 +41,33 @@
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @RunWith(RobolectricTestRunner.class)
 public class TopLevelBatteryPreferenceControllerTest {
     private Context mContext;
     private TopLevelBatteryPreferenceController mController;
     private BatterySettingsFeatureProvider mBatterySettingsFeatureProvider;
 
+    @Mock
+    private UsbPort mUsbPort;
+    @Mock
+    private UsbManager mUsbManager;
+    @Mock
+    private UsbPortStatus mUsbPortStatus;
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(ApplicationProvider.getApplicationContext());
         mController = new TopLevelBatteryPreferenceController(mContext, "test_key");
+        when(mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
     }
 
     @Test
@@ -88,27 +103,61 @@
     }
 
     @Test
-    public void getDashboardLabel_returnsCorrectLabel() {
+    public void getDashboardLabel_returnsBatterPercentString() {
         mController.mPreference = new Preference(mContext);
         BatteryInfo info = new BatteryInfo();
         info.batteryPercentString = "3%";
+
         assertThat(mController.getDashboardLabel(mContext, info, true))
                 .isEqualTo(info.batteryPercentString);
+    }
 
+    @Test
+    public void getDashboardLabel_returnsRemainingLabel() {
+        mController.mPreference = new Preference(mContext);
+        BatteryInfo info = new BatteryInfo();
+        info.batteryPercentString = "3%";
         info.remainingLabel = "Phone will shut down soon";
+
         assertThat(mController.getDashboardLabel(mContext, info, true))
                 .isEqualTo("3% - Phone will shut down soon");
+    }
 
+    @Test
+    public void getDashboardLabel_returnsChargeLabel() {
+        mController.mPreference = new Preference(mContext);
+        BatteryInfo info = new BatteryInfo();
         info.discharging = false;
         info.chargeLabel = "5% - charging";
-        assertThat(mController.getDashboardLabel(mContext, info, true)).isEqualTo("5% - charging");
+
+        assertThat(mController.getDashboardLabel(mContext, info, true))
+                .isEqualTo(info.chargeLabel);
+    }
+
+    @Test
+    public void getDashboardLabel_incompatibleCharger_returnsCorrectLabel() {
+        setupIncompatibleEvent();
+        mController.mPreference = new Preference(mContext);
+        BatteryInfo info = new BatteryInfo();
+
+        assertThat(mController.getDashboardLabel(mContext, info, true))
+                .isEqualTo(mContext.getString(R.string.battery_info_status_not_charging));
     }
 
     @Test
     public void getSummary_batteryNotPresent_shouldShowWarningMessage() {
         mController.mIsBatteryPresent = false;
-
         assertThat(mController.getSummary())
                 .isEqualTo(mContext.getString(R.string.battery_missing_message));
     }
+
+    private void setupIncompatibleEvent() {
+        final List<UsbPort> usbPorts = new ArrayList<>();
+        usbPorts.add(mUsbPort);
+        when(mUsbManager.getPorts()).thenReturn(usbPorts);
+        when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
+        when(mUsbPort.supportsComplianceWarnings()).thenReturn(true);
+        when(mUsbPortStatus.isConnected()).thenReturn(true);
+        when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
index 057b6cb..b2f0ad5 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
@@ -169,6 +169,7 @@
 
     @Test
     public void getAvailibilityStatus_availableByDefault() {
+        doReturn(true).when(mUserManager).isAdminUser();
         assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
     }
 
diff --git a/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt
index a1d8d3f..12fdc23 100644
--- a/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/notification/AppNotificationRepositoryTest.kt
@@ -251,7 +251,7 @@
 
         val summary = repository.getNotificationSummary(APP)
 
-        assertThat(summary).isEqualTo(context.getString(R.string.off))
+        assertThat(summary).isEqualTo(context.getString(R.string.notifications_disabled))
     }
 
     @Test
@@ -273,7 +273,7 @@
 
         val summary = repository.getNotificationSummary(APP)
 
-        assertThat(summary).isEqualTo(context.getString(R.string.off))
+        assertThat(summary).isEqualTo(context.getString(R.string.notifications_disabled))
     }
 
     @Test