[Dagger] Remove BroadcastDispatcher from BatteryMeterView
Test: atest + manual, + verified b/64442190 doesn't re-occur. Bug: 138786270 Change-Id: Iefa05d10240fccf8be2103de076f3278947dd88e
This commit is contained in:
@@ -24,17 +24,13 @@ import static java.lang.annotation.RetentionPolicy.SOURCE;
|
||||
import android.animation.LayoutTransition;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.annotation.IntDef;
|
||||
import android.app.ActivityManager;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.database.ContentObserver;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Gravity;
|
||||
@@ -51,10 +47,8 @@ import com.android.systemui.Dependency;
|
||||
import com.android.systemui.DualToneHandler;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.Interpolators;
|
||||
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.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
|
||||
|
||||
@@ -76,11 +70,9 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
|
||||
private final ThemedBatteryDrawable mDrawable;
|
||||
private final ImageView mBatteryIconView;
|
||||
private final CurrentUserTracker mUserTracker;
|
||||
private TextView mBatteryPercentView;
|
||||
|
||||
private BatteryController mBatteryController;
|
||||
private SettingObserver mSettingObserver;
|
||||
private final @StyleRes int mPercentageStyleId;
|
||||
private int mTextColor;
|
||||
private int mLevel;
|
||||
@@ -93,7 +85,6 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
private Drawable mUnknownStateDrawable;
|
||||
|
||||
private DualToneHandler mDualToneHandler;
|
||||
private int mUser;
|
||||
|
||||
private int mNonAdaptedSingleToneColor;
|
||||
private int mNonAdaptedForegroundColor;
|
||||
@@ -105,7 +96,6 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
|
||||
public BatteryMeterView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
BroadcastDispatcher broadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
|
||||
|
||||
setOrientation(LinearLayout.HORIZONTAL);
|
||||
setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
|
||||
@@ -118,7 +108,6 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
mDrawable = new ThemedBatteryDrawable(context, frameColor);
|
||||
atts.recycle();
|
||||
|
||||
mSettingObserver = new SettingObserver(new Handler(context.getMainLooper()));
|
||||
mShowPercentAvailable = context.getResources().getBoolean(
|
||||
com.android.internal.R.bool.config_battery_percentage_setting_available);
|
||||
|
||||
@@ -138,18 +127,6 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
// Init to not dark at all.
|
||||
onDarkChanged(new Rect(), 0, DarkIconDispatcher.DEFAULT_ICON_TINT);
|
||||
|
||||
mUserTracker = new CurrentUserTracker(broadcastDispatcher) {
|
||||
@Override
|
||||
public void onUserSwitched(int newUserId) {
|
||||
mUser = newUserId;
|
||||
getContext().getContentResolver().unregisterContentObserver(mSettingObserver);
|
||||
getContext().getContentResolver().registerContentObserver(
|
||||
Settings.System.getUriFor(SHOW_BATTERY_PERCENT), false, mSettingObserver,
|
||||
newUserId);
|
||||
updateShowPercent();
|
||||
}
|
||||
};
|
||||
|
||||
setClipChildren(false);
|
||||
setClipToPadding(false);
|
||||
}
|
||||
@@ -206,22 +183,13 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
super.onAttachedToWindow();
|
||||
mBatteryController = Dependency.get(BatteryController.class);
|
||||
mBatteryController.addCallback(this);
|
||||
mUser = ActivityManager.getCurrentUser();
|
||||
getContext().getContentResolver().registerContentObserver(
|
||||
Settings.System.getUriFor(SHOW_BATTERY_PERCENT), false, mSettingObserver, mUser);
|
||||
getContext().getContentResolver().registerContentObserver(
|
||||
Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
|
||||
false, mSettingObserver);
|
||||
updateShowPercent();
|
||||
mUserTracker.startTracking();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
mUserTracker.stopTracking();
|
||||
mBatteryController.removeCallback(this);
|
||||
getContext().getContentResolver().unregisterContentObserver(mSettingObserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -254,7 +222,7 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
updateShowPercent();
|
||||
}
|
||||
|
||||
private void updatePercentText() {
|
||||
void updatePercentText() {
|
||||
if (mBatteryStateUnknown) {
|
||||
setContentDescription(getContext().getString(R.string.accessibility_battery_unknown));
|
||||
return;
|
||||
@@ -300,12 +268,12 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
: R.string.accessibility_battery_level, mLevel));
|
||||
}
|
||||
|
||||
private void updateShowPercent() {
|
||||
void updateShowPercent() {
|
||||
final boolean showing = mBatteryPercentView != null;
|
||||
// TODO(b/140051051)
|
||||
final boolean systemSetting = 0 != whitelistIpcs(() -> Settings.System
|
||||
.getIntForUser(getContext().getContentResolver(),
|
||||
SHOW_BATTERY_PERCENT, 0, mUser));
|
||||
SHOW_BATTERY_PERCENT, 0, UserHandle.USER_CURRENT));
|
||||
boolean shouldShow =
|
||||
(mShowPercentAvailable && systemSetting && mShowPercentMode != MODE_OFF)
|
||||
|| mShowPercentMode == MODE_ON
|
||||
@@ -422,21 +390,5 @@ public class BatteryMeterView extends LinearLayout implements
|
||||
pw.println(" mLevel: " + mLevel);
|
||||
pw.println(" mMode: " + mShowPercentMode);
|
||||
}
|
||||
|
||||
private final class SettingObserver extends ContentObserver {
|
||||
public SettingObserver(Handler handler) {
|
||||
super(handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
super.onChange(selfChange, uri);
|
||||
updateShowPercent();
|
||||
if (TextUtils.equals(uri.getLastPathSegment(),
|
||||
Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME)) {
|
||||
// update the text for sure if the estimate in the cache was updated
|
||||
updatePercentText();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,9 +15,21 @@
|
||||
*/
|
||||
package com.android.systemui.battery;
|
||||
|
||||
import static android.provider.Settings.System.SHOW_BATTERY_PERCENT;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.content.ContentResolver;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.ArraySet;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
import com.android.systemui.settings.CurrentUserTracker;
|
||||
import com.android.systemui.statusbar.phone.StatusBarIconController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.tuner.TunerService;
|
||||
@@ -29,8 +41,11 @@ import javax.inject.Inject;
|
||||
public class BatteryMeterViewController extends ViewController<BatteryMeterView> {
|
||||
private final ConfigurationController mConfigurationController;
|
||||
private final TunerService mTunerService;
|
||||
private final ContentResolver mContentResolver;
|
||||
|
||||
private final String mSlotBattery;
|
||||
private final SettingObserver mSettingObserver;
|
||||
private final CurrentUserTracker mCurrentUserTracker;
|
||||
|
||||
private final ConfigurationController.ConfigurationListener mConfigurationListener =
|
||||
new ConfigurationController.ConfigurationListener() {
|
||||
@@ -59,18 +74,35 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
|
||||
public BatteryMeterViewController(
|
||||
BatteryMeterView view,
|
||||
ConfigurationController configurationController,
|
||||
TunerService tunerService) {
|
||||
TunerService tunerService,
|
||||
BroadcastDispatcher broadcastDispatcher,
|
||||
@Main Handler mainHandler,
|
||||
ContentResolver contentResolver) {
|
||||
super(view);
|
||||
mConfigurationController = configurationController;
|
||||
mTunerService = tunerService;
|
||||
mContentResolver = contentResolver;
|
||||
|
||||
mSlotBattery = getResources().getString(com.android.internal.R.string.status_bar_battery);
|
||||
mSettingObserver = new SettingObserver(mainHandler);
|
||||
mCurrentUserTracker = new CurrentUserTracker(broadcastDispatcher) {
|
||||
@Override
|
||||
public void onUserSwitched(int newUserId) {
|
||||
contentResolver.unregisterContentObserver(mSettingObserver);
|
||||
registerShowBatteryPercentObserver(newUserId);
|
||||
mView.updateShowPercent();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onViewAttached() {
|
||||
mConfigurationController.addCallback(mConfigurationListener);
|
||||
subscribeForTunerUpdates();
|
||||
|
||||
registerShowBatteryPercentObserver(ActivityManager.getCurrentUser());
|
||||
registerGlobalBatteryUpdateObserver();
|
||||
mCurrentUserTracker.startTracking();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -83,6 +115,8 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
|
||||
super.destroy();
|
||||
mConfigurationController.removeCallback(mConfigurationListener);
|
||||
unsubscribeFromTunerUpdates();
|
||||
mCurrentUserTracker.stopTracking();
|
||||
mContentResolver.unregisterContentObserver(mSettingObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,4 +145,36 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
|
||||
mTunerService.removeTunable(mTunable);
|
||||
mIsSubscribedForTunerUpdates = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void registerShowBatteryPercentObserver(int user) {
|
||||
mContentResolver.registerContentObserver(
|
||||
Settings.System.getUriFor(SHOW_BATTERY_PERCENT),
|
||||
false,
|
||||
mSettingObserver,
|
||||
user);
|
||||
}
|
||||
|
||||
private void registerGlobalBatteryUpdateObserver() {
|
||||
mContentResolver.registerContentObserver(
|
||||
Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME),
|
||||
false,
|
||||
mSettingObserver);
|
||||
}
|
||||
|
||||
private final class SettingObserver extends ContentObserver {
|
||||
public SettingObserver(Handler handler) {
|
||||
super(handler);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChange(boolean selfChange, Uri uri) {
|
||||
super.onChange(selfChange, uri);
|
||||
mView.updateShowPercent();
|
||||
if (TextUtils.equals(uri.getLastPathSegment(),
|
||||
Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME)) {
|
||||
// update the text for sure if the estimate in the cache was updated
|
||||
mView.updatePercentText();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1218,7 +1218,10 @@ public class StatusBar extends SystemUI implements
|
||||
mBatteryMeterViewController = new BatteryMeterViewController(
|
||||
mStatusBarView.findViewById(R.id.battery),
|
||||
mConfigurationController,
|
||||
mTunerService
|
||||
mTunerService,
|
||||
mBroadcastDispatcher,
|
||||
mMainThreadHandler,
|
||||
mContext.getContentResolver()
|
||||
);
|
||||
mBatteryMeterViewController.init();
|
||||
|
||||
|
||||
@@ -16,14 +16,25 @@
|
||||
|
||||
package com.android.systemui.battery;
|
||||
|
||||
import static android.provider.Settings.System.SHOW_BATTERY_PERCENT;
|
||||
|
||||
import static com.android.systemui.util.mockito.KotlinMockitoHelpersKt.eq;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.os.Handler;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.tuner.TunerService;
|
||||
|
||||
@@ -41,6 +52,12 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
|
||||
private ConfigurationController mConfigurationController;
|
||||
@Mock
|
||||
private TunerService mTunerService;
|
||||
@Mock
|
||||
private BroadcastDispatcher mBroadcastDispatcher;
|
||||
@Mock
|
||||
private Handler mHandler;
|
||||
@Mock
|
||||
private ContentResolver mContentResolver;
|
||||
|
||||
private BatteryMeterViewController mController;
|
||||
|
||||
@@ -54,7 +71,10 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
|
||||
mController = new BatteryMeterViewController(
|
||||
mBatteryMeterView,
|
||||
mConfigurationController,
|
||||
mTunerService
|
||||
mTunerService,
|
||||
mBroadcastDispatcher,
|
||||
mHandler,
|
||||
mContentResolver
|
||||
);
|
||||
}
|
||||
|
||||
@@ -64,6 +84,14 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
|
||||
|
||||
verify(mConfigurationController).addCallback(any());
|
||||
verify(mTunerService).addTunable(any(), any());
|
||||
verify(mContentResolver).registerContentObserver(
|
||||
eq(Settings.System.getUriFor(SHOW_BATTERY_PERCENT)), anyBoolean(), any(), anyInt()
|
||||
);
|
||||
verify(mContentResolver).registerContentObserver(
|
||||
eq(Settings.Global.getUriFor(Settings.Global.BATTERY_ESTIMATES_LAST_UPDATE_TIME)),
|
||||
anyBoolean(),
|
||||
any()
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -75,6 +103,7 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
|
||||
|
||||
verify(mConfigurationController).removeCallback(any());
|
||||
verify(mTunerService).removeTunable(any());
|
||||
verify(mContentResolver).unregisterContentObserver(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user