diff options
12 files changed, 240 insertions, 16 deletions
diff --git a/api/current.txt b/api/current.txt index 4d5ccdeedd63..b400b34170de 100644 --- a/api/current.txt +++ b/api/current.txt @@ -43235,7 +43235,6 @@ package android.util { method public E get(long, E); method public int indexOfKey(long); method public int indexOfValue(E); - method public int indexOfValueByValue(E); method public long keyAt(int); method public void put(long, E); method public void remove(long); @@ -43438,7 +43437,6 @@ package android.util { method public E get(int, E); method public int indexOfKey(int); method public int indexOfValue(E); - method public int indexOfValueByValue(E); method public int keyAt(int); method public void put(int, E); method public void remove(int); diff --git a/api/system-current.txt b/api/system-current.txt index ddb36a8f8710..844b897e4507 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -46690,7 +46690,6 @@ package android.util { method public E get(long, E); method public int indexOfKey(long); method public int indexOfValue(E); - method public int indexOfValueByValue(E); method public long keyAt(int); method public void put(long, E); method public void remove(long); @@ -46893,7 +46892,6 @@ package android.util { method public E get(int, E); method public int indexOfKey(int); method public int indexOfValue(E); - method public int indexOfValueByValue(E); method public int keyAt(int); method public void put(int, E); method public void remove(int); diff --git a/api/test-current.txt b/api/test-current.txt index 9457bd6ca65d..a73ac18ac0c7 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -43441,7 +43441,6 @@ package android.util { method public E get(long, E); method public int indexOfKey(long); method public int indexOfValue(E); - method public int indexOfValueByValue(E); method public long keyAt(int); method public void put(long, E); method public void remove(long); @@ -43644,7 +43643,6 @@ package android.util { method public E get(int, E); method public int indexOfKey(int); method public int indexOfValue(E); - method public int indexOfValueByValue(E); method public int keyAt(int); method public void put(int, E); method public void remove(int); diff --git a/core/java/android/os/PowerSaveState.java b/core/java/android/os/PowerSaveState.java index 9269e762ef4c..7058a1dca34d 100644 --- a/core/java/android/os/PowerSaveState.java +++ b/core/java/android/os/PowerSaveState.java @@ -24,7 +24,17 @@ package android.os; * @hide */ public class PowerSaveState implements Parcelable { + /** + * Whether we should enable battery saver for this service. + * + * @see com.android.server.power.BatterySaverPolicy.ServiceType + */ public final boolean batterySaverEnabled; + /** + * Whether the battery saver is enabled globally, which means the data we get from + * {@link PowerManager#isPowerSaveMode()} + */ + public final boolean globalBatterySaverEnabled; public final int gpsMode; public final float brightnessFactor; @@ -32,10 +42,12 @@ public class PowerSaveState implements Parcelable { batterySaverEnabled = builder.mBatterySaverEnabled; gpsMode = builder.mGpsMode; brightnessFactor = builder.mBrightnessFactor; + globalBatterySaverEnabled = builder.mGlobalBatterySaverEnabled; } public PowerSaveState(Parcel in) { batterySaverEnabled = in.readByte() != 0; + globalBatterySaverEnabled = in.readByte() != 0; gpsMode = in.readInt(); brightnessFactor = in.readFloat(); } @@ -48,12 +60,14 @@ public class PowerSaveState implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeByte((byte) (batterySaverEnabled ? 1 : 0)); + dest.writeByte((byte) (globalBatterySaverEnabled ? 1 : 0)); dest.writeInt(gpsMode); dest.writeFloat(brightnessFactor); } public static final class Builder { private boolean mBatterySaverEnabled = false; + private boolean mGlobalBatterySaverEnabled = false; private int mGpsMode = 0; private float mBrightnessFactor = 0.5f; @@ -64,6 +78,11 @@ public class PowerSaveState implements Parcelable { return this; } + public Builder setGlobalBatterySaverEnabled(boolean enabled) { + mGlobalBatterySaverEnabled = enabled; + return this; + } + public Builder setGpsMode(int mode) { mGpsMode = mode; return this; diff --git a/core/java/android/util/LongSparseArray.java b/core/java/android/util/LongSparseArray.java index 58ad2fd0c586..9ba0f5da135e 100644 --- a/core/java/android/util/LongSparseArray.java +++ b/core/java/android/util/LongSparseArray.java @@ -315,6 +315,7 @@ public class LongSparseArray<E> implements Cloneable { * and that multiple keys can map to the same value and this will * find only one of them. * <p>Note also that this method uses {@code equals} unlike {@code indexOfValue}. + * @hide */ public int indexOfValueByValue(E value) { if (mGarbage) { diff --git a/core/java/android/util/SparseArray.java b/core/java/android/util/SparseArray.java index c76666069d18..b3400ef538b8 100644 --- a/core/java/android/util/SparseArray.java +++ b/core/java/android/util/SparseArray.java @@ -363,6 +363,7 @@ public class SparseArray<E> implements Cloneable { * and that multiple keys can map to the same value and this will * find only one of them. * <p>Note also that this method uses {@code equals} unlike {@code indexOfValue}. + * @hide */ public int indexOfValueByValue(E value) { if (mGarbage) { diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index a84cee8dbce2..44494a644178 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -141,6 +141,11 @@ public class MediaRouter { mDefaultAudioVideo.mNameResId = com.android.internal.R.string.default_audio_route_name; mDefaultAudioVideo.mSupportedTypes = ROUTE_TYPE_LIVE_AUDIO | ROUTE_TYPE_LIVE_VIDEO; mDefaultAudioVideo.updatePresentationDisplay(); + if (((AudioManager) appContext.getSystemService(Context.AUDIO_SERVICE)) + .isVolumeFixed()) { + mDefaultAudioVideo.mVolumeHandling = RouteInfo.PLAYBACK_VOLUME_FIXED; + } + addRouteStatic(mDefaultAudioVideo); // This will select the active wifi display route if there is one. diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 8a4f3f76c0ab..fc45344b2f4d 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -322,6 +322,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private INotificationManager mNotifManager; private PowerManagerInternal mPowerManagerInternal; private IDeviceIdleController mDeviceIdleController; + @GuardedBy("mUidRulesFirstLock") + private PowerSaveState mRestrictBackgroundPowerState; + + // Store the status of restrict background before turning on battery saver. + // Used to restore mRestrictBackground when battery saver is turned off. + private boolean mRestrictBackgroundBeforeBsm; // See main javadoc for instructions on how to use these locks. final Object mUidRulesFirstLock = new Object(); @@ -332,6 +338,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @GuardedBy("mUidRulesFirstLock") volatile boolean mRestrictBackground; @GuardedBy("mUidRulesFirstLock") volatile boolean mRestrictPower; @GuardedBy("mUidRulesFirstLock") volatile boolean mDeviceIdleMode; + // Store whether user flipped restrict background in battery saver mode + @GuardedBy("mUidRulesFirstLock") volatile boolean mRestrictBackgroundChangedInBsm; private final boolean mSuppressDefaultPolicy; @@ -617,8 +625,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @Override public void onLowPowerModeChanged(PowerSaveState result) { final boolean enabled = result.batterySaverEnabled; - if (LOGD) Slog.d(TAG, - "onLowPowerModeChanged(" + enabled + ")"); + if (LOGD) { + Slog.d(TAG, "onLowPowerModeChanged(" + enabled + ")"); + } synchronized (mUidRulesFirstLock) { if (mRestrictPower != enabled) { mRestrictPower = enabled; @@ -626,7 +635,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } } - }); + }); mRestrictPower = mPowerManagerInternal.getLowPowerState( ServiceType.NETWORK_FIREWALL).batterySaverEnabled; @@ -635,6 +644,32 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // read policy from disk readPolicyAL(); + // Update the restrictBackground if battery saver is turned on + mRestrictBackgroundBeforeBsm = mRestrictBackground; + mRestrictBackgroundPowerState = mPowerManagerInternal + .getLowPowerState(ServiceType.DATA_SAVER); + final boolean localRestrictBackground = + mRestrictBackgroundPowerState.batterySaverEnabled; + if (localRestrictBackground && localRestrictBackground != mRestrictBackground) { + mRestrictBackground = localRestrictBackground; + mHandler.obtainMessage(MSG_RESTRICT_BACKGROUND_CHANGED, + mRestrictBackground ? 1 : 0, 0).sendToTarget(); + } + mPowerManagerInternal.registerLowPowerModeObserver( + new PowerManagerInternal.LowPowerModeListener() { + @Override + public int getServiceType() { + return ServiceType.DATA_SAVER; + } + + @Override + public void onLowPowerModeChanged(PowerSaveState result) { + synchronized (mUidRulesFirstLock) { + updateRestrictBackgroundByLowPowerModeUL(result); + } + } + }); + if (addDefaultRestrictBackgroundWhitelistUidsUL()) { writePolicyAL(); } @@ -2159,6 +2194,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } catch (RemoteException e) { // ignored; service lives in system_server } + + if (mRestrictBackgroundPowerState.globalBatterySaverEnabled) { + mRestrictBackgroundChangedInBsm = true; + } synchronized (mNetworkPoliciesSecondLock) { updateNotificationsNL(); writePolicyAL(); @@ -3645,6 +3684,35 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mHandler.getLooper().getQueue().addIdleHandler(handler); } + @VisibleForTesting + public void updateRestrictBackgroundByLowPowerModeUL(final PowerSaveState result) { + mRestrictBackgroundPowerState = result; + + boolean restrictBackground = result.batterySaverEnabled; + boolean shouldInvokeRestrictBackground; + // store the temporary mRestrictBackgroundChangedInBsm and update it at last + boolean localRestrictBgChangedInBsm = mRestrictBackgroundChangedInBsm; + + if (result.globalBatterySaverEnabled) { + // Try to turn on restrictBackground if (1) it is off and (2) batter saver need to + // turn it on. + shouldInvokeRestrictBackground = !mRestrictBackground && result.batterySaverEnabled; + mRestrictBackgroundBeforeBsm = mRestrictBackground; + localRestrictBgChangedInBsm = false; + } else { + // Try to restore the restrictBackground if it doesn't change in bsm + shouldInvokeRestrictBackground = !mRestrictBackgroundChangedInBsm; + restrictBackground = mRestrictBackgroundBeforeBsm; + } + + if (shouldInvokeRestrictBackground) { + setRestrictBackground(restrictBackground); + } + + // Change it at last so setRestrictBackground() won't affect this variable + mRestrictBackgroundChangedInBsm = localRestrictBgChangedInBsm; + } + private static void collectKeys(SparseIntArray source, SparseBooleanArray target) { final int size = source.size(); for (int i = 0; i < size; i++) { diff --git a/services/core/java/com/android/server/power/BatterySaverPolicy.java b/services/core/java/com/android/server/power/BatterySaverPolicy.java index 8d20531a6a17..1781d8c657c3 100644 --- a/services/core/java/com/android/server/power/BatterySaverPolicy.java +++ b/services/core/java/com/android/server/power/BatterySaverPolicy.java @@ -43,7 +43,8 @@ public class BatterySaverPolicy extends ContentObserver { ServiceType.NETWORK_FIREWALL, ServiceType.SCREEN_BRIGHTNESS, ServiceType.SOUND, - ServiceType.BATTERY_STATS}) + ServiceType.BATTERY_STATS, + ServiceType.DATA_SAVER}) public @interface ServiceType { int NULL = 0; int GPS = 1; @@ -55,6 +56,7 @@ public class BatterySaverPolicy extends ContentObserver { int SCREEN_BRIGHTNESS = 7; int SOUND = 8; int BATTERY_STATS = 9; + int DATA_SAVER = 10; } private static final String TAG = "BatterySaverPolicy"; @@ -73,6 +75,7 @@ public class BatterySaverPolicy extends ContentObserver { 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_DATASAVER_DISABLED = "datasaver_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"; @@ -137,6 +140,14 @@ public class BatterySaverPolicy extends ContentObserver { private boolean mAdjustBrightnessDisabled; /** + * {@code true} if data saver is disabled in battery saver mode. + * + * @see Settings.Global#BATTERY_SAVER_CONSTANTS + * @see #KEY_DATASAVER_DISABLED + */ + private boolean mDataSaverDisabled; + + /** * This is the flag to decide the gps mode in battery saver mode. * * @see Settings.Global#BATTERY_SAVER_CONSTANTS @@ -191,6 +202,7 @@ public class BatterySaverPolicy extends ContentObserver { mFireWallDisabled = mParser.getBoolean(KEY_FIREWALL_DISABLED, false); mAdjustBrightnessDisabled = mParser.getBoolean(KEY_ADJUST_BRIGHTNESS_DISABLED, false); mAdjustBrightnessFactor = mParser.getFloat(KEY_ADJUST_BRIGHTNESS_FACTOR, 0.5f); + mDataSaverDisabled = mParser.getBoolean(KEY_DATASAVER_DISABLED, true); // Get default value from Settings.Secure final int defaultGpsMode = Settings.Secure.getInt(mContentResolver, SECURE_KEY_GPS_MODE, @@ -210,7 +222,8 @@ public class BatterySaverPolicy extends ContentObserver { */ public PowerSaveState getBatterySaverPolicy(@ServiceType int type, boolean realMode) { synchronized (BatterySaverPolicy.this) { - final PowerSaveState.Builder builder = new PowerSaveState.Builder(); + final PowerSaveState.Builder builder = new PowerSaveState.Builder() + .setGlobalBatterySaverEnabled(realMode); if (!realMode) { return builder.setBatterySaverEnabled(realMode) .build(); @@ -236,6 +249,9 @@ public class BatterySaverPolicy extends ContentObserver { return builder.setBatterySaverEnabled(!mAdjustBrightnessDisabled) .setBrightnessFactor(mAdjustBrightnessFactor) .build(); + case ServiceType.DATA_SAVER: + return builder.setBatterySaverEnabled(!mDataSaverDisabled) + .build(); case ServiceType.SOUND: return builder.setBatterySaverEnabled(mSoundTriggerDisabled) .build(); @@ -262,6 +278,7 @@ public class BatterySaverPolicy extends ContentObserver { pw.println(" " + KEY_FULLBACKUP_DEFERRED + "=" + mFullBackupDeferred); pw.println(" " + KEY_KEYVALUE_DEFERRED + "=" + mKeyValueBackupDeferred); pw.println(" " + KEY_FIREWALL_DISABLED + "=" + mFireWallDisabled); + pw.println(" " + KEY_DATASAVER_DISABLED + "=" + mDataSaverDisabled); 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/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index fc377973221b..85eae0212373 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -540,12 +540,14 @@ public class DockedStackDividerController implements DimLayerUser { checkMinimizeChanged(true /* animate */); // We were minimized, and now we are still minimized, but somebody is trying to launch an - // app in docked stack, better show recent apps so we actually get unminimized! This catches + // app in docked stack, better show recent apps so we actually get unminimized! However do + // not do this if keyguard is dismissed such as when the device is unlocking. This catches // any case that was missed in ActivityStarter.postStartActivityUncheckedProcessing because // we couldn't retrace the launch of the app in the docked stack to the launch from // homescreen. if (wasMinimized && mMinimizedDock && containsAppInDockedStack(openingApps) - && appTransition != TRANSIT_NONE) { + && appTransition != TRANSIT_NONE && + !AppTransition.isKeyguardGoingAwayTransit(appTransition)) { mService.showRecentApps(true /* fromHome */); } } @@ -579,6 +581,12 @@ public class DockedStackDividerController implements DimLayerUser { if (homeTask == null || !isWithinDisplay(homeTask)) { return; } + + // Do not minimize when dock is already minimized while keyguard is showing and not + // occluded such as unlocking the screen + if (mMinimizedDock && mService.mPolicy.isKeyguardShowingAndNotOccluded()) { + return; + } final TaskStack fullscreenStack = mDisplayContent.getStackById(FULLSCREEN_WORKSPACE_STACK_ID); final boolean homeVisible = homeTask.getTopVisibleAppToken() != null; diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index f8d105e5ac31..29c6f89e5fa0 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -37,6 +37,7 @@ import static com.android.server.net.NetworkPolicyManagerService.ProcStateSeqHis import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT; import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOOZED; import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING; +import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -51,10 +52,15 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isA; import static org.mockito.Matchers.isNull; +import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -89,6 +95,7 @@ import android.net.NetworkTemplate; import android.os.Binder; import android.os.INetworkManagementService; import android.os.PowerManagerInternal; +import android.os.PowerSaveState; import android.os.UserHandle; import android.support.test.InstrumentationRegistry; import android.support.test.filters.MediumTest; @@ -198,6 +205,7 @@ public class NetworkPolicyManagerServiceTest { private IUidObserver mUidObserver; private INetworkManagementEventObserver mNetworkObserver; + private PowerManagerInternal mPowerManagerInternal; private NetworkPolicyListenerAnswer mPolicyListener; private NetworkPolicyManagerService mService; @@ -227,12 +235,16 @@ public class NetworkPolicyManagerServiceTest { @BeforeClass public static void registerLocalServices() { - addLocalServiceMock(PowerManagerInternal.class); addLocalServiceMock(DeviceIdleController.LocalService.class); final UsageStatsManagerInternal usageStats = addLocalServiceMock(UsageStatsManagerInternal.class); when(usageStats.getIdleUidsForUser(anyInt())).thenReturn(new int[]{}); mActivityManagerInternal = addLocalServiceMock(ActivityManagerInternal.class); + + final PowerSaveState state = new PowerSaveState.Builder() + .setBatterySaverEnabled(false).build(); + final PowerManagerInternal pmInternal = addLocalServiceMock(PowerManagerInternal.class); + when(pmInternal.getLowPowerState(anyInt())).thenReturn(state); } @Before @@ -401,6 +413,85 @@ public class NetworkPolicyManagerServiceTest { removeRestrictBackgroundWhitelist(false); } + @Test + public void testLowPowerModeObserver_ListenersRegistered() + throws Exception { + PowerManagerInternal pmInternal = LocalServices.getService(PowerManagerInternal.class); + + verify(pmInternal, atLeast(2)).registerLowPowerModeObserver(any()); + } + + @Test + public void updateRestrictBackgroundByLowPowerMode_RestrictOnBeforeBsm_RestrictOnAfterBsm() + throws Exception { + setRestrictBackground(true); + PowerSaveState stateOn = new PowerSaveState.Builder() + .setGlobalBatterySaverEnabled(true) + .setBatterySaverEnabled(false) + .build(); + mService.updateRestrictBackgroundByLowPowerModeUL(stateOn); + + // RestrictBackground should be on even though battery saver want to turn it off + assertThat(mService.getRestrictBackground()).isTrue(); + + PowerSaveState stateOff = new PowerSaveState.Builder() + .setGlobalBatterySaverEnabled(false) + .setBatterySaverEnabled(false) + .build(); + mService.updateRestrictBackgroundByLowPowerModeUL(stateOff); + + // RestrictBackground should be on, following its previous state + assertThat(mService.getRestrictBackground()).isTrue(); + } + + @Test + public void updateRestrictBackgroundByLowPowerMode_RestrictOffBeforeBsm_RestrictOffAfterBsm() + throws Exception { + setRestrictBackground(false); + PowerSaveState stateOn = new PowerSaveState.Builder() + .setGlobalBatterySaverEnabled(true) + .setBatterySaverEnabled(true) + .build(); + + doReturn(true).when(mNetworkManager).setDataSaverModeEnabled(true); + mService.updateRestrictBackgroundByLowPowerModeUL(stateOn); + + // RestrictBackground should be turned on because of battery saver + assertThat(mService.getRestrictBackground()).isTrue(); + + PowerSaveState stateOff = new PowerSaveState.Builder() + .setGlobalBatterySaverEnabled(false) + .setBatterySaverEnabled(false) + .build(); + mService.updateRestrictBackgroundByLowPowerModeUL(stateOff); + + // RestrictBackground should be off, following its previous state + assertThat(mService.getRestrictBackground()).isFalse(); + } + + @Test + public void updateRestrictBackgroundByLowPowerMode_StatusChangedInBsm_DoNotRestore() + throws Exception { + setRestrictBackground(true); + PowerSaveState stateOn = new PowerSaveState.Builder() + .setGlobalBatterySaverEnabled(true) + .setBatterySaverEnabled(true) + .build(); + mService.updateRestrictBackgroundByLowPowerModeUL(stateOn); + + // RestrictBackground should still be on + assertThat(mService.getRestrictBackground()).isTrue(); + + // User turns off RestrictBackground manually + setRestrictBackground(false); + PowerSaveState stateOff = new PowerSaveState.Builder().setBatterySaverEnabled( + false).build(); + mService.updateRestrictBackgroundByLowPowerModeUL(stateOff); + + // RestrictBackground should be off because user changes it manually + assertThat(mService.getRestrictBackground()).isFalse(); + } + private void removeRestrictBackgroundWhitelist(boolean expectIntent) throws Exception { // Sanity checks. assertWhitelistUids(UID_A); @@ -1231,7 +1322,7 @@ public class NetworkPolicyManagerServiceTest { private void setRestrictBackground(boolean flag) throws Exception { // Must set expectation, otherwise NMPS will reset value to previous one. - when(mNetworkManager.setDataSaverModeEnabled(flag)).thenReturn(true); + doReturn(true).when(mNetworkManager).setDataSaverModeEnabled(flag); mService.setRestrictBackground(flag); // Sanity check. assertEquals("restrictBackground not set", flag, mService.getRestrictBackground()); diff --git a/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java b/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java index 7282b3ea9d85..69589e7d1f66 100644 --- a/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java +++ b/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java @@ -19,7 +19,9 @@ 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; @@ -40,6 +42,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase { + "animation_disabled=false," + "soundtrigger_disabled=true," + "firewall_disabled=false," + + "datasaver_disabled=false," + "adjust_brightness_disabled=true," + "adjust_brightness_factor=0.7," + "fullbackup_deferred=true," @@ -99,6 +102,18 @@ public class BatterySaverPolicyTest extends AndroidTestCase { } @SmallTest + public void testGetBatterySaverPolicy_PolicyDataSaver_DefaultValueCorrect() { + mBatterySaverPolicy.updateConstants(""); + final PowerSaveState batterySaverStateOn = + mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.DATA_SAVER, BATTERY_SAVER_ON); + assertThat(batterySaverStateOn.batterySaverEnabled).isFalse(); + + final PowerSaveState batterySaverStateOff = mBatterySaverPolicy.getBatterySaverPolicy( + ServiceType.DATA_SAVER, BATTERY_SAVER_OFF); + assertThat(batterySaverStateOff.batterySaverEnabled).isFalse(); + } + + @SmallTest public void testGetBatterySaverPolicy_PolicyScreenBrightness_DefaultValueCorrect() { testServiceDefaultValue(ServiceType.SCREEN_BRIGHTNESS); @@ -137,7 +152,8 @@ public class BatterySaverPolicyTest extends AndroidTestCase { assertThat(networkState.batterySaverEnabled).isTrue(); final PowerSaveState screenState = - mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS, BATTERY_SAVER_ON); + mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS, + BATTERY_SAVER_ON); assertThat(screenState.batterySaverEnabled).isFalse(); assertThat(screenState.brightnessFactor).isWithin(PRECISION).of(BRIGHTNESS_FACTOR); @@ -149,6 +165,10 @@ public class BatterySaverPolicyTest extends AndroidTestCase { ServiceType.KEYVALUE_BACKUP, BATTERY_SAVER_ON); assertThat(keyValueBackupState.batterySaverEnabled).isFalse(); + final PowerSaveState dataSaverState = mBatterySaverPolicy.getBatterySaverPolicy( + ServiceType.DATA_SAVER, BATTERY_SAVER_ON); + assertThat(dataSaverState.batterySaverEnabled).isTrue(); + final PowerSaveState gpsState = mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS, BATTERY_SAVER_ON); assertThat(gpsState.batterySaverEnabled).isTrue(); |