[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
This commit is contained in:
Caitlin Shkuratov
2023-07-11 16:14:14 +00:00
parent e6ac183848
commit cfc712a2f7
9 changed files with 80 additions and 10 deletions

View File

@@ -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;
@@ -41,6 +42,13 @@ public abstract class KeyguardStatusBarViewModule {
return view.findViewById(R.id.battery);
}
/** */
@Provides
@KeyguardStatusBarViewScope
static StatusBarLocation getStatusBarLocation() {
return StatusBarLocation.KEYGUARD;
}
/** */
@Provides
@KeyguardStatusBarViewScope

View File

@@ -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)
}
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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,

View File

@@ -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;
@@ -69,6 +70,13 @@ public interface StatusBarFragmentModule {
return view.findViewById(R.id.battery);
}
/** */
@Provides
@StatusBarFragmentScope
static StatusBarLocation getStatusBarLocation() {
return StatusBarLocation.HOME;
}
/** */
@Provides
@StatusBarFragmentScope

View File

@@ -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);
}
}
/**

View File

@@ -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

View File

@@ -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,