Merge "Fix ToggleScreenMagnificationPreferenceFragmentTest" into main
diff --git a/aconfig/settings_globalintl_flag_declarations.aconfig b/aconfig/settings_globalintl_flag_declarations.aconfig
index 3740dd3..68662d0 100644
--- a/aconfig/settings_globalintl_flag_declarations.aconfig
+++ b/aconfig/settings_globalintl_flag_declarations.aconfig
@@ -2,14 +2,14 @@
 
 flag {
     name: "terms_of_address_enabled"
-    namespace: "settings_globalintl"
+    namespace: "globalintl"
     description: "Feature flag for Terms of Address"
     bug: "297798866"
 }
 
 flag {
     name: "locale_notification_enabled"
-    namespace: "settings_globalintl"
+    namespace: "globalintl"
     description: "Feature flag for locale notification"
-    bug: "248514263"
+    bug: "301380610"
 }
diff --git a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
index 95cf64c..992136c 100644
--- a/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
+++ b/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverController.java
@@ -170,9 +170,10 @@
             ((SwitchPreference) mPreference).setChecked(false);
         }
 
-        // Regardless of whether ANGLE is enabled, disable the developer option UI
-        // as long as UI is not enabled via debug property.
-        if (!isAngleDeveloperOptionEnabled()) {
+        // Disable the developer option toggle UI if ANGLE is disabled, this means next time the
+        // debug property needs to be set to true again to enable ANGLE. If ANGLE is enabled, don't
+        // disable the developer option toggle UI so that it can be turned off easily.
+        if (!isAngleDeveloperOptionEnabled() && !((SwitchPreference) mPreference).isChecked()) {
             mPreference.setEnabled(false);
         }
     }
diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
index 76fed9b..8c78e80 100644
--- a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
@@ -72,6 +72,10 @@
     @Override
     public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
         final int privacy = Integer.parseInt((String) newValue);
+        if (mWifiEntry.getPrivacy() == privacy) {
+            // Prevent disconnection + reconnection if settings not changed.
+            return true;
+        }
         mWifiEntry.setPrivacy(privacy);
 
         // To activate changing, we need to reconnect network. WiFi will auto connect to
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 5827498..9131051 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -30,7 +30,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
 import static org.mockito.Mockito.when;
-import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
 
 import android.app.AppOpsManager;
 import android.app.backup.BackupManager;
@@ -42,7 +41,6 @@
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
-import android.os.Process;
 import android.os.UserHandle;
 
 import androidx.fragment.app.FragmentActivity;
@@ -77,6 +75,8 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.concurrent.TimeUnit;
+
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
         ShadowEntityHeaderController.class,
@@ -88,7 +88,6 @@
     private static final String SUMMARY = "summary";
     private static final String[] PACKAGE_NAME = {"com.android.app"};
     private static final String USAGE_PERCENT = "16%";
-    private static final String SLOT_TIME = "12 am-2 am";
     private static final int ICON_ID = 123;
     private static final int UID = 1;
     private static final long BACKGROUND_TIME_MS = 100;
@@ -96,7 +95,6 @@
     private static final long FOREGROUND_SERVICE_TIME_MS = 444;
     private static final long FOREGROUND_TIME_MS =
             FOREGROUND_ACTIVITY_TIME_MS + FOREGROUND_SERVICE_TIME_MS;
-    private static final long FOREGROUND_SERVICE_TIME_US = FOREGROUND_SERVICE_TIME_MS * 1000;
     private static final String KEY_PREF_UNRESTRICTED = "unrestricted_pref";
     private static final String KEY_PREF_OPTIMIZED = "optimized_pref";
     private static final String KEY_PREF_RESTRICTED = "restricted_pref";
@@ -264,405 +262,6 @@
     }
 
     @Test
