diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 22ba74d70c167..be673ad148480 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -614,6 +614,11 @@ public final class PowerManager { * 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 3a02e85eee3b0..90749bb0183b4 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11442,6 +11442,7 @@ public final class Settings { *
* 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 1b1e6ad6e096a..6b57fcd314509 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.BatteryManager;
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 @@ final class UiModeManagerService extends SystemService {
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 @@ final class UiModeManagerService extends SystemService {
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 a122ed854a930..bd46a50f97de5 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 @@ public class BatterySaverPolicy extends ContentObserver {
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 @@ public class BatterySaverPolicy extends ContentObserver {
false, /* enableAdjustBrightness */
false, /* enableDataSaver */
false, /* enableFireWall */
+ false, /* enableNightMode */
false, /* enableQuickDoze */
new ArrayMap<>(), /* filesForInteractive */
new ArrayMap<>(), /* filesForNoninteractive */
@@ -147,6 +149,7 @@ public class BatterySaverPolicy extends ContentObserver {
false, /* enableAdjustBrightness */
false, /* enableDataSaver */
true, /* enableFirewall */
+ true, /* enableNightMode */
true, /* enableQuickDoze */
new ArrayMap<>(), /* filesForInteractive */
new ArrayMap<>(), /* filesForNoninteractive */
@@ -522,6 +525,11 @@ public class BatterySaverPolicy extends ContentObserver {
*/
public final boolean enableFirewall;
+ /**
+ * Whether to enable night mode or not.
+ */
+ public final boolean enableNightMode;
+
/**
* Whether Quick Doze is enabled or not.
*/
@@ -578,6 +586,7 @@ public class BatterySaverPolicy extends ContentObserver {
boolean enableAdjustBrightness,
boolean enableDataSaver,
boolean enableFirewall,
+ boolean enableNightMode,
boolean enableQuickDoze,
ArrayMap filesForInteractive,
ArrayMap filesForNoninteractive,
@@ -598,6 +607,7 @@ public class BatterySaverPolicy extends ContentObserver {
this.enableAdjustBrightness = enableAdjustBrightness;
this.enableDataSaver = enableDataSaver;
this.enableFirewall = enableFirewall;
+ this.enableNightMode = enableNightMode;
this.enableQuickDoze = enableQuickDoze;
this.filesForInteractive = filesForInteractive;
this.filesForNoninteractive = filesForNoninteractive;
@@ -619,6 +629,7 @@ public class BatterySaverPolicy extends ContentObserver {
enableAdjustBrightness,
enableDataSaver,
enableFirewall,
+ enableNightMode,
enableQuickDoze,
filesForInteractive,
filesForNoninteractive,
@@ -654,6 +665,8 @@ public class BatterySaverPolicy extends ContentObserver {
config.getEnableAdjustBrightness(),
config.getEnableDataSaver(),
config.getEnableFirewall(),
+ // TODO: add option to config
+ config.getAdvertiseIsEnabled(),
config.getEnableQuickDoze(),
/* filesForInteractive */
(new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(),
@@ -716,6 +729,8 @@ public class BatterySaverPolicy extends ContentObserver {
!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,
@@ -739,6 +754,7 @@ public class BatterySaverPolicy extends ContentObserver {
enableAdjustBrightness,
enableDataSaver,
enableFirewall,
+ enableNightMode,
enableQuickDoze,
/* filesForInteractive */
(new CpuFrequencies()).parseString(cpuFreqInteractive).toSysFileMap(),
@@ -768,6 +784,7 @@ public class BatterySaverPolicy extends ContentObserver {
&& enableAdjustBrightness == other.enableAdjustBrightness
&& enableDataSaver == other.enableDataSaver
&& enableFirewall == other.enableFirewall
+ && enableNightMode == other.enableNightMode
&& enableQuickDoze == other.enableQuickDoze
&& forceAllAppsStandby == other.forceAllAppsStandby
&& forceBackgroundCheck == other.forceBackgroundCheck
@@ -833,6 +850,9 @@ public class BatterySaverPolicy extends ContentObserver {
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();
@@ -1009,6 +1029,8 @@ public class BatterySaverPolicy extends ContentObserver {
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 9dcacf3021b8f..5c0a1c83b1b05 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 @@ import org.mockito.MockitoAnnotations;
* 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;
@@ -145,6 +145,11 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
testServiceDefaultValue_On(ServiceType.NETWORK_FIREWALL);
}
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyNightMode_DefaultValueCorrect() {
+ testServiceDefaultValue_On(ServiceType.NIGHT_MODE);
+ }
+
@SmallTest
public void testGetBatterySaverPolicy_PolicyDataSaver_DefaultValueCorrect() {
mBatterySaverPolicy.updateConstantsLocked("", "");