Rework battery saver synchronization logic
- Stop using individual lock instances and use use the power manager lock.
- Make sure not to access external components with the lock held,
*except for settings provider*, which is already touched by the power manager
and the battery service
(I'm planning to re-organize things for Q: b/79580230)
Fixes: 79486713
Test: atest /android/pi-dev/frameworks/base/services/tests/servicestests/src/com/android/server/power/batterysaver/Battery*Test.java /android/pi-dev/frameworks/base/services/tests/servicestests/src/com/android/server/power/*Test.java
Test: Manual test with ./development/scripts/battery_simulator.py with toggling
battery saver on and off and then watch
adb logcat -b all | grep -P '(battery_saving_stats|battery_saver_mode)'
Change-Id: I8ecdfefe978de348ee979d765c82e3d8f0280082
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 761c1f1..54ac6fc 100644
--- a/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/BatterySaverPolicyTest.java
@@ -15,10 +15,15 @@
*/
package com.android.server.power;
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.mock;
+
+import android.content.Context;
+import android.os.Handler;
import android.os.PowerManager;
import android.os.PowerManager.ServiceType;
import android.os.PowerSaveState;
-import android.os.Handler;
import android.provider.Settings.Global;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
@@ -26,12 +31,12 @@
import com.android.frameworks.servicestests.R;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.MetricsLogger;
+import com.android.server.power.batterysaver.BatterySavingStats;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import static com.google.common.truth.Truth.assertThat;
-
/**
* Tests for {@link com.android.server.power.BatterySaverPolicy}
*/
@@ -57,8 +62,9 @@
private static final String BATTERY_SAVER_INCORRECT_CONSTANTS = "vi*,!=,,true";
private class BatterySaverPolicyForTest extends BatterySaverPolicy {
- public BatterySaverPolicyForTest(Handler handler) {
- super(handler);
+ public BatterySaverPolicyForTest(Object lock, Context context,
+ BatterySavingStats batterySavingStats) {
+ super(lock, context, batterySavingStats);
}
@Override
@@ -71,11 +77,6 @@
return mDeviceSpecificConfigResId;
}
- @Override
- boolean isAccessibilityEnabled() {
- return mMockAccessibilityEnabled;
- }
-
@VisibleForTesting
void onChange() {
onChange(true, null);
@@ -84,20 +85,22 @@
@Mock
Handler mHandler;
+
+ @Mock
+ MetricsLogger mMetricsLogger = mock(MetricsLogger.class);
+
private BatterySaverPolicyForTest mBatterySaverPolicy;
private final ArrayMap<String, String> mMockGlobalSettings = new ArrayMap<>();
private int mDeviceSpecificConfigResId = R.string.config_batterySaverDeviceSpecificConfig_1;
- private boolean mMockAccessibilityEnabled;
-
public void setUp() throws Exception {
super.setUp();
MockitoAnnotations.initMocks(this);
- mBatterySaverPolicy = new BatterySaverPolicyForTest(mHandler);
- mBatterySaverPolicy.systemReady(getContext());
-
- mMockAccessibilityEnabled = false;
+ final Object lock = new Object();
+ mBatterySaverPolicy = new BatterySaverPolicyForTest(lock, getContext(),
+ new BatterySavingStats(lock, mMetricsLogger));
+ mBatterySaverPolicy.systemReady();
}
@SmallTest
@@ -112,7 +115,7 @@
@SmallTest
public void testGetBatterySaverPolicy_PolicyVibration_WithAccessibilityEnabled() {
- mMockAccessibilityEnabled = true;
+ mBatterySaverPolicy.setAccessibilityEnabledForTest(true);
testServiceDefaultValue_unchanged(ServiceType.VIBRATION);
}
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
index 62fe6b2..5b24725 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverStateMachineTest.java
@@ -125,7 +125,7 @@
*/
private class TestableBatterySaverStateMachine extends BatterySaverStateMachine {
public TestableBatterySaverStateMachine() {
- super(mMockContext, mMockBatterySaverController);
+ super(new Object(), mMockContext, mMockBatterySaverController);
}
@Override
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
index 0f3ca03..9bd4cc3 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySavingStatsTest.java
@@ -53,7 +53,7 @@
private int mBatteryLevel = 1_000_000_000;
private BatterySavingStatsTestable() {
- super(mMetricsLogger);
+ super(new Object(), mMetricsLogger);
}
@Override