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