Adding enableNightMode flag to BatterySaverPolicy.

Also migrating UiModeManagerService to register a LowPowerModeListener
so it uses the more standard interface for Battery Saver.

Bug: 119261320
Bug: 122968431
Test: atest com.android.server.power.batterysaver.BatterySaverPolicyTest
Change-Id: I669737d5985d0b2835740a53695526a2119cdf49
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 1b1e6ad..6b57fcd 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -37,6 +37,8 @@
 import android.os.Binder;
 import android.os.Handler;
 import android.os.PowerManager;
+import android.os.PowerManager.ServiceType;
+import android.os.PowerManagerInternal;
 import android.os.RemoteException;
 import android.os.ResultReceiver;
 import android.os.ServiceManager;
@@ -161,9 +163,6 @@
                 case Intent.ACTION_BATTERY_CHANGED:
                     mCharging = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
                     break;
-                case PowerManager.ACTION_POWER_SAVE_MODE_CHANGING:
-                    mPowerSave = intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false);
-                    break;
             }
             synchronized (mLock) {
                 if (mSystemReady) {
@@ -208,9 +207,24 @@
         context.registerReceiver(mDockModeReceiver,
                 new IntentFilter(Intent.ACTION_DOCK_EVENT));
         IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
-        batteryFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
         context.registerReceiver(mBatteryReceiver, batteryFilter);
 
+        PowerManagerInternal localPowerManager =
+                LocalServices.getService(PowerManagerInternal.class);
+        mPowerSave = localPowerManager.getLowPowerState(ServiceType.NIGHT_MODE).batterySaverEnabled;
+        localPowerManager.registerLowPowerModeObserver(ServiceType.NIGHT_MODE,
+                state -> {
+                    synchronized (mLock) {
+                        if (mPowerSave == state.batterySaverEnabled) {
+                            return;
+                        }
+                        mPowerSave = state.batterySaverEnabled;
+                        if (mSystemReady) {
+                            updateLocked(0, 0);
+                        }
+                    }
+                });
+
         mConfiguration.setToDefaults();
 
         final Resources res = context.getResources();
diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
index 1d74e1f..5ab9463 100644
--- a/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
+++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverPolicy.java
@@ -104,6 +104,7 @@
     private static final String KEY_AOD_DISABLED = "aod_disabled";
     // Go into deep Doze as soon as the screen turns off.
     private static final String KEY_QUICK_DOZE_ENABLED = "quick_doze_enabled";
+    private static final String KEY_ENABLE_NIGHT_MODE = "enable_night_mode";
 
     private static final String KEY_CPU_FREQ_INTERACTIVE = "cpufreq-i";
     private static final String KEY_CPU_FREQ_NONINTERACTIVE = "cpufreq-n";
@@ -123,6 +124,7 @@
             false, /* enableAdjustBrightness */
             false, /* enableDataSaver */
             false, /* enableFireWall */
+            false, /* enableNightMode */
             false, /* enableQuickDoze */
             new ArrayMap<>(), /* filesForInteractive */
             new ArrayMap<>(), /* filesForNoninteractive */
@@ -147,6 +149,7 @@
             false, /* enableAdjustBrightness */
             false, /* enableDataSaver */
             true,  /* enableFirewall */
+            true, /* enableNightMode */
             true, /* enableQuickDoze */
             new ArrayMap<>(), /* filesForInteractive */
             new ArrayMap<>(), /* filesForNoninteractive */
@@ -523,6 +526,11 @@
         public final boolean enableFirewall;
 
         /**
+         * Whether to enable night mode or not.
+         */
+        public final boolean enableNightMode;
+
+        /**
          * Whether Quick Doze is enabled or not.
          */
         public final boolean enableQuickDoze;
@@ -577,6 +585,7 @@
                 boolean enableAdjustBrightness,
                 boolean enableDataSaver,
                 boolean enableFirewall,
+                boolean enableNightMode,
                 boolean enableQuickDoze,
                 ArrayMap<String, String> filesForInteractive,
                 ArrayMap<String, String> filesForNoninteractive,
@@ -597,6 +606,7 @@
             this.enableAdjustBrightness = enableAdjustBrightness;
             this.enableDataSaver = enableDataSaver;
             this.enableFirewall = enableFirewall;
+            this.enableNightMode = enableNightMode;
             this.enableQuickDoze = enableQuickDoze;
             this.filesForInteractive = filesForInteractive;
             this.filesForNoninteractive = filesForNoninteractive;
@@ -618,6 +628,7 @@
                     enableAdjustBrightness,
                     enableDataSaver,
                     enableFirewall,
+                    enableNightMode,
                     enableQuickDoze,
                     filesForInteractive,
                     filesForNoninteractive,
@@ -653,6 +664,8 @@
                     config.getEnableAdjustBrightness(),
                     config.getEnableDataSaver(),
                     config.getEnableFirewall(),
+                    // TODO: add option to config
+                    config.getAdvertiseIsEnabled(),
                     config.getEnableQuickDoze(),
                     /* filesForInteractive */
                     (new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(),
@@ -715,6 +728,8 @@
                     !defaultPolicy.enableDataSaver);
             boolean enableFirewall = !parser.getBoolean(KEY_ACTIVATE_FIREWALL_DISABLED,
                     !defaultPolicy.enableFirewall);
+            boolean enableNightMode = !parser.getBoolean(KEY_ENABLE_NIGHT_MODE,
+                    !defaultPolicy.enableNightMode);
             boolean enableQuickDoze = parser.getBoolean(KEY_QUICK_DOZE_ENABLED,
                     defaultPolicy.enableQuickDoze);
             boolean forceAllAppsStandby = parser.getBoolean(KEY_FORCE_ALL_APPS_STANDBY,
@@ -738,6 +753,7 @@
                     enableAdjustBrightness,
                     enableDataSaver,
                     enableFirewall,
+                    enableNightMode,
                     enableQuickDoze,
                     /* filesForInteractive */
                     (new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(),
@@ -767,6 +783,7 @@
                     && enableAdjustBrightness == other.enableAdjustBrightness
                     && enableDataSaver == other.enableDataSaver
                     && enableFirewall == other.enableFirewall
+                    && enableNightMode == other.enableNightMode
                     && enableQuickDoze == other.enableQuickDoze
                     && forceAllAppsStandby == other.forceAllAppsStandby
                     && forceBackgroundCheck == other.forceBackgroundCheck
@@ -832,6 +849,9 @@
                 case ServiceType.FORCE_BACKGROUND_CHECK:
                     return builder.setBatterySaverEnabled(currPolicy.forceBackgroundCheck)
                             .build();
+                case ServiceType.NIGHT_MODE:
+                    return builder.setBatterySaverEnabled(currPolicy.enableNightMode)
+                            .build();
                 case ServiceType.OPTIONAL_SENSORS:
                     return builder.setBatterySaverEnabled(currPolicy.disableOptionalSensors)
                             .build();
@@ -1008,6 +1028,8 @@
         pw.println("  " + KEY_SOUNDTRIGGER_DISABLED + "=" + p.disableSoundTrigger);
         pw.print(indent);
         pw.println("  " + KEY_QUICK_DOZE_ENABLED + "=" + p.enableQuickDoze);
+        pw.print(indent);
+        pw.println("  " + KEY_ENABLE_NIGHT_MODE + "=" + p.enableNightMode);
 
         pw.print("    Interactive File values:\n");
         dumpMap(pw, "      ", p.filesForInteractive);
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
index e32a789..702605d 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
@@ -40,7 +40,7 @@
  * Tests for {@link com.android.server.power.batterysaver.BatterySaverPolicy}
  */
 public class BatterySaverPolicyTest extends AndroidTestCase {
-    private static final int MAX_SERVICE_TYPE = 15;
+    private static final int MAX_SERVICE_TYPE = 16;
     private static final float BRIGHTNESS_FACTOR = 0.7f;
     private static final float DEFAULT_BRIGHTNESS_FACTOR = 0.5f;
     private static final float PRECISION = 0.001f;
@@ -146,6 +146,11 @@
     }
 
     @SmallTest
+    public void testGetBatterySaverPolicy_PolicyNightMode_DefaultValueCorrect() {
+        testServiceDefaultValue_On(ServiceType.NIGHT_MODE);
+    }
+
+    @SmallTest
     public void testGetBatterySaverPolicy_PolicyDataSaver_DefaultValueCorrect() {
         mBatterySaverPolicy.updateConstantsLocked("", "");
         mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_FULL);