[Dagger] Remove Tunable from BatteryMeterView and move to its
controller. Bug: 138786270 Test: atest and manual Change-Id: I70dbaacc4542ffb42cce81b721b6ba3123284e9b
This commit is contained in:
@@ -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<String> 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
|
||||
|
||||
@@ -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<BatteryMeterView> {
|
||||
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<BatteryMeterView>
|
||||
}
|
||||
};
|
||||
|
||||
private final TunerService.Tunable mTunable = new TunerService.Tunable() {
|
||||
@Override
|
||||
public void onTuningChanged(String key, String newValue) {
|
||||
if (StatusBarIconController.ICON_HIDE_LIST.equals(key)) {
|
||||
ArraySet<String> 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<BatteryMeterView>
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -171,6 +171,9 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
|
||||
mCameraSlot = getResources().getString(com.android.internal.R.string.status_bar_camera);
|
||||
mMicSlot = getResources().getString(com.android.internal.R.string.status_bar_microphone);
|
||||
mLocationSlot = getResources().getString(com.android.internal.R.string.status_bar_location);
|
||||
|
||||
// Don't need to worry about tuner settings for this icon
|
||||
mBatteryMeterViewController.ignoreTunerUpdates();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,8 +20,8 @@ import android.view.View
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.battery.BatteryMeterView
|
||||
import com.android.systemui.battery.BatteryMeterViewController
|
||||
import com.android.systemui.qs.carrier.QSCarrierGroupController
|
||||
import com.android.systemui.flags.FeatureFlags
|
||||
import com.android.systemui.qs.carrier.QSCarrierGroupController
|
||||
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope
|
||||
import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_HEADER
|
||||
import javax.inject.Inject
|
||||
@@ -54,11 +54,12 @@ class SplitShadeHeaderController @Inject constructor(
|
||||
}
|
||||
|
||||
init {
|
||||
val batteryIcon: BatteryMeterView = statusBar.findViewById(R.id.batteryRemainingIcon)
|
||||
// battery settings same as in QS icons
|
||||
batteryIcon.setIgnoreTunerUpdates(true)
|
||||
batteryIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
|
||||
batteryMeterViewController.init()
|
||||
val batteryIcon: BatteryMeterView = statusBar.findViewById(R.id.batteryRemainingIcon)
|
||||
|
||||
// battery settings same as in QS icons
|
||||
batteryMeterViewController.ignoreTunerUpdates()
|
||||
batteryIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
|
||||
|
||||
val iconContainer: StatusIconContainer = statusBar.findViewById(R.id.statusIcons)
|
||||
iconManager = StatusBarIconController.IconManager(iconContainer, featureFlags)
|
||||
|
||||
@@ -224,6 +224,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;
|
||||
@@ -540,6 +541,7 @@ public class StatusBar extends SystemUI implements
|
||||
private final KeyguardUnlockAnimationController mKeyguardUnlockAnimationController;
|
||||
private final WallpaperManager mWallpaperManager;
|
||||
private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
|
||||
private final TunerService mTunerService;
|
||||
|
||||
private final List<ExpansionChangedListener> mExpansionChangedListeners;
|
||||
|
||||
@@ -873,7 +875,8 @@ public class StatusBar extends SystemUI implements
|
||||
KeyguardUnlockAnimationController keyguardUnlockAnimationController,
|
||||
WallpaperManager wallpaperManager,
|
||||
UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
|
||||
Optional<StartingSurface> startingSurfaceOptional) {
|
||||
Optional<StartingSurface> 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();
|
||||
|
||||
|
||||
@@ -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<StartingSurface> startingSurfaceOptional) {
|
||||
Optional<StartingSurface> startingSurfaceOptional,
|
||||
TunerService tunerService) {
|
||||
return new StatusBar(
|
||||
context,
|
||||
notificationsController,
|
||||
@@ -298,6 +300,7 @@ public interface StatusBarPhoneModule {
|
||||
keyguardUnlockAnimationController,
|
||||
wallpaperManager,
|
||||
unlockedScreenOffAnimationController,
|
||||
startingSurfaceOptional);
|
||||
startingSurfaceOptional,
|
||||
tunerService);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)))
|
||||
|
||||
Reference in New Issue
Block a user