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/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 0441ba2..a99af4e 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -614,6 +614,11 @@
* Whether to go into Deep Doze as soon as the screen turns off or not.
*/
int QUICK_DOZE = 15;
+
+ /**
+ * Whether to enable night mode when battery saver is enabled.
+ */
+ int NIGHT_MODE = 16;
}
/**
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e14bb66..4046dfd 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -11443,6 +11443,7 @@
* <pre>
* advertise_is_enabled (boolean)
* datasaver_disabled (boolean)
+ * enable_night_mode (boolean)
* launch_boost_disabled (boolean)
* vibration_disabled (boolean)
* animation_disabled (boolean)
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);