diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index a7c120e7cc844..b9440c5e3975b 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -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(); - } - } - } } + diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java index e2d88497a86b8..4664423c44222 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterViewController.java @@ -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 { 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 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 super.destroy(); mConfigurationController.removeCallback(mConfigurationListener); unsubscribeFromTunerUpdates(); + mCurrentUserTracker.stopTracking(); + mContentResolver.unregisterContentObserver(mSettingObserver); } /** @@ -111,4 +145,36 @@ public class BatteryMeterViewController extends ViewController mTunerService.removeTunable(mTunable); mIsSubscribedForTunerUpdates = false; } -} \ No newline at end of file + + 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(); + } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index bc549326d6bf3..cbc852b47076b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -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(); 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 b1d7d0c505a7b..903cbb522e4fe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/battery/BatteryMeterViewControllerTest.java @@ -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