[Dagger] Remove Tunable from BatteryMeterView and move to its

controller.

Bug: 138786270
Test: atest and manual
Change-Id: I70dbaacc4542ffb42cce81b721b6ba3123284e9b
This commit is contained in:
Caitlin Cassidy
2021-07-22 22:03:58 +00:00
parent df4f102c95
commit 8065baa006
9 changed files with 115 additions and 75 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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