[Dagger] Remove BatteryController from BatteryMeterView.

Test: atest (+ new tests) and manual
Bug: 138786270
Change-Id: Idf63ff0dc970ab2044b62372d68f36550dcb49b0
This commit is contained in:
Caitlin Cassidy
2021-07-26 21:12:23 +00:00
parent 1640a07aa1
commit 5b6bc005fd
5 changed files with 139 additions and 30 deletions

View File

@@ -41,24 +41,22 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.StyleRes;
import androidx.annotation.VisibleForTesting;
import com.android.settingslib.graph.ThemedBatteryDrawable;
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.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.text.NumberFormat;
public class BatteryMeterView extends LinearLayout implements
BatteryStateChangeCallback, DarkReceiver {
public class BatteryMeterView extends LinearLayout implements DarkReceiver {
@Retention(SOURCE)
@IntDef({MODE_DEFAULT, MODE_ON, MODE_OFF, MODE_ESTIMATE})
@@ -72,7 +70,6 @@ public class BatteryMeterView extends LinearLayout implements
private final ImageView mBatteryIconView;
private TextView mBatteryPercentView;
private BatteryController mBatteryController;
private final @StyleRes int mPercentageStyleId;
private int mTextColor;
private int mLevel;
@@ -90,6 +87,8 @@ public class BatteryMeterView extends LinearLayout implements
private int mNonAdaptedForegroundColor;
private int mNonAdaptedBackgroundColor;
private BatteryEstimateFetcher mBatteryEstimateFetcher;
public BatteryMeterView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
@@ -178,22 +177,7 @@ public class BatteryMeterView extends LinearLayout implements
return false;
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
mBatteryController = Dependency.get(BatteryController.class);
mBatteryController.addCallback(this);
updateShowPercent();
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
mBatteryController.removeCallback(this);
}
@Override
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
void onBatteryLevelChanged(int level, boolean pluggedIn) {
mDrawable.setCharging(pluggedIn);
mDrawable.setBatteryLevel(level);
mCharging = pluggedIn;
@@ -201,8 +185,7 @@ public class BatteryMeterView extends LinearLayout implements
updatePercentText();
}
@Override
public void onPowerSaveChanged(boolean isPowerSave) {
void onPowerSaveChanged(boolean isPowerSave) {
mDrawable.setPowerSaveEnabled(isPowerSave);
}
@@ -222,19 +205,28 @@ public class BatteryMeterView extends LinearLayout implements
updateShowPercent();
}
/**
* Sets the fetcher that should be used to get the estimated time remaining for the user's
* battery.
*/
void setBatteryEstimateFetcher(BatteryEstimateFetcher fetcher) {
mBatteryEstimateFetcher = fetcher;
}
void updatePercentText() {
if (mBatteryStateUnknown) {
setContentDescription(getContext().getString(R.string.accessibility_battery_unknown));
return;
}
if (mBatteryController == null) {
if (mBatteryEstimateFetcher == null) {
return;
}
if (mBatteryPercentView != null) {
if (mShowPercentMode == MODE_ESTIMATE && !mCharging) {
mBatteryController.getEstimatedTimeRemainingString((String estimate) -> {
mBatteryEstimateFetcher.fetchBatteryTimeRemainingEstimate(
(String estimate) -> {
if (mBatteryPercentView == null) {
return;
}
@@ -310,8 +302,7 @@ public class BatteryMeterView extends LinearLayout implements
return mUnknownStateDrawable;
}
@Override
public void onBatteryUnknownStateChanged(boolean isUnknown) {
void onBatteryUnknownStateChanged(boolean isUnknown) {
if (mBatteryStateUnknown == isUnknown) {
return;
}
@@ -390,5 +381,16 @@ public class BatteryMeterView extends LinearLayout implements
pw.println(" mLevel: " + mLevel);
pw.println(" mMode: " + mShowPercentMode);
}
@VisibleForTesting
CharSequence getBatteryPercentViewText() {
return mBatteryPercentView.getText();
}
/** An interface that will fetch the estimated time remaining for the user's battery. */
public interface BatteryEstimateFetcher {
void fetchBatteryTimeRemainingEstimate(
BatteryController.EstimateFetchCompletion completion);
}
}

View File

@@ -31,6 +31,7 @@ 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.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.ViewController;
@@ -42,6 +43,7 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
private final ConfigurationController mConfigurationController;
private final TunerService mTunerService;
private final ContentResolver mContentResolver;
private final BatteryController mBatteryController;
private final String mSlotBattery;
private final SettingObserver mSettingObserver;
@@ -66,6 +68,24 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
}
};
private final BatteryController.BatteryStateChangeCallback mBatteryStateChangeCallback =
new BatteryController.BatteryStateChangeCallback() {
@Override
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
mView.onBatteryLevelChanged(level, pluggedIn);
}
@Override
public void onPowerSaveChanged(boolean isPowerSave) {
mView.onPowerSaveChanged(isPowerSave);
}
@Override
public void onBatteryUnknownStateChanged(boolean isUnknown) {
mView.onBatteryUnknownStateChanged(isUnknown);
}
};
// Some places may need to show the battery conditionally, and not obey the tuner
private boolean mIgnoreTunerUpdates;
private boolean mIsSubscribedForTunerUpdates;
@@ -77,11 +97,15 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
TunerService tunerService,
BroadcastDispatcher broadcastDispatcher,
@Main Handler mainHandler,
ContentResolver contentResolver) {
ContentResolver contentResolver,
BatteryController batteryController) {
super(view);
mConfigurationController = configurationController;
mTunerService = tunerService;
mContentResolver = contentResolver;
mBatteryController = batteryController;
mView.setBatteryEstimateFetcher(mBatteryController::getEstimatedTimeRemainingString);
mSlotBattery = getResources().getString(com.android.internal.R.string.status_bar_battery);
mSettingObserver = new SettingObserver(mainHandler);
@@ -99,16 +123,21 @@ public class BatteryMeterViewController extends ViewController<BatteryMeterView>
protected void onViewAttached() {
mConfigurationController.addCallback(mConfigurationListener);
subscribeForTunerUpdates();
mBatteryController.addCallback(mBatteryStateChangeCallback);
registerShowBatteryPercentObserver(ActivityManager.getCurrentUser());
registerGlobalBatteryUpdateObserver();
mCurrentUserTracker.startTracking();
mView.updateShowPercent();
}
@Override
protected void onViewDetached() {
mConfigurationController.removeCallback(mConfigurationListener);
unsubscribeFromTunerUpdates();
mBatteryController.removeCallback(mBatteryStateChangeCallback);
mCurrentUserTracker.stopTracking();
mContentResolver.unregisterContentObserver(mSettingObserver);
}

View File

@@ -1143,7 +1143,8 @@ public class StatusBar extends SystemUI implements
mTunerService,
mBroadcastDispatcher,
mMainHandler,
mContext.getContentResolver()
mContext.getContentResolver(),
mBatteryController
);
mBatteryMeterViewController.init();

View File

@@ -35,6 +35,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.tuner.TunerService;
@@ -58,6 +59,8 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
private Handler mHandler;
@Mock
private ContentResolver mContentResolver;
@Mock
private BatteryController mBatteryController;
private BatteryMeterViewController mController;
@@ -74,7 +77,8 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
mTunerService,
mBroadcastDispatcher,
mHandler,
mContentResolver
mContentResolver,
mBatteryController
);
}
@@ -92,6 +96,7 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
anyBoolean(),
any()
);
verify(mBatteryController).addCallback(any());
}
@Test
@@ -104,6 +109,7 @@ public class BatteryMeterViewControllerTest extends SysuiTestCase {
verify(mConfigurationController).removeCallback(any());
verify(mTunerService).removeTunable(any());
verify(mContentResolver).unregisterContentObserver(any());
verify(mBatteryController).removeCallback(any());
}
@Test

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.battery
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.battery.BatteryMeterView.BatteryEstimateFetcher
import com.android.systemui.statusbar.policy.BatteryController.EstimateFetchCompletion
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidTestingRunner::class)
@RunWithLooper
class BatteryMeterViewTest : SysuiTestCase() {
private lateinit var mBatteryMeterView: BatteryMeterView
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
mBatteryMeterView = BatteryMeterView(mContext, null)
}
@Test
fun updatePercentText_estimateModeAndNotCharging_estimateFetched() {
mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
mBatteryMeterView.setBatteryEstimateFetcher(Fetcher())
mBatteryMeterView.updatePercentText()
assertThat(mBatteryMeterView.batteryPercentViewText).isEqualTo(ESTIMATE)
}
@Test
fun updatePercentText_noBatteryEstimateFetcher_noCrash() {
mBatteryMeterView.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
mBatteryMeterView.updatePercentText()
// No assert needed
}
private class Fetcher : BatteryEstimateFetcher {
override fun fetchBatteryTimeRemainingEstimate(
completion: EstimateFetchCompletion) {
completion.onBatteryRemainingEstimateRetrieved(ESTIMATE)
}
}
private companion object {
const val ESTIMATE = "2 hours 2 minutes"
}
}