Merge "Add CTS test for transient night mode in car mode"
diff --git a/common/device-side/util/src/com/android/compatibility/common/util/SettingsUtils.java b/common/device-side/util/src/com/android/compatibility/common/util/SettingsUtils.java
index 470d3df..60e0069 100644
--- a/common/device-side/util/src/com/android/compatibility/common/util/SettingsUtils.java
+++ b/common/device-side/util/src/com/android/compatibility/common/util/SettingsUtils.java
@@ -171,4 +171,11 @@
         set(SettingsUtils.NAMESPACE_SECURE, key, value);
 
     }
+
+    /**
+     * Get a global setting for the current (foreground) user. Trims ending new line.
+     */
+    public static String getSecureSetting(String key) {
+        return SystemUtil.runShellCommand("settings --user current get secure " + key).trim();
+    }
 }
diff --git a/tests/app/src/android/app/cts/UiModeManagerTest.java b/tests/app/src/android/app/cts/UiModeManagerTest.java
index 40fe0f5..e63c222 100644
--- a/tests/app/src/android/app/cts/UiModeManagerTest.java
+++ b/tests/app/src/android/app/cts/UiModeManagerTest.java
@@ -22,6 +22,9 @@
 import android.test.AndroidTestCase;
 import android.util.Log;
 
+import com.android.compatibility.common.util.BatteryUtils;
+import com.android.compatibility.common.util.SettingsUtils;
+
 public class UiModeManagerTest extends AndroidTestCase {
     private static final String TAG = "UiModeManagerTest";
 
@@ -65,6 +68,90 @@
         }
     }
 
+    public void testNightModeInCarModeIsTransient() {
+        if (mUiModeManager.isNightModeLocked()) {
+            return;
+        }
+
+        assertNightModeChange(UiModeManager.MODE_NIGHT_NO);
+
+        mUiModeManager.enableCarMode(0);
+        assertEquals(Configuration.UI_MODE_TYPE_CAR, mUiModeManager.getCurrentModeType());
+
+        assertNightModeChange(UiModeManager.MODE_NIGHT_YES);
+
+        mUiModeManager.disableCarMode(0);
+        assertNotSame(Configuration.UI_MODE_TYPE_CAR, mUiModeManager.getCurrentModeType());
+        assertEquals(UiModeManager.MODE_NIGHT_NO, mUiModeManager.getNightMode());
+    }
+
+    public void testNightModeToggleInCarModeDoesNotChangeSetting() {
+        if (mUiModeManager.isNightModeLocked()) {
+            return;
+        }
+
+        assertNightModeChange(UiModeManager.MODE_NIGHT_NO);
+        assertStoredNightModeSetting(UiModeManager.MODE_NIGHT_NO);
+
+        mUiModeManager.enableCarMode(0);
+        assertStoredNightModeSetting(UiModeManager.MODE_NIGHT_NO);
+
+        assertNightModeChange(UiModeManager.MODE_NIGHT_YES);
+        assertStoredNightModeSetting(UiModeManager.MODE_NIGHT_NO);
+
+        mUiModeManager.disableCarMode(0);
+        assertStoredNightModeSetting(UiModeManager.MODE_NIGHT_NO);
+    }
+
+    public void testNightModeInCarModeOnPowerSaveIsTransient() throws Throwable {
+        if (mUiModeManager.isNightModeLocked() || !BatteryUtils.isBatterySaverSupported()) {
+            return;
+        }
+
+        BatteryUtils.runDumpsysBatteryUnplug();
+
+        // Turn off battery saver, disable night mode
+        BatteryUtils.enableBatterySaver(false);
+        mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
+        assertEquals(UiModeManager.MODE_NIGHT_NO, mUiModeManager.getNightMode());
+        assertVisibleNightModeInConfiguration(Configuration.UI_MODE_NIGHT_NO);
+
+        // Then enable battery saver to check night mode is made visible
+        BatteryUtils.enableBatterySaver(true);
+        assertEquals(UiModeManager.MODE_NIGHT_NO, mUiModeManager.getNightMode());
+        assertVisibleNightModeInConfiguration(Configuration.UI_MODE_NIGHT_YES);
+
+        // Then disable it, enable car mode, and check night mode is not visible
+        BatteryUtils.enableBatterySaver(false);
+        mUiModeManager.enableCarMode(0);
+        assertEquals(Configuration.UI_MODE_TYPE_CAR, mUiModeManager.getCurrentModeType());
+        assertVisibleNightModeInConfiguration(Configuration.UI_MODE_NIGHT_NO);
+
+        // Enable battery saver, check that night mode is still not visible, overridden by car mode
+        BatteryUtils.enableBatterySaver(true);
+        assertEquals(UiModeManager.MODE_NIGHT_NO, mUiModeManager.getNightMode());
+        assertVisibleNightModeInConfiguration(Configuration.UI_MODE_NIGHT_NO);
+
+        // Disable car mode
+        mUiModeManager.disableCarMode(0);
+
+        // Toggle night mode to force propagation of uiMode update, since disabling car mode
+        // is deferred to a broadcast.
+        mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
+        mUiModeManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
+
+        // Check battery saver mode now shows night mode
+        assertNotSame(Configuration.UI_MODE_TYPE_CAR, mUiModeManager.getCurrentModeType());
+        assertVisibleNightModeInConfiguration(Configuration.UI_MODE_NIGHT_YES);
+
+        // Disable battery saver and check night mode back to not visible
+        BatteryUtils.enableBatterySaver(false);
+        assertEquals(UiModeManager.MODE_NIGHT_NO, mUiModeManager.getNightMode());
+        assertVisibleNightModeInConfiguration(Configuration.UI_MODE_NIGHT_NO);
+
+        BatteryUtils.runDumpsysBatteryReset();
+    }
+
     private boolean isAutomotive() {
         return getContext().getPackageManager().hasSystemFeature(
                 PackageManager.FEATURE_AUTOMOTIVE);
@@ -139,4 +226,17 @@
         mUiModeManager.setNightMode(mode);
         assertEquals(mode, mUiModeManager.getNightMode());
     }
+
+    private void assertVisibleNightModeInConfiguration(int mode) {
+        int uiMode = getContext().getResources().getConfiguration().uiMode;
+        int flags = uiMode & Configuration.UI_MODE_NIGHT_MASK;
+        assertEquals(mode, flags);
+    }
+
+    private void assertStoredNightModeSetting(int mode) {
+        // Settings.Secure.UI_NIGHT_MODE
+        String storedMode = SettingsUtils.getSecureSetting("ui_night_mode");
+        int storedModeInt = Integer.parseInt(storedMode);
+        assertEquals(mode, storedModeInt);
+    }
 }