-    public void initHeader_noAnyTimeNoConsumedPower_hasEmptySummary() {
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEmpty();
-    }
-
-    @Test
-    public void initHeader_noAnyTimeButConsumedPower_hasEmptySummary() {
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
-        bundle.putInt(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_AMOUNT, /* value */ 10);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEmpty();
-    }
-
-    @Test
-    public void initHeader_ScreenTimeZerobackgroundTwoMin_hasCorrectSummary() {
-        final long backgroundTimeTwoMinutes = 120000;
-        final long foregroundTimeZero = 0;
-        final long screenOnTimeZero = 0;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("Background: 2 min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeZerobackgroundLessThanAMin_hasCorrectSummary() {
-        final long backgroundTimeLessThanAMinute = 59999;
-        final long foregroundTimeZero = 0;
-        final long screenOnTimeZero = 0;
-        Bundle bundle = new Bundle();
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("Background: less than a min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundTwoMin_hasCorrectSummary() {
-        final long backgroundTimeTwoMinutes = 120000;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeAMinute = 60000;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: 1 min\nBackground: 2 min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundLessThanAMin_hasCorrectSummary() {
-        final long backgroundTimeLessThanAMinute = 59999;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeAMinute = 60000;
-        Bundle bundle = new Bundle();
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: 1 min\nBackground: less than a min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundZero_hasCorrectSummary() {
-        final long backgroundTimezero = 0;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeAMinute = 60000;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: 1 min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeLessThanAMinBackgroundTwoMin_hasCorrectSummary() {
-        final long backgroundTimeTwoMinutes = 120000;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeLessThanAMinute = 59999;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: less than a min\nBackground: 2 min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeLessThanAMinBackgroundLessThanAMin_hasCorrectSummary() {
-        final long backgroundTimeLessThanAMinute = 59999;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeLessThanAMinute = 59999;
-        Bundle bundle = new Bundle();
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: less than a min\nBackground: less than a min\n(since last full "
-                        + "charge)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeLessThanAMinBackgroundZero_hasCorrectSummary() {
-        final long backgroundTimezero = 0;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeLessThanAMinute = 59999;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: less than a min\n(since last full charge)");
-    }
-
-    @Test
-    public void initHeader_noAnyTimeNoConsumedPowerWithSlotTime_hasEmptySummary() {
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEmpty();
-    }
-
-    @Test
-    public void initHeader_noAnyTimeButConsumedPowerWithSlotTime_hasEmptySummary() {
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, /* value */ 0);
-        bundle.putInt(AdvancedPowerUsageDetail.EXTRA_POWER_USAGE_AMOUNT, /* value */ 10);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEmpty();
-    }
-
-    @Test
-    public void initHeader_ScreenTimeZerobackgroundTwoMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeTwoMinutes = 120000;
-        final long foregroundTimeZero = 0;
-        final long screenOnTimeZero = 0;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("Background: 2 min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeZerobackgroundLessThanAMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeLessThanAMinute = 59999;
-        final long foregroundTimeZero = 0;
-        final long screenOnTimeZero = 0;
-        Bundle bundle = new Bundle();
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeZero);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString())
-                .isEqualTo("Background: less than a min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundTwoMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeTwoMinutes = 120000;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeAMinute = 60000;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: 1 min\nBackground: 2 min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundLessThanAMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeLessThanAMinute = 59999;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeAMinute = 60000;
-        Bundle bundle = new Bundle();
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: 1 min\nBackground: less than a min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeAMinuteBackgroundZeroWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimezero = 0;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeAMinute = 60000;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeAMinute);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: 1 min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeLessThanAMinBackgroundTwoMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeTwoMinutes = 120000;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeLessThanAMinute = 59999;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: less than a min\nBackground: 2 min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeLessAMinBackgroundLessAMinWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimeLessThanAMinute = 59999;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeLessThanAMinute = 59999;
-        Bundle bundle = new Bundle();
-        bundle.putLong(
-                AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: less than a min\nBackground: less than a min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_ScreenTimeLessThanAMinBackgroundZeroWithSlotTime_hasCorrectSummary() {
-        final long backgroundTimezero = 0;
-        final long foregroundTimeTwoMinutes = 120000;
-        final long screenOnTimeLessThanAMinute = 59999;
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimezero);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, screenOnTimeLessThanAMinute);
-        bundle.putString(AdvancedPowerUsageDetail.EXTRA_SLOT_TIME, SLOT_TIME);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue().toString()).isEqualTo(
-                "Screen time: less than a min\n(12 am-2 am)");
-    }
-
-    @Test
-    public void initHeader_systemUidWithChartIsEnabled_notNullSummary() {
-        Bundle bundle = new Bundle();
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, 240000);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, 120000);
-        bundle.putLong(AdvancedPowerUsageDetail.EXTRA_SCREEN_ON_TIME, 120000);
-        bundle.putInt(AdvancedPowerUsageDetail.EXTRA_UID, Process.SYSTEM_UID);
-        when(mFragment.getArguments()).thenReturn(bundle);
-
-        mFragment.initHeader();
-
-        ArgumentCaptor<CharSequence> captor = ArgumentCaptor.forClass(CharSequence.class);
-        verify(mEntityHeaderController).setSummary(captor.capture());
-        assertThat(captor.getValue()).isNotNull();
-    }
-
-    @Test
     public void startBatteryDetailPage_invalidToShowSummary_noFGBDData() {
         AdvancedPowerUsageDetail.startBatteryDetailPage(mActivity, mFragment,
                 mBatteryEntry, USAGE_PERCENT);
@@ -767,7 +366,7 @@
         mFragment.onRadioButtonClicked(mOptimizePreference);
         mFragment.onPause();
 
-        shadowMainLooper().idle();
+        TimeUnit.SECONDS.sleep(1);
         verify(mMetricsFeatureProvider)
                 .action(
                         SettingsEnums.OPEN_APP_BATTERY_USAGE,
@@ -791,7 +390,7 @@
         mFragment.onRadioButtonClicked(mOptimizePreference);
         mFragment.onPause();
 
-        shadowMainLooper().idle();
+        TimeUnit.SECONDS.sleep(1);
         verifyNoInteractions(mMetricsFeatureProvider);
     }
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java
new file mode 100644
index 0000000..2449040
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageTimeControllerTest.java
@@ -0,0 +1,248 @@
+/*
+ * 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.fuelgauge;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public final class PowerUsageTimeControllerTest {
+    private static final String SLOT_TIME = "12 am-2 am";
+    private static final String KEY_SCREEN_ON_TIME_PREF = "battery_usage_screen_time";
+    private static final String KEY_BACKGROUND_TIME_PREF = "battery_usage_background_time";
+    private static final String TEST_ANOMALY_HINT_TEXT = "test_anomaly_hint_text";
+
+    private Context mContext;
+    private PowerUsageTimeController mPowerUsageTimeController;
+
+    @Mock
+    private PreferenceCategory mPowerUsageTimeCategory;
+    @Mock
+    private PowerUsageTimePreference mScreenTimePreference;
+    @Mock
+    private PowerUsageTimePreference mBackgroundTimePreference;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+        mPowerUsageTimeController = new PowerUsageTimeController(mContext);
+        mPowerUsageTimeController.mPowerUsageTimeCategory = mPowerUsageTimeCategory;
+        mPowerUsageTimeController.mScreenTimePreference = mScreenTimePreference;
+        mPowerUsageTimeController.mBackgroundTimePreference = mBackgroundTimePreference;
+        doReturn(KEY_SCREEN_ON_TIME_PREF).when(mScreenTimePreference).getKey();
+        doReturn(KEY_BACKGROUND_TIME_PREF).when(mBackgroundTimePreference).getKey();
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_noInfo_prefInvisible() {
+        mPowerUsageTimeController.handleScreenTimeUpdated(/*slotTime=*/ null,
+                /*screenOnTimeInMs=*/ 0, /*backgroundTimeInMs=*/ 0,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(false);
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_onlySlotTime_prefInvisible() {
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                /*screenOnTimeInMs=*/ 0, /*backgroundTimeInMs=*/ 0,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(false);
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_lackBackgroundTime_onlyScreenOnTime() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeZero = 0;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeZero,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyOnePreferenceInvisible(mBackgroundTimePreference);
+        verify(mScreenTimePreference).setTimeTitle("Screen time");
+        verify(mScreenTimePreference).setTimeSummary("1 min");
+        verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_lackScreenOnTime_onlyBackgroundTime() {
+        final long screenOnTimeZero = 0;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeZero, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyOnePreferenceInvisible(mScreenTimePreference);
+        verify(mBackgroundTimePreference).setTimeTitle("Background time");
+        verify(mBackgroundTimePreference).setTimeSummary("2 min");
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_categoryTitleWithSlotTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeTitle("Screen time");
+        verify(mScreenTimePreference).setTimeSummary("1 min");
+        verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
+        verify(mBackgroundTimePreference).setTimeTitle("Background time");
+        verify(mBackgroundTimePreference).setTimeSummary("2 min");
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+        verify(mPowerUsageTimeCategory).setTitle("App usage for 12 am-2 am");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_categoryTitleWithoutSlotTime_expectedResult() {
+        final long backgroundTimeTwoMinutes = 120000;
+        final long screenOnTimeAMinute = 60000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(/*slotTime=*/ null,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mPowerUsageTimeCategory).setTitle("App usage since last full charge");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_BackgroundLessThanAMinWithSlotTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeLessThanAMinute = 59999;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeLessThanAMinute,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("1 min");
+        verify(mBackgroundTimePreference).setTimeSummary("Less than a min");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_ScreenTimeLessThanAMin_expectedResult() {
+        final long screenOnTimeLessThanAMinute = 59999;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeLessThanAMinute, backgroundTimeTwoMinutes,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("Less than a min");
+        verify(mBackgroundTimePreference).setTimeSummary("2 min");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_bothLessThanAMin_expectedResult() {
+        final long screenOnTimeLessThanAMinute = 59999;
+        final long backgroundTimeLessThanAMinute = 59999;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeLessThanAMinute, backgroundTimeLessThanAMinute,
+                /*anomalyHintPrefKey=*/ null, /*anomalyHintText=*/ null);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("Less than a min");
+        verify(mBackgroundTimePreference).setTimeSummary("Less than a min");
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_anomalyOfScreenOnTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                KEY_SCREEN_ON_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_anomalyOfBackgroundTime_expectedResult() {
+        final long screenOnTimeAMinute = 60000;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeAMinute, backgroundTimeTwoMinutes,
+                KEY_BACKGROUND_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
+        verify(mBackgroundTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
+    }
+
+    @Test
+    public void handleScreenTimeUpdated_anomalyOfScreenOnTimeWithoutTimeInfo_expectedResult() {
+        final long screenOnTimeZero = 0;
+        final long backgroundTimeTwoMinutes = 120000;
+
+        mPowerUsageTimeController.handleScreenTimeUpdated(SLOT_TIME,
+                screenOnTimeZero, backgroundTimeTwoMinutes,
+                KEY_SCREEN_ON_TIME_PREF, TEST_ANOMALY_HINT_TEXT);
+
+        verifyAllPreferencesVisible(true);
+        verify(mScreenTimePreference).setTimeSummary("Less than a min");
+        verify(mScreenTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
+        verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
+    }
+
+    private void verifySetPrefToVisible(Preference pref, boolean isVisible) {
+        verify(pref, isVisible ? times(1) : never()).setVisible(true);
+    }
+
+    private void verifyAllPreferencesVisible(boolean isVisible) {
+        verifySetPrefToVisible(mScreenTimePreference, isVisible);
+        verifySetPrefToVisible(mBackgroundTimePreference, isVisible);
+        verifySetPrefToVisible(mPowerUsageTimeCategory, isVisible);
+    }
+
+    private void verifyOnePreferenceInvisible(Preference pref) {
+        verifySetPrefToVisible(mScreenTimePreference, mScreenTimePreference != pref);
+        verifySetPrefToVisible(mBackgroundTimePreference, mBackgroundTimePreference != pref);
+        verifySetPrefToVisible(mPowerUsageTimeCategory, mPowerUsageTimeCategory != pref);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.java
deleted file mode 100644
index d3244fa..0000000
--- a/tests/robotests/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.wifi.details2;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-
-import androidx.preference.DropDownPreference;
-
-import com.android.settings.R;
-import com.android.wifitrackerlib.WifiEntry;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class WifiPrivacyPreferenceController2Test {
-
-    private static final int PRIVACY_RANDOMIZED = WifiEntry.PRIVACY_RANDOMIZED_MAC;
-    private static final int PRIVACY_TRUSTED = WifiEntry.PRIVACY_DEVICE_MAC;
-
-    @Mock private WifiEntry mMockWifiEntry;
-
-    private WifiPrivacyPreferenceController2 mPreferenceController;
-    private Context mContext;
-    private DropDownPreference mDropDownPreference;
-    private String[] mPerferenceStrings;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-
-        mMockWifiEntry = mock(WifiEntry.class);
-        WifiPrivacyPreferenceController2 preferenceController =
-                new WifiPrivacyPreferenceController2(mContext);
-        preferenceController.setWifiEntry(mMockWifiEntry);
-        mPreferenceController = spy(preferenceController);
-        mDropDownPreference = new DropDownPreference(mContext);
-        mDropDownPreference.setEntries(R.array.wifi_privacy_entries);
-        mDropDownPreference.setEntryValues(R.array.wifi_privacy_values);
-
-        mPerferenceStrings = mContext.getResources().getStringArray(R.array.wifi_privacy_entries);
-    }
-
-    @Test
-    public void testUpdateState_wifiPrivacy_setCorrectValue() {
-        doReturn(PRIVACY_TRUSTED).when(mPreferenceController).getRandomizationValue();
-
-        mPreferenceController.updateState(mDropDownPreference);
-
-        int prefValue = mPreferenceController.translateMacRandomizedValueToPrefValue(
-                PRIVACY_TRUSTED);
-        assertThat(mDropDownPreference.getEntry()).isEqualTo(mPerferenceStrings[prefValue]);
-    }
-
-    @Test
-    public void testUpdateState_wifiNotMetered_setCorrectValue() {
-        doReturn(PRIVACY_RANDOMIZED).when(mPreferenceController).getRandomizationValue();
-
-        mPreferenceController.updateState(mDropDownPreference);
-
-        int prefValue = mPreferenceController.translateMacRandomizedValueToPrefValue(
-                PRIVACY_RANDOMIZED);
-        assertThat(mDropDownPreference.getEntry()).isEqualTo(mPerferenceStrings[prefValue]);
-    }
-
-    @Test
-    public void testUpdateState_canSetPrivacyInNextUpdate_shouldBeSelectable() {
-        // Return false in WifiEntry#canSetPrivacy to make preference un-selectable first.
-        when(mMockWifiEntry.canSetPrivacy()).thenReturn(false);
-
-        mPreferenceController.updateState(mDropDownPreference);
-
-        assertThat(mDropDownPreference.isSelectable()).isFalse();
-
-        // Return true in WifiEntry#canSetPrivacy to verify preference back to selectable.
-        when(mMockWifiEntry.canSetPrivacy()).thenReturn(true);
-
-        mPreferenceController.updateState(mDropDownPreference);
-
-        assertThat(mDropDownPreference.isSelectable()).isTrue();
-    }
-
-    @Test
-    public void testUpdateState_canNotSetPrivacyInNextUpdate_shouldNotBeSelectable() {
-        // Return true in WifiEntry#canSetPrivacy to make preference selectable first.
-        when(mMockWifiEntry.canSetPrivacy()).thenReturn(true);
-
-        mPreferenceController.updateState(mDropDownPreference);
-
-        assertThat(mDropDownPreference.isSelectable()).isTrue();
-
-        // Return false in WifiEntry#canSetPrivacy to verify preference back to un-selectable.
-        when(mMockWifiEntry.canSetPrivacy()).thenReturn(false);
-
-        mPreferenceController.updateState(mDropDownPreference);
-
-        assertThat(mDropDownPreference.isSelectable()).isFalse();
-    }
-}
diff --git a/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.kt b/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.kt
new file mode 100644
index 0000000..cb1f997
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2Test.kt
@@ -0,0 +1,143 @@
+/*
+ * 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.wifi.details2
+
+import android.content.Context
+import androidx.preference.ListPreference
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.R
+import com.android.wifitrackerlib.WifiEntry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.never
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.stub
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@RunWith(AndroidJUnit4::class)
+class WifiPrivacyPreferenceController2Test {
+    private var mockWifiEntry = mock<WifiEntry>()
+
+    private var context: Context = ApplicationProvider.getApplicationContext()
+
+    private var controller = spy(WifiPrivacyPreferenceController2(context).apply {
+        setWifiEntry(mockWifiEntry)
+    })
+
+    private var preference = ListPreference(context).apply {
+        setEntries(R.array.wifi_privacy_entries)
+        setEntryValues(R.array.wifi_privacy_values)
+    }
+
+    private var preferenceStrings = context.resources.getStringArray(R.array.wifi_privacy_entries)
+
+    @Test
+    fun updateState_wifiPrivacy_setCorrectValue() {
+        controller.stub {
+            doReturn(WifiEntry.PRIVACY_DEVICE_MAC).whenever(mock).randomizationValue
+        }
+
+        controller.updateState(preference)
+
+        val prefValue = WifiPrivacyPreferenceController2.translateMacRandomizedValueToPrefValue(
+            WifiEntry.PRIVACY_DEVICE_MAC
+        )
+        assertThat(preference.entry).isEqualTo(preferenceStrings[prefValue])
+    }
+
+    @Test
+    fun updateState_wifiNotMetered_setCorrectValue() {
+        controller.stub {
+            doReturn(WifiEntry.PRIVACY_RANDOMIZED_MAC).whenever(mock).randomizationValue
+        }
+
+        controller.updateState(preference)
+
+        val prefValue = WifiPrivacyPreferenceController2.translateMacRandomizedValueToPrefValue(
+            WifiEntry.PRIVACY_RANDOMIZED_MAC
+        )
+        assertThat(preference.entry).isEqualTo(preferenceStrings[prefValue])
+    }
+
+    @Test
+    fun updateState_canSetPrivacyInNextUpdate_shouldBeSelectable() {
+        mockWifiEntry.stub {
+            // Return false in WifiEntry#canSetPrivacy to make preference un-selectable first.
+            on { canSetPrivacy() } doReturn false
+        }
+        controller.updateState(preference)
+        assertThat(preference.isSelectable).isFalse()
+
+        mockWifiEntry.stub {
+            // Return true in WifiEntry#canSetPrivacy to verify preference back to selectable.
+            on { canSetPrivacy() } doReturn true
+        }
+        controller.updateState(preference)
+        assertThat(preference.isSelectable).isTrue()
+    }
+
+    @Test
+    fun updateState_canNotSetPrivacyInNextUpdate_shouldNotBeSelectable() {
+        mockWifiEntry.stub {
+            // Return true in WifiEntry#canSetPrivacy to make preference selectable first.
+            on { canSetPrivacy() } doReturn true
+        }
+        controller.updateState(preference)
+        assertThat(preference.isSelectable).isTrue()
+
+        mockWifiEntry.stub {
+            // Return false in WifiEntry#canSetPrivacy to verify preference back to un-selectable.
+            on { canSetPrivacy() } doReturn false
+        }
+        controller.updateState(preference)
+        assertThat(preference.isSelectable).isFalse()
+    }
+
+    @Test
+    fun onPreferenceChange_sameNewValue_doNoting() {
+        mockWifiEntry.stub {
+            on { privacy } doReturn 0
+            on { connectedState } doReturn WifiEntry.CONNECTED_STATE_CONNECTED
+        }
+
+        controller.onPreferenceChange(preference, "0")
+
+        verify(mockWifiEntry, never()).privacy = any()
+        verify(mockWifiEntry, never()).disconnect(null)
+        verify(mockWifiEntry, never()).connect(null)
+    }
+
+    @Test
+    fun onPreferenceChange_differentNewValue_setAndReconnect() {
+        mockWifiEntry.stub {
+            on { privacy } doReturn 0
+            on { connectedState } doReturn WifiEntry.CONNECTED_STATE_CONNECTED
+        }
+
+        controller.onPreferenceChange(preference, "1")
+
+        verify(mockWifiEntry).privacy = 1
+        verify(mockWifiEntry).disconnect(null)
+        verify(mockWifiEntry).connect(null)
+    }
+}
diff --git a/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java b/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
index 4aa38ae..a402d91 100644
--- a/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
+++ b/tests/unit/src/com/android/settings/development/graphicsdriver/GraphicsDriverEnableAngleAsSystemDriverControllerJUnitTest.java
@@ -24,6 +24,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.eq;
@@ -472,4 +474,27 @@
         SystemProperties.removeChangeCallback(propertyChangeSignal1.getCountDownJob());
         SystemProperties.removeChangeCallback(propertyChangeSignal2.getCountDownJob());
     }
+
+    @Test
+    public void updateState_DeveloperOptionPropertyIsFalse() {
+        // Test that when debug.graphics.angle.developeroption.enable is false:
+        when(mSystemPropertiesMock.getBoolean(eq(PROPERTY_DEBUG_ANGLE_DEVELOPER_OPTION),
+                                              anyBoolean())).thenReturn(false);
+        when(mSystemPropertiesMock.get(eq(PROPERTY_RO_GFX_ANGLE_SUPPORTED), any()))
+                .thenReturn("true");
+
+        // 1. "Enable ANGLE" switch is on, the switch should be enabled.
+        when(mSystemPropertiesMock.get(eq(PROPERTY_PERSISTENT_GRAPHICS_EGL), any()))
+                .thenReturn(ANGLE_DRIVER_SUFFIX);
+        mController.updateState(mPreference);
+        assertTrue(mPreference.isChecked());
+        assertTrue(mPreference.isEnabled());
+
+        // 2. "Enable ANGLE" switch is off, the switch should be disabled.
+        when(mSystemPropertiesMock.get(eq(PROPERTY_PERSISTENT_GRAPHICS_EGL), any()))
+                .thenReturn("");
+        mController.updateState(mPreference);
+        assertFalse(mPreference.isChecked());
+        assertFalse(mPreference.isEnabled());
+    }
 }