From 99abb711054e42c9cfa03cb484349923a9e5e699 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Thu, 25 Jun 2020 16:12:31 -0400 Subject: [PATCH] Initialize values from sticy ACTION_BATTERY_CHANGED ACTION_BATTERY_CHANGED is sent as a sticky, so classes in SystemUI need to retrieve the last value as part of initialization. As there is no API to retrieve this, the only solution is get the last sticky for now. Test: atest KeyguardUpdateMonitorTest BatteryControllerTest Test: manual, restart and observe battery icon Fixes: 159679049 Change-Id: I9e4ea67a34f9166b863abc8f99b687e542128f8b --- .../android/keyguard/KeyguardUpdateMonitor.java | 14 +++++++++++++- .../src/com/android/systemui/power/PowerUI.java | 14 ++++++++++++++ .../statusbar/policy/BatteryControllerImpl.java | 13 ++++++++++++- .../keyguard/KeyguardUpdateMonitorTest.java | 7 +++++++ .../android/systemui/SysuiTestableContext.java | 16 ++++++++++++---- .../statusbar/policy/BatteryControllerTest.java | 5 +++++ 6 files changed, 63 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index ee31706c0b94a..7792afa3d84cd 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -251,7 +251,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab private boolean mDeviceProvisioned; // Battery status - private BatteryStatus mBatteryStatus; + @VisibleForTesting + BatteryStatus mBatteryStatus; private StrongAuthTracker mStrongAuthTracker; @@ -1698,6 +1699,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab .getServiceStateForSubscriber(subId); mHandler.sendMessage( mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); + + // Get initial state. Relying on Sticky behavior until API for getting info. + if (mBatteryStatus == null) { + Intent intent = mContext.registerReceiver( + null, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED) + ); + if (intent != null && mBatteryStatus == null) { + mBroadcastReceiver.onReceive(mContext, intent); + } + } }); mHandler.post(this::registerRingerTracker); diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java index 078c540939aa6..66804bef8f531 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java @@ -225,6 +225,8 @@ public class PowerUI extends SystemUI implements CommandQueue.Callbacks { @VisibleForTesting final class Receiver extends BroadcastReceiver { + private boolean mHasReceivedBattery = false; + public void init() { // Register for Intent broadcasts for... IntentFilter filter = new IntentFilter(); @@ -234,6 +236,17 @@ public class PowerUI extends SystemUI implements CommandQueue.Callbacks { filter.addAction(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_USER_SWITCHED); mBroadcastDispatcher.registerReceiverWithHandler(this, filter, mHandler); + // Force get initial values. Relying on Sticky behavior until API for getting info. + if (!mHasReceivedBattery) { + // Get initial state + Intent intent = mContext.registerReceiver( + null, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED) + ); + if (intent != null) { + onReceive(mContext, intent); + } + } } @Override @@ -246,6 +259,7 @@ public class PowerUI extends SystemUI implements CommandQueue.Callbacks { } }); } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { + mHasReceivedBattery = true; final int oldBatteryLevel = mBatteryLevel; mBatteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 100); final int oldBatteryStatus = mBatteryStatus; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index 00419e671814c..7f35161942987 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -74,7 +74,8 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC protected boolean mPowerSave; private boolean mAodPowerSave; private boolean mTestmode = false; - private boolean mHasReceivedBattery = false; + @VisibleForTesting + boolean mHasReceivedBattery = false; private Estimate mEstimate; private boolean mFetchingEstimate = false; @@ -102,6 +103,16 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC @Override public void init() { registerReceiver(); + if (!mHasReceivedBattery) { + // Get initial state. Relying on Sticky behavior until API for getting info. + Intent intent = mContext.registerReceiver( + null, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED) + ); + if (intent != null && !mHasReceivedBattery) { + onReceive(mContext, intent); + } + } updatePowerSave(); updateEstimate(); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 7bc453ac9aa1b..9e056cf16ec72 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -210,6 +210,13 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.destroy(); } + @Test + public void testInitialBatteryLevelRequested() { + mTestableLooper.processAllMessages(); + + assertThat(mKeyguardUpdateMonitor.mBatteryStatus).isNotNull(); + } + @Test public void testReceiversRegistered() { verify(mBroadcastDispatcher, atLeastOnce()).registerReceiverWithHandler( diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestableContext.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestableContext.java index 95ff98ae620b7..f29f04244901a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestableContext.java +++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestableContext.java @@ -67,27 +67,35 @@ public class SysuiTestableContext extends TestableContext { @Override public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - mRegisteredReceivers.add(receiver); + if (receiver != null) { + mRegisteredReceivers.add(receiver); + } return super.registerReceiver(receiver, filter); } @Override public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) { - mRegisteredReceivers.add(receiver); + if (receiver != null) { + mRegisteredReceivers.add(receiver); + } return super.registerReceiver(receiver, filter, broadcastPermission, scheduler); } @Override public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler) { - mRegisteredReceivers.add(receiver); + if (receiver != null) { + mRegisteredReceivers.add(receiver); + } return super.registerReceiverAsUser(receiver, user, filter, broadcastPermission, scheduler); } @Override public void unregisterReceiver(BroadcastReceiver receiver) { - mRegisteredReceivers.remove(receiver); + if (receiver != null) { + mRegisteredReceivers.remove(receiver); + } super.unregisterReceiver(receiver); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index f83fbd478bf31..eca48c8c2ee12 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -58,6 +58,11 @@ public class BatteryControllerTest extends SysuiTestCase { mBatteryController.init(); } + @Test + public void testBatteryInitialized() { + Assert.assertTrue(mBatteryController.mHasReceivedBattery); + } + @Test public void testIndependentAODBatterySaver_true() { PowerSaveState state = new PowerSaveState.Builder()