summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/IPowerManager.aidl18
-rw-r--r--core/java/android/os/PowerManager.java18
-rw-r--r--core/java/android/os/PowerManagerInternal.java5
-rw-r--r--core/java/android/os/PowerSaveState.aidl19
-rw-r--r--core/java/android/os/PowerSaveState.java95
-rwxr-xr-xcore/java/android/provider/Settings.java24
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java1
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java10
-rw-r--r--services/core/java/com/android/server/VibratorService.java18
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java15
-rw-r--r--services/core/java/com/android/server/location/GnssLocationProvider.java37
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java30
-rw-r--r--services/core/java/com/android/server/power/BatterySaverPolicy.java270
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java33
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java25
-rw-r--r--services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java175
-rw-r--r--services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java8
-rw-r--r--services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java9
-rw-r--r--tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java5
19 files changed, 750 insertions, 65 deletions
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index 1d464c005cb9..b71578060fdc 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -2,22 +2,23 @@
**
** Copyright 2007, 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
+** 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
+** 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
+** 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 android.os;
import android.os.WorkSource;
+import android.os.PowerSaveState;
/** @hide */
@@ -45,6 +46,7 @@ interface IPowerManager
void nap(long time);
boolean isInteractive();
boolean isPowerSaveMode();
+ PowerSaveState getPowerSaveState(int serviceType);
boolean setPowerSaveMode(boolean mode);
boolean isDeviceIdleMode();
boolean isLightDeviceIdleMode();
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 31b3bc988f40..a713eef72c45 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -971,6 +971,24 @@ public final class PowerManager {
}
/**
+ * Get data about the battery saver mode for a specific service
+ * @param serviceType unique key for the service, one of
+ * {@link com.android.server.power.BatterySaverPolicy.ServiceType}
+ * @return Battery saver state data.
+ *
+ * @hide
+ * @see com.android.server.power.BatterySaverPolicy
+ * @see PowerSaveState
+ */
+ public PowerSaveState getPowerSaveState(int serviceType) {
+ try {
+ return mService.getPowerSaveState(serviceType);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns true if the device is currently in idle mode. This happens when a device
* has been sitting unused and unmoving for a sufficiently long period of time, so that
* it decides to go into a lower power-use state. This may involve things like turning
diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java
index d0db2555823f..44addfc9bb1d 100644
--- a/core/java/android/os/PowerManagerInternal.java
+++ b/core/java/android/os/PowerManagerInternal.java
@@ -131,12 +131,13 @@ public abstract class PowerManagerInternal {
public abstract void setDozeOverrideFromDreamManager(
int screenState, int screenBrightness);
- public abstract boolean getLowPowerModeEnabled();
+ public abstract PowerSaveState getLowPowerState(int serviceType);
public abstract void registerLowPowerModeObserver(LowPowerModeListener listener);
public interface LowPowerModeListener {
- public void onLowPowerModeChanged(boolean enabled);
+ int getServiceType();
+ void onLowPowerModeChanged(PowerSaveState state);
}
public abstract boolean setDeviceIdleMode(boolean enabled);
diff --git a/core/java/android/os/PowerSaveState.aidl b/core/java/android/os/PowerSaveState.aidl
new file mode 100644
index 000000000000..e3f572d58e4f
--- /dev/null
+++ b/core/java/android/os/PowerSaveState.aidl
@@ -0,0 +1,19 @@
+/*
+** Copyright 2017, 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 android.os;
+
+parcelable PowerSaveState; \ No newline at end of file
diff --git a/core/java/android/os/PowerSaveState.java b/core/java/android/os/PowerSaveState.java
new file mode 100644
index 000000000000..9269e762ef4c
--- /dev/null
+++ b/core/java/android/os/PowerSaveState.java
@@ -0,0 +1,95 @@
+/* Copyright 2017, 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 android.os;
+
+/**
+ * Data class for battery saver state. It contains the data
+ * <p>
+ * 1. Whether battery saver mode is enabled
+ * 2. Specific parameters to use in battery saver mode(i.e. screen brightness, gps mode)
+ *
+ * @hide
+ */
+public class PowerSaveState implements Parcelable {
+ public final boolean batterySaverEnabled;
+ public final int gpsMode;
+ public final float brightnessFactor;
+
+ public PowerSaveState(Builder builder) {
+ batterySaverEnabled = builder.mBatterySaverEnabled;
+ gpsMode = builder.mGpsMode;
+ brightnessFactor = builder.mBrightnessFactor;
+ }
+
+ public PowerSaveState(Parcel in) {
+ batterySaverEnabled = in.readByte() != 0;
+ gpsMode = in.readInt();
+ brightnessFactor = in.readFloat();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeByte((byte) (batterySaverEnabled ? 1 : 0));
+ dest.writeInt(gpsMode);
+ dest.writeFloat(brightnessFactor);
+ }
+
+ public static final class Builder {
+ private boolean mBatterySaverEnabled = false;
+ private int mGpsMode = 0;
+ private float mBrightnessFactor = 0.5f;
+
+ public Builder() {}
+
+ public Builder setBatterySaverEnabled(boolean enabled) {
+ mBatterySaverEnabled = enabled;
+ return this;
+ }
+
+ public Builder setGpsMode(int mode) {
+ mGpsMode = mode;
+ return this;
+ }
+
+ public Builder setBrightnessFactor(float factor) {
+ mBrightnessFactor = factor;
+ return this;
+ }
+
+ public PowerSaveState build() {
+ return new PowerSaveState(this);
+ }
+ }
+
+ public static final Parcelable.Creator<PowerSaveState>
+ CREATOR = new Parcelable.Creator<PowerSaveState>() {
+
+ @Override
+ public PowerSaveState createFromParcel(Parcel source) {
+ return new PowerSaveState(source);
+ }
+
+ @Override
+ public PowerSaveState[] newArray(int size) {
+ return new PowerSaveState[size];
+ }
+ };
+} \ No newline at end of file
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 73d61c3cd1f0..4e78635580dc 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -8956,6 +8956,30 @@ public final class Settings {
public static final String DEVICE_IDLE_CONSTANTS_WATCH = "device_idle_constants_watch";
/**
+ * Battery Saver specific settings
+ * This is encoded as a key=value list, separated by commas. Ex:
+ *
+ * "vibration_disabled=true,adjust_brightness_factor=0.5"
+ *
+ * The following keys are supported:
+ *
+ * <pre>
+ * vibration_disabled (boolean)
+ * animation_disabled (boolean)
+ * soundtrigger_disabled (boolean)
+ * fullbackup_deferred (boolean)
+ * keyvaluebackup_deferred (boolean)
+ * firewall_disabled (boolean)
+ * gps_mode (int)
+ * adjust_brightness_disabled (boolean)
+ * adjust_brightness_factor (float)
+ * </pre>
+ * @hide
+ * @see com.android.server.power.BatterySaverPolicy
+ */
+ public static final String BATTERY_SAVER_CONSTANTS = "battery_saver_constants";
+
+ /**
* App standby (app idle) specific settings.
* This is encoded as a key=value list, separated by commas. Ex:
*
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 9a64507fc7ca..696d4981285b 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -158,6 +158,7 @@ public class SettingsBackupTest {
Settings.Global.DEVICE_DEMO_MODE,
Settings.Global.DEVICE_IDLE_CONSTANTS,
Settings.Global.DEVICE_IDLE_CONSTANTS_WATCH,
+ Settings.Global.BATTERY_SAVER_CONSTANTS,
Settings.Global.DEVICE_NAME,
Settings.Global.DEVICE_PROVISIONED,
Settings.Global.DEVICE_PROVISIONING_MOBILE_DATA_ENABLED,
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index c26032ce1cf5..8f2b428afed2 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -80,6 +80,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
import android.database.ContentObserver;
import android.net.Uri;
+import android.os.PowerSaveState;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -122,6 +123,7 @@ import com.android.server.SystemConfig;
import com.android.server.SystemService;
import com.android.server.backup.PackageManagerBackupAgent.Metadata;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
import libcore.io.IoUtils;
import java.io.BufferedInputStream;
@@ -5440,7 +5442,9 @@ public class BackupManagerService {
// Don't run the backup if we're in battery saver mode, but reschedule
// to try again in the not-so-distant future.
- if (mPowerManager.isPowerSaveMode()) {
+ final PowerSaveState result =
+ mPowerManager.getPowerSaveState(ServiceType.FULL_BACKUP);
+ if (result.batterySaverEnabled) {
if (DEBUG) Slog.i(TAG, "Deferring scheduled full backups in battery saver mode");
FullBackupJob.schedule(mContext, KeyValueBackupJob.BATCH_INTERVAL);
return false;
@@ -9889,7 +9893,9 @@ if (MORE_DEBUG) Slog.v(TAG, " + got " + nRead + "; now wanting " + (size - soF
public void backupNow() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "backupNow");
- if (mPowerManager.isPowerSaveMode()) {
+ final PowerSaveState result =
+ mPowerManager.getPowerSaveState(ServiceType.KEYVALUE_BACKUP);
+ if (result.batterySaverEnabled) {
if (DEBUG) Slog.v(TAG, "Not running backup while in battery save mode");
KeyValueBackupJob.schedule(mContext); // try again in several hours
} else {
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 888832515277..5fe6952fbc66 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -25,6 +25,7 @@ import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.hardware.input.InputManager;
import android.media.AudioManager;
+import android.os.PowerSaveState;
import android.os.BatteryStats;
import android.os.Handler;
import android.os.IVibratorService;
@@ -50,6 +51,7 @@ import android.media.AudioAttributes;
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -233,10 +235,15 @@ public class VibratorService extends IVibratorService.Stub
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
mPowerManagerInternal.registerLowPowerModeObserver(
new PowerManagerInternal.LowPowerModeListener() {
- @Override
- public void onLowPowerModeChanged(boolean enabled) {
- updateInputDeviceVibrators();
- }
+ @Override
+ public int getServiceType() {
+ return ServiceType.VIBRATION;
+ }
+
+ @Override
+ public void onLowPowerModeChanged(PowerSaveState result) {
+ updateInputDeviceVibrators();
+ }
});
mContext.getContentResolver().registerContentObserver(
@@ -553,7 +560,8 @@ public class VibratorService extends IVibratorService.Stub
} catch (SettingNotFoundException snfe) {
}
- mLowPowerMode = mPowerManagerInternal.getLowPowerModeEnabled();
+ mLowPowerMode = mPowerManagerInternal
+ .getLowPowerState(ServiceType.VIBRATION).batterySaverEnabled;
if (mVibrateInputDevicesSetting) {
if (!mInputDeviceListenerRegistered) {
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 35713025a2f5..1712d4887856 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -24,6 +24,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.wifi.IWifiManager;
import android.net.wifi.WifiActivityEnergyInfo;
+import android.os.PowerSaveState;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Handler;
@@ -60,6 +61,7 @@ import com.android.internal.os.BatteryStatsImpl;
import com.android.internal.os.PowerProfile;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
import java.io.File;
import java.io.FileDescriptor;
@@ -232,7 +234,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
public void initPowerManagement() {
final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
powerMgr.registerLowPowerModeObserver(this);
- mStats.notePowerSaveMode(powerMgr.getLowPowerModeEnabled());
+ mStats.notePowerSaveMode(
+ powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
+ .batterySaverEnabled);
(new WakeupReasonThread()).start();
}
@@ -258,9 +262,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
@Override
- public void onLowPowerModeChanged(boolean enabled) {
+ public int getServiceType() {
+ return ServiceType.BATTERY_STATS;
+ }
+
+ @Override
+ public void onLowPowerModeChanged(PowerSaveState result) {
synchronized (mStats) {
- mStats.notePowerSaveMode(enabled);
+ mStats.notePowerSaveMode(result.batterySaverEnabled);
}
}
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index fdaba0bb4c1f..3a1ddd789f13 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -16,13 +16,6 @@
package com.android.server.location;
-import com.android.internal.app.IAppOpsService;
-import com.android.internal.app.IBatteryStats;
-import com.android.internal.location.GpsNetInitiatedHandler;
-import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification;
-import com.android.internal.location.ProviderProperties;
-import com.android.internal.location.ProviderRequest;
-
import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.app.PendingIntent;
@@ -55,6 +48,7 @@ import android.net.NetworkInfo;
import android.net.NetworkRequest;
import android.net.Uri;
import android.os.AsyncTask;
+import android.os.PowerSaveState;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Bundle;
@@ -81,6 +75,17 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.NtpTrustedTime;
+import com.android.internal.app.IAppOpsService;
+import com.android.internal.app.IBatteryStats;
+import com.android.internal.location.GpsNetInitiatedHandler;
+import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification;
+import com.android.internal.location.ProviderProperties;
+import com.android.internal.location.ProviderRequest;
+import com.android.server.power.BatterySaverPolicy;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
+
+import libcore.io.IoUtils;
+
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
@@ -96,7 +101,6 @@ import java.util.Map.Entry;
import java.util.Properties;
import java.util.Map;
import java.util.HashMap;
-import libcore.io.IoUtils;
/**
* A GNSS implementation of LocationProvider used by LocationManager.
@@ -243,14 +247,6 @@ public class GnssLocationProvider implements LocationProviderInterface {
private static final int TCP_MIN_PORT = 0;
private static final int TCP_MAX_PORT = 0xffff;
- // Value of batterySaverGpsMode such that GPS isn't affected by battery saver mode.
- private static final int BATTERY_SAVER_MODE_NO_CHANGE = 0;
- // Value of batterySaverGpsMode such that GPS is disabled when battery saver mode
- // is enabled and the screen is off.
- private static final int BATTERY_SAVER_MODE_DISABLED_WHEN_SCREEN_OFF = 1;
- // Secure setting for GPS behavior when battery saver mode is on.
- private static final String BATTERY_SAVER_GPS_MODE = "batterySaverGpsMode";
-
/** simpler wrapper for ProviderRequest + Worksource */
private static class GpsRequest {
public ProviderRequest request;
@@ -548,11 +544,12 @@ public class GnssLocationProvider implements LocationProviderInterface {
private void updateLowPowerMode() {
// Disable GPS if we are in device idle mode.
boolean disableGps = mPowerManager.isDeviceIdleMode();
- switch (Settings.Secure.getInt(mContext.getContentResolver(), BATTERY_SAVER_GPS_MODE,
- BATTERY_SAVER_MODE_DISABLED_WHEN_SCREEN_OFF)) {
- case BATTERY_SAVER_MODE_DISABLED_WHEN_SCREEN_OFF:
+ final PowerSaveState result =
+ mPowerManager.getPowerSaveState(ServiceType.GPS);
+ switch (result.gpsMode) {
+ case BatterySaverPolicy.GPS_MODE_DISABLED_WHEN_SCREEN_OFF:
// If we are in battery saver mode and the screen is off, disable GPS.
- disableGps |= mPowerManager.isPowerSaveMode() && !mPowerManager.isInteractive();
+ disableGps |= result.batterySaverEnabled && !mPowerManager.isInteractive();
break;
}
if (disableGps != mDisableGps) {
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 507899836ee2..4e9d838e7c45 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -131,6 +131,7 @@ import android.net.NetworkTemplate;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.os.PowerSaveState;
import android.os.Binder;
import android.os.Environment;
import android.os.Handler;
@@ -180,6 +181,7 @@ import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.SystemConfig;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
import libcore.io.IoUtils;
import com.google.android.collect.Lists;
@@ -590,18 +592,26 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
mPowerManagerInternal.registerLowPowerModeObserver(
new PowerManagerInternal.LowPowerModeListener() {
- @Override
- public void onLowPowerModeChanged(boolean enabled) {
- if (LOGD) Slog.d(TAG, "onLowPowerModeChanged(" + enabled + ")");
- synchronized (mUidRulesFirstLock) {
- if (mRestrictPower != enabled) {
- mRestrictPower = enabled;
- updateRulesForRestrictPowerUL();
+ @Override
+ public int getServiceType() {
+ return ServiceType.NETWORK_FIREWALL;
+ }
+
+ @Override
+ public void onLowPowerModeChanged(PowerSaveState result) {
+ final boolean enabled = result.batterySaverEnabled;
+ if (LOGD) Slog.d(TAG,
+ "onLowPowerModeChanged(" + enabled + ")");
+ synchronized (mUidRulesFirstLock) {
+ if (mRestrictPower != enabled) {
+ mRestrictPower = enabled;
+ updateRulesForRestrictPowerUL();
+ }
+ }
}
- }
- }
});
- mRestrictPower = mPowerManagerInternal.getLowPowerModeEnabled();
+ mRestrictPower = mPowerManagerInternal.getLowPowerState(
+ ServiceType.NETWORK_FIREWALL).batterySaverEnabled;
mSystemReady = true;
diff --git a/services/core/java/com/android/server/power/BatterySaverPolicy.java b/services/core/java/com/android/server/power/BatterySaverPolicy.java
new file mode 100644
index 000000000000..8d20531a6a17
--- /dev/null
+++ b/services/core/java/com/android/server/power/BatterySaverPolicy.java
@@ -0,0 +1,270 @@
+/*
+ * Copyright (C) 2017 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.server.power;
+
+import android.annotation.IntDef;
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.KeyValueListParser;
+import android.util.Slog;
+import android.os.PowerSaveState;
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Class to decide whether to turn on battery saver mode for specific service
+ */
+public class BatterySaverPolicy extends ContentObserver {
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({ServiceType.GPS,
+ ServiceType.VIBRATION,
+ ServiceType.ANIMATION,
+ ServiceType.FULL_BACKUP,
+ ServiceType.KEYVALUE_BACKUP,
+ ServiceType.NETWORK_FIREWALL,
+ ServiceType.SCREEN_BRIGHTNESS,
+ ServiceType.SOUND,
+ ServiceType.BATTERY_STATS})
+ public @interface ServiceType {
+ int NULL = 0;
+ int GPS = 1;
+ int VIBRATION = 2;
+ int ANIMATION = 3;
+ int FULL_BACKUP = 4;
+ int KEYVALUE_BACKUP = 5;
+ int NETWORK_FIREWALL = 6;
+ int SCREEN_BRIGHTNESS = 7;
+ int SOUND = 8;
+ int BATTERY_STATS = 9;
+ }
+
+ private static final String TAG = "BatterySaverPolicy";
+
+ // Value of batterySaverGpsMode such that GPS isn't affected by battery saver mode.
+ public static final int GPS_MODE_NO_CHANGE = 0;
+ // Value of batterySaverGpsMode such that GPS is disabled when battery saver mode
+ // is enabled and the screen is off.
+ public static final int GPS_MODE_DISABLED_WHEN_SCREEN_OFF = 1;
+ // Secure setting for GPS behavior when battery saver mode is on.
+ public static final String SECURE_KEY_GPS_MODE = "batterySaverGpsMode";
+
+ private static final String KEY_GPS_MODE = "gps_mode";
+ private static final String KEY_VIBRATION_DISABLED = "vibration_disabled";
+ private static final String KEY_ANIMATION_DISABLED = "animation_disabled";
+ private static final String KEY_SOUNDTRIGGER_DISABLED = "soundtrigger_disabled";
+ private static final String KEY_FIREWALL_DISABLED = "firewall_disabled";
+ private static final String KEY_ADJUST_BRIGHTNESS_DISABLED = "adjust_brightness_disabled";
+ private static final String KEY_ADJUST_BRIGHTNESS_FACTOR = "adjust_brightness_factor";
+ private static final String KEY_FULLBACKUP_DEFERRED = "fullbackup_deferred";
+ private static final String KEY_KEYVALUE_DEFERRED = "keyvaluebackup_deferred";
+
+ private final KeyValueListParser mParser = new KeyValueListParser(',');
+
+ /**
+ * {@code true} if vibration is disabled in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_VIBRATION_DISABLED
+ */
+ private boolean mVibrationDisabled;
+
+ /**
+ * {@code true} if animation is disabled in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_ANIMATION_DISABLED
+ */
+ private boolean mAnimationDisabled;
+
+ /**
+ * {@code true} if sound trigger is disabled in battery saver mode
+ * in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_SOUNDTRIGGER_DISABLED
+ */
+ private boolean mSoundTriggerDisabled;
+
+ /**
+ * {@code true} if full backup is deferred in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_FULLBACKUP_DEFERRED
+ */
+ private boolean mFullBackupDeferred;
+
+ /**
+ * {@code true} if key value backup is deferred in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_KEYVALUE_DEFERRED
+ */
+ private boolean mKeyValueBackupDeferred;
+
+ /**
+ * {@code true} if network policy firewall is disabled in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_FIREWALL_DISABLED
+ */
+ private boolean mFireWallDisabled;
+
+ /**
+ * {@code true} if adjust brightness is disabled in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_ADJUST_BRIGHTNESS_DISABLED
+ */
+ private boolean mAdjustBrightnessDisabled;
+
+ /**
+ * This is the flag to decide the gps mode in battery saver mode.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_GPS_MODE
+ */
+ private int mGpsMode;
+
+ /**
+ * This is the flag to decide the how much to adjust the screen brightness. This is
+ * the float value from 0 to 1 where 1 means don't change brightness.
+ *
+ * @see Settings.Global#BATTERY_SAVER_CONSTANTS
+ * @see #KEY_ADJUST_BRIGHTNESS_FACTOR
+ */
+ private float mAdjustBrightnessFactor;
+
+ private ContentResolver mContentResolver;
+
+ public BatterySaverPolicy(Handler handler) {
+ super(handler);
+ }
+
+ public void start(ContentResolver contentResolver) {
+ mContentResolver = contentResolver;
+
+ mContentResolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.BATTERY_SAVER_CONSTANTS), false, this);
+ onChange(true, null);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ final String value = Settings.Global.getString(mContentResolver,
+ Settings.Global.BATTERY_SAVER_CONSTANTS);
+ updateConstants(value);
+ }
+
+ @VisibleForTesting
+ void updateConstants(final String value) {
+ synchronized (BatterySaverPolicy.this) {
+ try {
+ mParser.setString(value);
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, "Bad battery saver constants");
+ }
+
+ mVibrationDisabled = mParser.getBoolean(KEY_VIBRATION_DISABLED, true);
+ mAnimationDisabled = mParser.getBoolean(KEY_ANIMATION_DISABLED, true);
+ mSoundTriggerDisabled = mParser.getBoolean(KEY_SOUNDTRIGGER_DISABLED, true);
+ mFullBackupDeferred = mParser.getBoolean(KEY_FULLBACKUP_DEFERRED, true);
+ mKeyValueBackupDeferred = mParser.getBoolean(KEY_KEYVALUE_DEFERRED, true);
+ mFireWallDisabled = mParser.getBoolean(KEY_FIREWALL_DISABLED, false);
+ mAdjustBrightnessDisabled = mParser.getBoolean(KEY_ADJUST_BRIGHTNESS_DISABLED, false);
+ mAdjustBrightnessFactor = mParser.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR, 0.5f);
+
+ // Get default value from Settings.Secure
+ final int defaultGpsMode = Settings.Secure.getInt(mContentResolver, SECURE_KEY_GPS_MODE,
+ GPS_MODE_DISABLED_WHEN_SCREEN_OFF);
+ mGpsMode = mParser.getInt(KEY_GPS_MODE, defaultGpsMode);
+ }
+ }
+
+ /**
+ * Get the {@link PowerSaveState} based on {@paramref type} and {@paramref realMode}.
+ * The result will have {@link PowerSaveState#batterySaverEnabled} and some other
+ * parameters when necessary.
+ *
+ * @param type type of the service, one of {@link ServiceType}
+ * @param realMode whether the battery saver is on by default
+ * @return State data that contains battery saver data
+ */
+ public PowerSaveState getBatterySaverPolicy(@ServiceType int type, boolean realMode) {
+ synchronized (BatterySaverPolicy.this) {
+ final PowerSaveState.Builder builder = new PowerSaveState.Builder();
+ if (!realMode) {
+ return builder.setBatterySaverEnabled(realMode)
+ .build();
+ }
+ switch (type) {
+ case ServiceType.GPS:
+ return builder.setBatterySaverEnabled(realMode)
+ .setGpsMode(mGpsMode)
+ .build();
+ case ServiceType.ANIMATION:
+ return builder.setBatterySaverEnabled(mAnimationDisabled)
+ .build();
+ case ServiceType.FULL_BACKUP:
+ return builder.setBatterySaverEnabled(mFullBackupDeferred)
+ .build();
+ case ServiceType.KEYVALUE_BACKUP:
+ return builder.setBatterySaverEnabled(mKeyValueBackupDeferred)
+ .build();
+ case ServiceType.NETWORK_FIREWALL:
+ return builder.setBatterySaverEnabled(!mFireWallDisabled)
+ .build();
+ case ServiceType.SCREEN_BRIGHTNESS:
+ return builder.setBatterySaverEnabled(!mAdjustBrightnessDisabled)
+ .setBrightnessFactor(mAdjustBrightnessFactor)
+ .build();
+ case ServiceType.SOUND:
+ return builder.setBatterySaverEnabled(mSoundTriggerDisabled)
+ .build();
+ case ServiceType.VIBRATION:
+ return builder.setBatterySaverEnabled(mVibrationDisabled)
+ .build();
+ default:
+ return builder.setBatterySaverEnabled(realMode)
+ .build();
+ }
+ }
+ }
+
+ public void dump(PrintWriter pw) {
+ pw.println();
+ pw.println("Battery saver policy");
+ pw.println(" Settings " + Settings.Global.BATTERY_SAVER_CONSTANTS);
+ pw.println(" value: " + Settings.Global.getString(mContentResolver,
+ Settings.Global.BATTERY_SAVER_CONSTANTS));
+
+ pw.println();
+ pw.println(" " + KEY_VIBRATION_DISABLED + "=" + mVibrationDisabled);
+ pw.println(" " + KEY_ANIMATION_DISABLED + "=" + mAnimationDisabled);
+ pw.println(" " + KEY_FULLBACKUP_DEFERRED + "=" + mFullBackupDeferred);
+ pw.println(" " + KEY_KEYVALUE_DEFERRED + "=" + mKeyValueBackupDeferred);
+ pw.println(" " + KEY_FIREWALL_DISABLED + "=" + mFireWallDisabled);
+ pw.println(" " + KEY_ADJUST_BRIGHTNESS_DISABLED + "=" + mAdjustBrightnessDisabled);
+ pw.println(" " + KEY_ADJUST_BRIGHTNESS_FACTOR + "=" + mAdjustBrightnessFactor);
+ pw.println(" " + KEY_GPS_MODE + "=" + mGpsMode);
+
+ }
+}
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index d3931fba8283..cd63527b05ff 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -35,6 +35,7 @@ import android.hardware.power.V1_0.PowerHint;
import android.net.Uri;
import android.os.BatteryManager;
import android.os.BatteryManagerInternal;
+import android.os.PowerSaveState;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -80,7 +81,7 @@ import com.android.server.Watchdog;
import com.android.server.am.BatteryStatsService;
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
-
+import com.android.server.power.BatterySaverPolicy.ServiceType;
import libcore.util.Objects;
import java.io.FileDescriptor;
@@ -192,6 +193,7 @@ public final class PowerManagerService extends SystemService
private final Context mContext;
private final ServiceThread mHandlerThread;
private final PowerManagerHandler mHandler;
+ private final BatterySaverPolicy mBatterySaverPolicy;
private LightsManager mLightsManager;
private BatteryManagerInternal mBatteryManagerInternal;
@@ -605,6 +607,7 @@ public final class PowerManagerService extends SystemService
mHandlerThread.start();
mHandler = new PowerManagerHandler(mHandlerThread.getLooper());
mConstants = new Constants(mHandler);
+ mBatterySaverPolicy = new BatterySaverPolicy(mHandler);
synchronized (mLock) {
mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
@@ -704,6 +707,7 @@ public final class PowerManagerService extends SystemService
final ContentResolver resolver = mContext.getContentResolver();
mConstants.start(resolver);
+ mBatterySaverPolicy.start(resolver);
// Register for settings changes.
resolver.registerContentObserver(Settings.Secure.getUriFor(
@@ -939,8 +943,12 @@ public final class PowerManagerService extends SystemService
listeners = new ArrayList<PowerManagerInternal.LowPowerModeListener>(
mLowPowerModeListeners);
}
- for (int i=0; i<listeners.size(); i++) {
- listeners.get(i).onLowPowerModeChanged(lowPowerModeEnabled);
+ for (int i = 0; i < listeners.size(); i++) {
+ final PowerManagerInternal.LowPowerModeListener listener = listeners.get(i);
+ final PowerSaveState result =
+ mBatterySaverPolicy.getBatterySaverPolicy(
+ listener.getServiceType(), lowPowerModeEnabled);
+ listener.onLowPowerModeChanged(result);
}
intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
@@ -3245,6 +3253,8 @@ public final class PowerManagerService extends SystemService
pw.println();
pw.println("Display Power: " + mDisplayPowerCallbacks);
+ mBatterySaverPolicy.dump(pw);
+
wcd = mWirelessChargerDetector;
}
@@ -4201,6 +4211,19 @@ public final class PowerManagerService extends SystemService
}
}
+ // Binder call
+ public PowerSaveState getPowerSaveState(@ServiceType int serviceType) {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ return mBatterySaverPolicy.getBatterySaverPolicy(
+ serviceType, isLowPowerModeInternal());
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
@Override // Binder call
public boolean setPowerSaveMode(boolean mode) {
mContext.enforceCallingOrSelfPermission(
@@ -4519,9 +4542,9 @@ public final class PowerManagerService extends SystemService
}
@Override
- public boolean getLowPowerModeEnabled() {
+ public PowerSaveState getLowPowerState(@ServiceType int serviceType) {
synchronized (mLock) {
- return mLowPowerModeEnabled;
+ return mBatterySaverPolicy.getBatterySaverPolicy(serviceType, mLowPowerModeEnabled);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index eb3a2d15a855..4a7b8d4d165e 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -129,6 +129,7 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.input.InputManager;
import android.net.Uri;
+import android.os.PowerSaveState;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -219,6 +220,7 @@ import com.android.server.LocalServices;
import com.android.server.UiThread;
import com.android.server.Watchdog;
import com.android.server.input.InputManagerService;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
import com.android.server.power.ShutdownThread;
import java.io.BufferedWriter;
@@ -1009,15 +1011,26 @@ public class WindowManagerService extends IWindowManager.Stub
mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
if (mPowerManagerInternal != null) {
- mPowerManagerInternal.registerLowPowerModeObserver((enabled) -> {
- synchronized (mWindowMap) {
- if (mAnimationsDisabled != enabled && !mAllowAnimationsInLowPowerMode) {
- mAnimationsDisabled = enabled;
- dispatchNewAnimatorScaleLocked(null);
+ mPowerManagerInternal.registerLowPowerModeObserver(
+ new PowerManagerInternal.LowPowerModeListener() {
+ @Override
+ public int getServiceType() {
+ return ServiceType.ANIMATION;
+ }
+
+ @Override
+ public void onLowPowerModeChanged(PowerSaveState result) {
+ synchronized (mWindowMap) {
+ final boolean enabled = result.batterySaverEnabled;
+ if (mAnimationsDisabled != enabled && !mAllowAnimationsInLowPowerMode) {
+ mAnimationsDisabled = enabled;
+ dispatchNewAnimatorScaleLocked(null);
+ }
}
}
});
- mAnimationsDisabled = mPowerManagerInternal.getLowPowerModeEnabled();
+ mAnimationsDisabled = mPowerManagerInternal
+ .getLowPowerState(ServiceType.ANIMATION).batterySaverEnabled;
}
mScreenFrozenLock = mPowerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN");
diff --git a/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java b/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java
new file mode 100644
index 000000000000..7282b3ea9d85
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2017 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.server.power;
+
+import android.os.PowerSaveState;
+import android.os.Handler;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import static com.google.common.truth.Truth.assertThat;
+
+/**
+ * Tests for {@link com.android.server.power.BatterySaverPolicy}
+ */
+public class BatterySaverPolicyTest extends AndroidTestCase {
+ private static final boolean BATTERY_SAVER_ON = true;
+ private static final boolean BATTERY_SAVER_OFF = false;
+ private static final float BRIGHTNESS_FACTOR = 0.7f;
+ private static final float DEFAULT_BRIGHTNESS_FACTOR = 0.5f;
+ private static final float PRECISION = 0.001f;
+ private static final int GPS_MODE = 0;
+ private static final int DEFAULT_GPS_MODE = 1;
+ private static final String BATTERY_SAVER_CONSTANTS = "vibration_disabled=true,"
+ + "animation_disabled=false,"
+ + "soundtrigger_disabled=true,"
+ + "firewall_disabled=false,"
+ + "adjust_brightness_disabled=true,"
+ + "adjust_brightness_factor=0.7,"
+ + "fullbackup_deferred=true,"
+ + "keyvaluebackup_deferred=false,"
+ + "gps_mode=0";
+ private static final String BATTERY_SAVER_INCORRECT_CONSTANTS = "vi*,!=,,true";
+
+ @Mock
+ Handler mHandler;
+ private BatterySaverPolicy mBatterySaverPolicy;
+
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ mBatterySaverPolicy = new BatterySaverPolicy(mHandler);
+ mBatterySaverPolicy.start(getContext().getContentResolver());
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyNull_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.NULL);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyVibration_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.VIBRATION);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicySound_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.SOUND);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyFullBackup_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.FULL_BACKUP);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyKeyValueBackup_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.KEYVALUE_BACKUP);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyAnimation_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.ANIMATION);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyBatteryStats_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.BATTERY_STATS);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyNetworkFirewall_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.NETWORK_FIREWALL);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyScreenBrightness_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.SCREEN_BRIGHTNESS);
+
+ PowerSaveState stateOn =
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS, true);
+ assertThat(stateOn.brightnessFactor).isWithin(PRECISION).of(DEFAULT_BRIGHTNESS_FACTOR);
+ }
+
+ @SmallTest
+ public void testGetBatterySaverPolicy_PolicyGps_DefaultValueCorrect() {
+ testServiceDefaultValue(ServiceType.GPS);
+
+ PowerSaveState stateOn =
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS, true);
+ assertThat(stateOn.gpsMode).isEqualTo(DEFAULT_GPS_MODE);
+ }
+
+ @SmallTest
+ public void testUpdateConstants_getCorrectData() {
+ mBatterySaverPolicy.updateConstants(BATTERY_SAVER_CONSTANTS);
+
+ final PowerSaveState vibrationState =
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.VIBRATION, BATTERY_SAVER_ON);
+ assertThat(vibrationState.batterySaverEnabled).isTrue();
+
+ final PowerSaveState animationState =
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.ANIMATION, BATTERY_SAVER_ON);
+ assertThat(animationState.batterySaverEnabled).isFalse();
+
+ final PowerSaveState soundState =
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SOUND, BATTERY_SAVER_ON);
+ assertThat(soundState.batterySaverEnabled).isTrue();
+
+ final PowerSaveState networkState = mBatterySaverPolicy.getBatterySaverPolicy(
+ ServiceType.NETWORK_FIREWALL, BATTERY_SAVER_ON);
+ assertThat(networkState.batterySaverEnabled).isTrue();
+
+ final PowerSaveState screenState =
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS, BATTERY_SAVER_ON);
+ assertThat(screenState.batterySaverEnabled).isFalse();
+ assertThat(screenState.brightnessFactor).isWithin(PRECISION).of(BRIGHTNESS_FACTOR);
+
+ final PowerSaveState fullBackupState = mBatterySaverPolicy.getBatterySaverPolicy(
+ ServiceType.FULL_BACKUP, BATTERY_SAVER_ON);
+ assertThat(fullBackupState.batterySaverEnabled).isTrue();
+
+ final PowerSaveState keyValueBackupState = mBatterySaverPolicy.getBatterySaverPolicy(
+ ServiceType.KEYVALUE_BACKUP, BATTERY_SAVER_ON);
+ assertThat(keyValueBackupState.batterySaverEnabled).isFalse();
+
+ final PowerSaveState gpsState =
+ mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS, BATTERY_SAVER_ON);
+ assertThat(gpsState.batterySaverEnabled).isTrue();
+ assertThat(gpsState.gpsMode).isEqualTo(GPS_MODE);
+ }
+
+ @SmallTest
+ public void testUpdateConstants_IncorrectData_NotCrash() {
+ //Should not crash
+ mBatterySaverPolicy.updateConstants(BATTERY_SAVER_INCORRECT_CONSTANTS);
+ mBatterySaverPolicy.updateConstants(null);
+ }
+
+ private void testServiceDefaultValue(@ServiceType int type) {
+ mBatterySaverPolicy.updateConstants("");
+ final PowerSaveState batterySaverStateOn =
+ mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_ON);
+ assertThat(batterySaverStateOn.batterySaverEnabled).isTrue();
+
+ final PowerSaveState batterySaverStateOff =
+ mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_OFF);
+ assertThat(batterySaverStateOff.batterySaverEnabled).isFalse();
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index dd45d9bb7296..c8b73f1d6807 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -17,9 +17,13 @@
package com.android.server.wm;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doAnswer;
+
+import android.os.PowerSaveState;
import org.mockito.invocation.InvocationOnMock;
import android.annotation.Nullable;
@@ -67,6 +71,10 @@ class TestWindowManagerPolicy implements WindowManagerPolicy {
if (LocalServices.getService(PowerManagerInternal.class) == null) {
LocalServices.addService(PowerManagerInternal.class,
mock(PowerManagerInternal.class));
+ final PowerManagerInternal pm =
+ LocalServices.getService(PowerManagerInternal.class);
+ PowerSaveState state = new PowerSaveState.Builder().build();
+ doReturn(state).when(pm).getLowPowerState(anyInt());
}
if (LocalServices.getService(ActivityManagerInternal.class) == null) {
LocalServices.addService(ActivityManagerInternal.class,
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
index e89585ca52fd..ca3763127f4d 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
@@ -16,8 +16,6 @@
package com.android.server.soundtrigger;
-import static android.hardware.soundtrigger.SoundTrigger.STATUS_ERROR;
-
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -42,6 +40,7 @@ import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Slog;
import com.android.internal.logging.MetricsLogger;
+import com.android.server.power.BatterySaverPolicy.ServiceType;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -841,7 +840,8 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
if (!PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(intent.getAction())) {
return;
}
- boolean active = mPowerManager.isPowerSaveMode();
+ boolean active = mPowerManager.getPowerSaveState(ServiceType.SOUND)
+ .batterySaverEnabled;
if (DBG) Slog.d(TAG, "onPowerSaveModeChanged: " + active);
synchronized (mLock) {
onPowerSaveModeChangedLocked(active);
@@ -874,7 +874,8 @@ public class SoundTriggerHelper implements SoundTrigger.StatusListener {
mContext.registerReceiver(mPowerSaveModeListener,
new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
}
- mIsPowerSaveMode = mPowerManager.isPowerSaveMode();
+ mIsPowerSaveMode = mPowerManager.getPowerSaveState(ServiceType.SOUND)
+ .batterySaverEnabled;
}
// Sends an error callback to all models with a valid registered callback.
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
index 9f73d79ff142..339019d2ab16 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgePowerManager.java
@@ -18,6 +18,7 @@ package com.android.layoutlib.bridge.android;
import android.os.IBinder;
import android.os.IPowerManager;
+import android.os.PowerSaveState;
import android.os.RemoteException;
import android.os.WorkSource;
@@ -42,6 +43,10 @@ public class BridgePowerManager implements IPowerManager {
return false;
}
+ public PowerSaveState getPowerSaveState(int serviceType) {
+ return null;
+ }
+
@Override
public IBinder asBinder() {
// pass for now.