diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index 3c37ede37e4e6..a7c120e7cc844 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -35,12 +35,10 @@ import android.net.Uri; import android.os.Handler; import android.provider.Settings; import android.text.TextUtils; -import android.util.ArraySet; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; @@ -57,11 +55,8 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.settings.CurrentUserTracker; -import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; -import com.android.systemui.tuner.TunerService; -import com.android.systemui.tuner.TunerService.Tunable; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -69,7 +64,7 @@ import java.lang.annotation.Retention; import java.text.NumberFormat; public class BatteryMeterView extends LinearLayout implements - BatteryStateChangeCallback, Tunable, DarkReceiver { + BatteryStateChangeCallback, DarkReceiver { @Retention(SOURCE) @IntDef({MODE_DEFAULT, MODE_ON, MODE_OFF, MODE_ESTIMATE}) @@ -80,7 +75,6 @@ public class BatteryMeterView extends LinearLayout implements public static final int MODE_ESTIMATE = 3; private final ThemedBatteryDrawable mDrawable; - private final String mSlotBattery; private final ImageView mBatteryIconView; private final CurrentUserTracker mUserTracker; private TextView mBatteryPercentView; @@ -92,9 +86,6 @@ public class BatteryMeterView extends LinearLayout implements private int mLevel; private int mShowPercentMode = MODE_DEFAULT; private boolean mShowPercentAvailable; - // Some places may need to show the battery conditionally, and not obey the tuner - private boolean mIgnoreTunerUpdates; - private boolean mIsSubscribedForTunerUpdates; private boolean mCharging; // Error state where we know nothing about the current battery state private boolean mBatteryStateUnknown; @@ -133,8 +124,6 @@ public class BatteryMeterView extends LinearLayout implements setupLayoutTransition(); - mSlotBattery = context.getString( - com.android.internal.R.string.status_bar_battery); mBatteryIconView = new ImageView(context); mBatteryIconView.setImageDrawable(mDrawable); final MarginLayoutParams mlp = new MarginLayoutParams( @@ -199,44 +188,6 @@ public class BatteryMeterView extends LinearLayout implements updateShowPercent(); } - /** - * Set {@code true} to turn off BatteryMeterView's subscribing to the tuner for updates, and - * thus avoid it controlling its own visibility - * - * @param ignore whether to ignore the tuner or not - */ - public void setIgnoreTunerUpdates(boolean ignore) { - mIgnoreTunerUpdates = ignore; - updateTunerSubscription(); - } - - private void updateTunerSubscription() { - if (mIgnoreTunerUpdates) { - unsubscribeFromTunerUpdates(); - } else { - subscribeForTunerUpdates(); - } - } - - private void subscribeForTunerUpdates() { - if (mIsSubscribedForTunerUpdates || mIgnoreTunerUpdates) { - return; - } - - Dependency.get(TunerService.class) - .addTunable(this, StatusBarIconController.ICON_HIDE_LIST); - mIsSubscribedForTunerUpdates = true; - } - - private void unsubscribeFromTunerUpdates() { - if (!mIsSubscribedForTunerUpdates) { - return; - } - - Dependency.get(TunerService.class).removeTunable(this); - mIsSubscribedForTunerUpdates = false; - } - public void setColorsFromContext(Context context) { if (context == null) { return; @@ -250,15 +201,6 @@ public class BatteryMeterView extends LinearLayout implements return false; } - @Override - public void onTuningChanged(String key, String newValue) { - if (StatusBarIconController.ICON_HIDE_LIST.equals(key)) { - ArraySet icons = StatusBarIconController.getIconHideList( - getContext(), newValue); - setVisibility(icons.contains(mSlotBattery) ? View.GONE : View.VISIBLE); - } - } - @Override public void onAttachedToWindow() { super.onAttachedToWindow(); @@ -271,7 +213,6 @@ public class BatteryMeterView extends LinearLayout implements Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME), false, mSettingObserver); updateShowPercent(); - subscribeForTunerUpdates(); mUserTracker.startTracking(); } @@ -281,7 +222,6 @@ public class BatteryMeterView extends LinearLayout implements mUserTracker.stopTracking(); mBatteryController.removeCallback(this); getContext().getContentResolver().unregisterContentObserver(mSettingObserver); - unsubscribeFromTunerUpdates(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java index 198aa4ab82777..e2d88497a86b8 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java @@ -15,7 +15,12 @@ */ package com.android.systemui.battery; +import android.util.ArraySet; +import android.view.View; + +import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.tuner.TunerService; import com.android.systemui.util.ViewController; import javax.inject.Inject; @@ -23,6 +28,9 @@ import javax.inject.Inject; /** Controller for {@link BatteryMeterView}. **/ public class BatteryMeterViewController extends ViewController { private final ConfigurationController mConfigurationController; + private final TunerService mTunerService; + + private final String mSlotBattery; private final ConfigurationController.ConfigurationListener mConfigurationListener = new ConfigurationController.ConfigurationListener() { @@ -32,17 +40,37 @@ public class BatteryMeterViewController extends ViewController } }; + private final TunerService.Tunable mTunable = new TunerService.Tunable() { + @Override + public void onTuningChanged(String key, String newValue) { + if (StatusBarIconController.ICON_HIDE_LIST.equals(key)) { + ArraySet icons = StatusBarIconController.getIconHideList( + getContext(), newValue); + mView.setVisibility(icons.contains(mSlotBattery) ? View.GONE : View.VISIBLE); + } + } + }; + + // Some places may need to show the battery conditionally, and not obey the tuner + private boolean mIgnoreTunerUpdates; + private boolean mIsSubscribedForTunerUpdates; + @Inject public BatteryMeterViewController( BatteryMeterView view, - ConfigurationController configurationController) { + ConfigurationController configurationController, + TunerService tunerService) { super(view); mConfigurationController = configurationController; + mTunerService = tunerService; + + mSlotBattery = getResources().getString(com.android.internal.R.string.status_bar_battery); } @Override protected void onViewAttached() { mConfigurationController.addCallback(mConfigurationListener); + subscribeForTunerUpdates(); } @Override @@ -54,5 +82,33 @@ public class BatteryMeterViewController extends ViewController public void destroy() { super.destroy(); mConfigurationController.removeCallback(mConfigurationListener); + unsubscribeFromTunerUpdates(); + } + + /** + * Turn off {@link BatteryMeterView}'s subscribing to the tuner for updates, and thus avoid it + * controlling its own visibility. + */ + public void ignoreTunerUpdates() { + mIgnoreTunerUpdates = true; + unsubscribeFromTunerUpdates(); + } + + private void subscribeForTunerUpdates() { + if (mIsSubscribedForTunerUpdates || mIgnoreTunerUpdates) { + return; + } + + mTunerService.addTunable(mTunable, StatusBarIconController.ICON_HIDE_LIST); + mIsSubscribedForTunerUpdates = true; + } + + private void unsubscribeFromTunerUpdates() { + if (!mIsSubscribedForTunerUpdates) { + return; + } + + mTunerService.removeTunable(mTunable); + mIsSubscribedForTunerUpdates = false; } } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 6bf9eb4085186..9e6a8b86ebbad 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -133,8 +133,6 @@ public class QuickStatusBarHeader extends FrameLayout { updateResources(); - // Don't need to worry about tuner settings for this icon - mBatteryRemainingIcon.setIgnoreTunerUpdates(true); // QS will always show the estimate, and BatteryMeterView handles the case where // it's unavailable or charging mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index 73d1489d08e0f..df601003f9da2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -171,6 +171,9 @@ class QuickStatusBarHeaderController extends ViewController mExpansionChangedListeners; @@ -873,7 +875,8 @@ public class StatusBar extends SystemUI implements KeyguardUnlockAnimationController keyguardUnlockAnimationController, WallpaperManager wallpaperManager, UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, - Optional startingSurfaceOptional) { + Optional startingSurfaceOptional, + TunerService tunerService) { super(context); mNotificationsController = notificationsController; mLightBarController = lightBarController; @@ -956,6 +959,7 @@ public class StatusBar extends SystemUI implements mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mWallpaperManager = wallpaperManager; mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController; + mTunerService = tunerService; mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mStartingSurfaceOptional = startingSurfaceOptional; @@ -1212,7 +1216,9 @@ public class StatusBar extends SystemUI implements mPhoneStatusBarViewController.init(); mBatteryMeterViewController = new BatteryMeterViewController( - mStatusBarView.findViewById(R.id.battery), mConfigurationController + mStatusBarView.findViewById(R.id.battery), + mConfigurationController, + mTunerService ); mBatteryMeterViewController.init(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 7ad0e7f7d05a5..eabb2ab696ee2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -99,6 +99,7 @@ import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.unfold.UnfoldLightRevealOverlayAnimation; +import com.android.systemui.tuner.TunerService; import com.android.systemui.volume.VolumeComponent; import com.android.systemui.wmshell.BubblesManager; import com.android.unfold.config.UnfoldTransitionConfig; @@ -212,7 +213,8 @@ public interface StatusBarPhoneModule { KeyguardUnlockAnimationController keyguardUnlockAnimationController, WallpaperManager wallpaperManager, UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, - Optional startingSurfaceOptional) { + Optional startingSurfaceOptional, + TunerService tunerService) { return new StatusBar( context, notificationsController, @@ -298,6 +300,7 @@ public interface StatusBarPhoneModule { keyguardUnlockAnimationController, wallpaperManager, unlockedScreenOffAnimationController, - startingSurfaceOptional); + startingSurfaceOptional, + tunerService); } } 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 05bde5cc00aae..b1d7d0c505a7b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java @@ -17,12 +17,15 @@ package com.android.systemui.battery; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.tuner.TunerService; import org.junit.Before; import org.junit.Test; @@ -36,6 +39,8 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase { @Mock private ConfigurationController mConfigurationController; + @Mock + private TunerService mTunerService; private BatteryMeterViewController mController; @@ -43,9 +48,13 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase { public void setup() throws Exception { MockitoAnnotations.initMocks(this); + when(mBatteryMeterView.getContext()).thenReturn(mContext); + when(mBatteryMeterView.getResources()).thenReturn(mContext.getResources()); + mController = new BatteryMeterViewController( mBatteryMeterView, - mConfigurationController + mConfigurationController, + mTunerService ); } @@ -54,6 +63,7 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase { mController.onViewAttached(); verify(mConfigurationController).addCallback(any()); + verify(mTunerService).addTunable(any(), any()); } @Test @@ -64,5 +74,25 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase { mController.onViewDetached(); verify(mConfigurationController).removeCallback(any()); + verify(mTunerService).removeTunable(any()); + } + + @Test + public void ignoreTunerUpdates_afterOnViewAttached_callbackUnregistered() { + // Start out receiving tuner updates + mController.onViewAttached(); + + mController.ignoreTunerUpdates(); + + verify(mTunerService).removeTunable(any()); + } + + @Test + public void ignoreTunerUpdates_beforeOnViewAttached_callbackNeverRegistered() { + mController.ignoreTunerUpdates(); + + mController.onViewAttached(); + + verify(mTunerService, never()).addTunable(any(), any()); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index c06a9ae92140e..e4f6e13db607f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -138,6 +138,7 @@ import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.UserInfoControllerImpl; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.unfold.UnfoldLightRevealOverlayAnimation; +import com.android.systemui.tuner.TunerService; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; import com.android.systemui.volume.VolumeComponent; @@ -262,6 +263,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private IWallpaperManager mIWallpaperManager; @Mock private KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; @Mock private UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + @Mock private TunerService mTunerService; @Mock private StartingSurface mStartingSurface; private ShadeController mShadeController; private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); @@ -425,7 +427,8 @@ public class StatusBarTest extends SysuiTestCase { mKeyguardUnlockAnimationController, mWallpaperManager, mUnlockedScreenOffAnimationController, - Optional.of(mStartingSurface)); + Optional.of(mStartingSurface), + mTunerService); when(mKeyguardViewMediator.registerStatusBar(any(StatusBar.class), any(ViewGroup.class), any(NotificationPanelViewController.class), any(BiometricUnlockController.class), any(ViewGroup.class), any(KeyguardBypassController.class)))