diff options
| author | 2023-07-11 16:14:14 +0000 | |
|---|---|---|
| committer | 2023-07-11 18:29:31 +0000 | |
| commit | cfc712a2f701d4bec4930354e684c9f9fc7f4180 (patch) | |
| tree | 8f0d85c793fe20f94453a71ba18f198d4455c487 | |
| parent | e6ac1838482a36aa3626c1c059c118294411e877 (diff) | |
[SB] Invalidate battery drawable on shield change; dump more info.
It seems other aspects of the battery drawable like `charging` would
invalidate the drawable directly, whereas `displayShield` wasn't. This
adds that invalidation. I'm not sure if that was what was causing the
bug, but it couldn't hurt.
This also adds more info to the `BatteryController` dump so we can see
who's registered as listening for events and the current state of the
battery drawables. See bug for sample dump.
Bug: 286998719
Test: `adb shell am broadcast -a com.android.systemui.demo -e command
battery -e defender true` -> shield shown
Test: `adb shell am broadcast -a com.android.systemui.demo -e command
battery -e defender false` -> shield hidden
Test: `adb shell dumpsys activity service
com.android.systemui/.SystemUIService BatteryController` -> additional
info is dumped
Test: atest BatteryMeterViewControllerTest
BatteryControllerImplGoogleTest
Change-Id: Idef1e6a883dd09012671ffc19520e8c3664f7dd2
9 files changed, 80 insertions, 10 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewModule.java b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewModule.java index a7d4455b43c2..87627698597f 100644 --- a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewModule.java +++ b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardStatusBarViewModule.java @@ -20,6 +20,7 @@ import com.android.keyguard.CarrierText; import com.android.systemui.R; import com.android.systemui.battery.BatteryMeterView; import com.android.systemui.statusbar.phone.KeyguardStatusBarView; +import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer; import dagger.Module; @@ -44,6 +45,13 @@ public abstract class KeyguardStatusBarViewModule { /** */ @Provides @KeyguardStatusBarViewScope + static StatusBarLocation getStatusBarLocation() { + return StatusBarLocation.KEYGUARD; + } + + /** */ + @Provides + @KeyguardStatusBarViewScope static StatusBarUserSwitcherContainer getUserSwitcherContainer(KeyguardStatusBarView view) { return view.findViewById(R.id.user_switcher_container); } diff --git a/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt b/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt index b52ddc1dbc42..b34f1b45d763 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt +++ b/packages/SystemUI/src/com/android/systemui/battery/AccessorizedBatteryDrawable.kt @@ -87,6 +87,10 @@ class AccessorizedBatteryDrawable( } var displayShield: Boolean = false + set(value) { + field = value + postInvalidate() + } private fun updateSizes() { val b = bounds @@ -204,4 +208,11 @@ class AccessorizedBatteryDrawable( val shieldPathString = context.resources.getString(R.string.config_batterymeterShieldPath) shieldPath.set(PathParser.createPathFromPathData(shieldPathString)) } + + private val invalidateRunnable: () -> Unit = { invalidateSelf() } + + private fun postInvalidate() { + unscheduleSelf(invalidateRunnable) + scheduleSelf(invalidateRunnable, 0) + } } diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index c1238d911ecf..4e8383c3e39e 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -464,9 +464,11 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { public void dump(PrintWriter pw, String[] args) { String powerSave = mDrawable == null ? null : mDrawable.getPowerSaveEnabled() + ""; + String displayShield = mDrawable == null ? null : mDrawable.getDisplayShield() + ""; CharSequence percent = mBatteryPercentView == null ? null : mBatteryPercentView.getText(); pw.println(" BatteryMeterView:"); pw.println(" mDrawable.getPowerSave: " + powerSave); + pw.println(" mDrawable.getDisplayShield: " + displayShield); pw.println(" mBatteryPercentView.getText(): " + percent); pw.println(" mTextColor: #" + Integer.toHexString(mTextColor)); pw.println(" mBatteryStateUnknown: " + mBatteryStateUnknown); diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java index f6a10bd4af4a..8b220242f7ad 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java @@ -35,11 +35,14 @@ import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController; +import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.ViewController; +import java.io.PrintWriter; + import javax.inject.Inject; /** Controller for {@link BatteryMeterView}. **/ @@ -53,6 +56,7 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> private final String mSlotBattery; private final SettingObserver mSettingObserver; private final UserTracker mUserTracker; + private final StatusBarLocation mLocation; private final ConfigurationController.ConfigurationListener mConfigurationListener = new ConfigurationController.ConfigurationListener() { @@ -94,6 +98,13 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> public void onIsBatteryDefenderChanged(boolean isBatteryDefender) { mView.onIsBatteryDefenderChanged(isBatteryDefender); } + + @Override + public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { + pw.print(super.toString()); + pw.println(" location=" + mLocation); + mView.dump(pw, args); + } }; private final UserTracker.Callback mUserChangedCallback = @@ -113,6 +124,7 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> @Inject public BatteryMeterViewController( BatteryMeterView view, + StatusBarLocation location, UserTracker userTracker, ConfigurationController configurationController, TunerService tunerService, @@ -121,6 +133,7 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView> FeatureFlags featureFlags, BatteryController batteryController) { super(view); + mLocation = location; mUserTracker = userTracker; mConfigurationController = configurationController; mTunerService = tunerService; diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt index 8ae9e5e1fb8c..edeb28e30d6b 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt @@ -50,6 +50,7 @@ import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfC import com.android.systemui.statusbar.notification.shelf.ui.viewbinder.NotificationShelfViewBinderWrapperControllerImpl import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.phone.KeyguardBottomAreaView +import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.phone.TapAgainView import com.android.systemui.statusbar.policy.BatteryController @@ -286,6 +287,7 @@ abstract class ShadeModule { ): BatteryMeterViewController { return BatteryMeterViewController( batteryMeterView, + StatusBarLocation.QS, userTracker, configurationController, tunerService, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java index 97a1bd1851d9..c8e73d33c452 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java @@ -26,6 +26,7 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarTransitions; import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.PhoneStatusBarViewController; import com.android.systemui.statusbar.phone.StatusBarBoundsProvider; +import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.phone.SystemBarAttributesListener; import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment; import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer; @@ -72,6 +73,13 @@ public interface StatusBarFragmentModule { /** */ @Provides @StatusBarFragmentScope + static StatusBarLocation getStatusBarLocation() { + return StatusBarLocation.HOME; + } + + /** */ + @Provides + @StatusBarFragmentScope @Named(START_SIDE_CONTENT) static View startSideContent(@RootView PhoneStatusBarView view) { return view.findViewById(R.id.status_bar_start_side_content); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index 3d165912a09c..7df083afcd19 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -19,6 +19,9 @@ package com.android.systemui.statusbar.policy; import android.annotation.Nullable; import android.view.View; +import androidx.annotation.NonNull; + +import com.android.systemui.Dumpable; import com.android.systemui.demomode.DemoMode; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; @@ -136,7 +139,7 @@ public interface BatteryController extends DemoMode, * A listener that will be notified whenever a change in battery level or power save mode has * occurred. */ - interface BatteryStateChangeCallback { + interface BatteryStateChangeCallback extends Dumpable { default void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { } @@ -158,6 +161,11 @@ public interface BatteryController extends DemoMode, default void onIsBatteryDefenderChanged(boolean isBatteryDefender) { } + + @Override + default void dump(@NonNull PrintWriter pw, @NonNull String[] args) { + pw.println(this); + } } /** 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 e69d86c31abc..d5d8f4d7598e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -22,6 +22,7 @@ import static android.os.BatteryManager.EXTRA_CHARGING_STATUS; import static android.os.BatteryManager.EXTRA_PRESENT; import static com.android.settingslib.fuelgauge.BatterySaverLogging.SAVER_ENABLED_QS; +import static com.android.systemui.util.DumpUtilsKt.asIndenting; import android.annotation.WorkerThread; import android.content.BroadcastReceiver; @@ -33,6 +34,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.PowerManager; import android.os.PowerSaveState; +import android.util.IndentingPrintWriter; import android.util.Log; import android.view.View; @@ -157,15 +159,29 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC } @Override - public void dump(PrintWriter pw, String[] args) { - pw.println("BatteryController state:"); - pw.print(" mLevel="); pw.println(mLevel); - pw.print(" mPluggedIn="); pw.println(mPluggedIn); - pw.print(" mCharging="); pw.println(mCharging); - pw.print(" mCharged="); pw.println(mCharged); - pw.print(" mIsBatteryDefender="); pw.println(mIsBatteryDefender); - pw.print(" mPowerSave="); pw.println(mPowerSave); - pw.print(" mStateUnknown="); pw.println(mStateUnknown); + public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { + IndentingPrintWriter ipw = asIndenting(pw); + ipw.println("BatteryController state:"); + ipw.increaseIndent(); + ipw.print("mHasReceivedBattery="); ipw.println(mHasReceivedBattery); + ipw.print("mLevel="); ipw.println(mLevel); + ipw.print("mPluggedIn="); ipw.println(mPluggedIn); + ipw.print("mCharging="); ipw.println(mCharging); + ipw.print("mCharged="); ipw.println(mCharged); + ipw.print("mIsBatteryDefender="); ipw.println(mIsBatteryDefender); + ipw.print("mPowerSave="); ipw.println(mPowerSave); + ipw.print("mStateUnknown="); ipw.println(mStateUnknown); + ipw.println("Callbacks:------------------"); + // Since the above lines are already indented, we need to indent twice for the callbacks. + ipw.increaseIndent(); + synchronized (mChangeCallbacks) { + final int n = mChangeCallbacks.size(); + for (int i = 0; i < n; i++) { + mChangeCallbacks.get(i).dump(ipw, args); + } + } + ipw.decreaseIndent(); + ipw.println("------------------"); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java index 1482f291b57a..87811fb8fac0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java @@ -37,6 +37,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.Flags; import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.tuner.TunerService; @@ -153,6 +154,7 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase { private void initController() { mController = new BatteryMeterViewController( mBatteryMeterView, + StatusBarLocation.HOME, mUserTracker, mConfigurationController, mTunerService, |