From f4bc35333b5bc85ab77931b79ff4a57e3f0eb8fb Mon Sep 17 00:00:00 2001 From: "Wesley.CW Wang" Date: Thu, 4 Feb 2021 16:44:55 +0800 Subject: [PATCH] Update battery percentage column to UsageProgressBarPref (1/2) - Change battery percentage column to new design - Remove debug info case Screenshots: https://screenshot.googleplex.com/9rvRfK3wBtpnarZ.png https://screenshot.googleplex.com/5iAjNXTptDechAm.png Bug: 177407113 Test: make RunSettingsRoboTests -j40 Change-Id: I5d046be29a036910036e72edb677b69bc2c0a03f --- res/xml/power_usage_summary.xml | 3 +- .../BatteryHeaderPreferenceController.java | 77 ++++----------- .../settings/fuelgauge/PowerUsageSummary.java | 78 +--------------- ...BatteryHeaderPreferenceControllerTest.java | 73 +++++---------- .../fuelgauge/PowerUsageSummaryTest.java | 93 ------------------- 5 files changed, 39 insertions(+), 285 deletions(-) diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml index f683f3c0293..b5e414b487c 100644 --- a/res/xml/power_usage_summary.xml +++ b/res/xml/power_usage_summary.xml @@ -21,11 +21,10 @@ android:title="@string/power_usage_summary_title" settings:keywords="@string/keywords_battery"> - > mBatteryInfoDebugLoaderCallbacks = - new LoaderCallbacks>() { - @Override - public Loader> onCreateLoader(int i, Bundle bundle) { - return new DebugEstimatesLoader(getContext(), mStatsHelper); - } - - @Override - public void onLoadFinished(Loader> loader, - List batteryInfos) { - updateViews(batteryInfos); - } - - @Override - public void onLoaderReset(Loader> loader) { - } - }; - - protected void updateViews(List batteryInfos) { - final BatteryMeterView batteryView = mBatteryLayoutPref - .findViewById(R.id.battery_header_icon); - final TextView percentRemaining = - mBatteryLayoutPref.findViewById(R.id.battery_percent); - final TextView summary1 = mBatteryLayoutPref.findViewById(R.id.summary1); - BatteryInfo oldInfo = batteryInfos.get(0); - BatteryInfo newInfo = batteryInfos.get(1); - percentRemaining.setText(Utils.formatPercentage(oldInfo.batteryLevel)); - - // set the text to the old estimate (copied from battery info). Note that this - // can sometimes say 0 time remaining because battery stats requires the phone - // be unplugged for a period of time before being willing ot make an estimate. - final String OldEstimateString = mPowerFeatureProvider.getOldEstimateDebugString( - Formatter.formatShortElapsedTime(getContext(), - PowerUtil.convertUsToMs(oldInfo.remainingTimeUs))); - final String NewEstimateString = mPowerFeatureProvider.getEnhancedEstimateDebugString( - Formatter.formatShortElapsedTime(getContext(), - PowerUtil.convertUsToMs(newInfo.remainingTimeUs))); - summary1.setText(OldEstimateString + "\n" + NewEstimateString); - - batteryView.setBatteryLevel(oldInfo.batteryLevel); - batteryView.setCharging(!oldInfo.discharging); - } - private LoaderManager.LoaderCallbacks> mBatteryTipsCallbacks = new LoaderManager.LoaderCallbacks>() { @@ -197,7 +145,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList setAnimationAllowed(true); initFeatureProvider(); - mBatteryLayoutPref = (LayoutPreference) findPreference(KEY_BATTERY_HEADER); mBatteryUtils = BatteryUtils.getInstance(getContext()); @@ -274,17 +221,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList mBatteryLayoutPref = layoutPreference; } - @VisibleForTesting - void showBothEstimates() { - final Context context = getContext(); - if (context == null - || !mPowerFeatureProvider.isEnhancedBatteryPredictionEnabled(context)) { - return; - } - getLoaderManager().restartLoader(DEBUG_INFO_LOADER, Bundle.EMPTY, - mBatteryInfoDebugLoaderCallbacks); - } - @VisibleForTesting void initFeatureProvider() { final Context context = getContext(); @@ -303,11 +239,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList } getLoaderManager().restartLoader(BATTERY_INFO_LOADER, Bundle.EMPTY, mBatteryInfoLoaderCallbacks); - if (mPowerFeatureProvider.isEstimateDebugEnabled()) { - // Set long click action for summary to show debug info - View header = mBatteryLayoutPref.findViewById(R.id.summary1); - header.setOnLongClickListener(this); - } } @VisibleForTesting @@ -315,13 +246,6 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList mNeedUpdateBatteryTip = icicle == null || mBatteryTipPreferenceController.needUpdate(); } - @Override - public boolean onLongClick(View view) { - showBothEstimates(); - view.setOnLongClickListener(null); - return true; - } - @Override protected void restartBatteryStatsLoader(@BatteryUpdateType int refreshType) { super.restartBatteryStatsLoader(refreshType); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java index ac3c8f9cd5b..14c943df3f1 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java @@ -32,9 +32,10 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.icu.text.NumberFormat; import android.os.BatteryManager; import android.os.PowerManager; -import android.widget.TextView; +import android.text.TextUtils; import androidx.lifecycle.LifecycleOwner; import androidx.preference.PreferenceFragmentCompat; @@ -47,7 +48,7 @@ import com.android.settings.testutils.shadow.ShadowEntityHeaderController; import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.core.lifecycle.Lifecycle; -import com.android.settingslib.widget.LayoutPreference; +import com.android.settingslib.widget.UsageProgressBarPreference; import org.junit.After; import org.junit.Before; @@ -57,9 +58,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowPowerManager; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowEntityHeaderController.class, ShadowUtils.class}) @@ -67,6 +66,7 @@ public class BatteryHeaderPreferenceControllerTest { private static final String PREF_KEY = "battery_header"; private static final int BATTERY_LEVEL = 60; + private static final int BATTERY_MAX_LEVEL = 100; private static final String TIME_LEFT = "2h30min"; private static final String BATTERY_STATUS = "Charging"; @@ -80,13 +80,11 @@ public class BatteryHeaderPreferenceControllerTest { private BatteryInfo mBatteryInfo; @Mock private EntityHeaderController mEntityHeaderController; + @Mock + private UsageProgressBarPreference mBatteryUsageProgressBarPref; private BatteryHeaderPreferenceController mController; private Context mContext; private PowerManager mPowerManager; - private BatteryMeterView mBatteryMeterView; - private TextView mBatteryPercentText; - private TextView mSummary; - private LayoutPreference mBatteryLayoutPref; private Intent mBatteryIntent; private LifecycleOwner mLifecycleOwner; private Lifecycle mLifecycle; @@ -98,9 +96,6 @@ public class BatteryHeaderPreferenceControllerTest { mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); mContext = spy(RuntimeEnvironment.application); - mBatteryMeterView = new BatteryMeterView(mContext); - mBatteryPercentText = new TextView(mContext); - mSummary = new TextView(mContext); ShadowEntityHeaderController.setUseMock(mEntityHeaderController); mBatteryIntent = new Intent(); @@ -109,8 +104,7 @@ public class BatteryHeaderPreferenceControllerTest { mBatteryIntent.putExtra(BatteryManager.EXTRA_PLUGGED, 1); doReturn(mBatteryIntent).when(mContext).registerReceiver(any(), any()); - mBatteryLayoutPref = new LayoutPreference(mContext, R.layout.battery_header); - doReturn(mBatteryLayoutPref).when(mPreferenceScreen) + doReturn(mBatteryUsageProgressBarPref).when(mPreferenceScreen) .findPreference(BatteryHeaderPreferenceController.KEY_BATTERY_HEADER); mBatteryInfo.batteryLevel = BATTERY_LEVEL; @@ -122,9 +116,7 @@ public class BatteryHeaderPreferenceControllerTest { mController.setActivity(mActivity); mController.setFragment(mPreferenceFragment); mController.setLifecycle(mLifecycle); - mController.mBatteryMeterView = mBatteryMeterView; - mController.mBatteryPercentText = mBatteryPercentText; - mController.mSummary1 = mSummary; + mController.mBatteryUsageProgressBarPref = mBatteryUsageProgressBarPref; } @After @@ -137,11 +129,8 @@ public class BatteryHeaderPreferenceControllerTest { public void displayPreference_displayBatteryLevel() { mController.displayPreference(mPreferenceScreen); - assertThat(((BatteryMeterView) mBatteryLayoutPref.findViewById( - R.id.battery_header_icon)).getBatteryLevel()).isEqualTo(BATTERY_LEVEL); - assertThat(((TextView) mBatteryLayoutPref.findViewById(R.id.battery_percent)) - .getText().toString()) - .isEqualTo("60 %"); + verify(mBatteryUsageProgressBarPref).setUsageSummary(formatBatteryPercentageText()); + verify(mBatteryUsageProgressBarPref).setPercent(BATTERY_LEVEL, BATTERY_MAX_LEVEL); } @Test @@ -150,7 +139,7 @@ public class BatteryHeaderPreferenceControllerTest { mController.updateHeaderPreference(mBatteryInfo); - assertThat(mSummary.getText()).isEqualTo(mBatteryInfo.remainingLabel); + verify(mBatteryUsageProgressBarPref).setTotalSummary(mBatteryInfo.remainingLabel); } @Test @@ -161,8 +150,9 @@ public class BatteryHeaderPreferenceControllerTest { mController.updateHeaderPreference(mBatteryInfo); - assertThat(mBatteryMeterView.mDrawable.getBatteryLevel()).isEqualTo(BATTERY_LEVEL); - assertThat(mBatteryMeterView.mDrawable.getCharging()).isEqualTo(false); + verify(mBatteryUsageProgressBarPref).setUsageSummary(formatBatteryPercentageText()); + verify(mBatteryUsageProgressBarPref).setTotalSummary(mBatteryInfo.remainingLabel); + verify(mBatteryUsageProgressBarPref).setPercent(BATTERY_LEVEL, BATTERY_MAX_LEVEL); } @Test @@ -172,7 +162,7 @@ public class BatteryHeaderPreferenceControllerTest { mController.updateHeaderPreference(mBatteryInfo); - assertThat(mSummary.getText()).isEqualTo(BATTERY_STATUS); + verify(mBatteryUsageProgressBarPref).setTotalSummary(BATTERY_STATUS); } @Test @@ -181,7 +171,7 @@ public class BatteryHeaderPreferenceControllerTest { mController.updateHeaderPreference(mBatteryInfo); - assertThat(mSummary.getText().toString().isEmpty()).isTrue(); + verify(mBatteryUsageProgressBarPref).setTotalSummary(null); } @Test @@ -197,27 +187,10 @@ public class BatteryHeaderPreferenceControllerTest { @Test public void quickUpdateHeaderPreference_onlyUpdateBatteryLevelAndChargingState() { - mSummary.setText(BATTERY_STATUS); - mController.quickUpdateHeaderPreference(); - assertThat(mBatteryMeterView.getBatteryLevel()).isEqualTo(BATTERY_LEVEL); - assertThat(mBatteryMeterView.getCharging()).isTrue(); - assertThat(mBatteryPercentText.getText().toString()).isEqualTo("60 %"); - assertThat(mSummary.getText()).isEqualTo(BATTERY_STATUS); - } - - @Test - public void quickUpdateHeaderPreference_showPowerSave() { - boolean testValues[] = {false, true}; - - ShadowPowerManager shadowPowerManager = Shadows.shadowOf(mPowerManager); - for (boolean value : testValues) { - shadowPowerManager.setIsPowerSaveMode(value); - mController.quickUpdateHeaderPreference(); - - assertThat(mBatteryMeterView.getPowerSave()).isEqualTo(value); - } + verify(mBatteryUsageProgressBarPref).setUsageSummary(formatBatteryPercentageText()); + verify(mBatteryUsageProgressBarPref).setPercent(BATTERY_LEVEL, BATTERY_MAX_LEVEL); } @Test @@ -226,12 +199,8 @@ public class BatteryHeaderPreferenceControllerTest { BasePreferenceController.AVAILABLE_UNSEARCHABLE); } - @Test - public void displayPreference_batteryNotPresent_shouldShowHelpMessage() { - ShadowUtils.setIsBatteryPresent(false); - - mController.displayPreference(mPreferenceScreen); - - verify(mController).showHelpMessage(); + private CharSequence formatBatteryPercentageText() { + return TextUtils.expandTemplate(mContext.getText(R.string.battery_header_title_alternate), + NumberFormat.getIntegerInstance().format(BATTERY_LEVEL)); } } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java index cf278f6b2cb..e345ab23a27 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java @@ -23,13 +23,11 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -38,8 +36,6 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.provider.Settings; -import android.view.View; -import android.widget.TextView; import androidx.loader.app.LoaderManager; import androidx.preference.PreferenceScreen; @@ -53,19 +49,14 @@ import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.XmlTestUtils; import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; -import com.android.settingslib.widget.LayoutPreference; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; -import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -79,15 +70,12 @@ import java.util.List; public class PowerUsageSummaryTest { private static final int UID = 123; - private static final int UID_2 = 234; private static final int POWER_MAH = 100; private static final long TIME_SINCE_LAST_FULL_CHARGE_MS = 120 * 60 * 1000; private static final long TIME_SINCE_LAST_FULL_CHARGE_US = TIME_SINCE_LAST_FULL_CHARGE_MS * 1000; private static final long USAGE_TIME_MS = 65 * 60 * 1000; private static final double TOTAL_POWER = 200; - private static final String NEW_ML_EST_SUFFIX = "(New ML est)"; - private static final String OLD_EST_SUFFIX = "(Old est)"; private static Intent sAdditionalBatteryInfoIntent; @BeforeClass @@ -101,12 +89,6 @@ public class PowerUsageSummaryTest { private BatterySipper mScreenBatterySipper; @Mock private BatterySipper mCellBatterySipper; - @Mock - private LayoutPreference mBatteryLayoutPref; - @Mock - private TextView mBatteryPercentText; - @Mock - private TextView mSummary1; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private BatteryStatsHelper mBatteryHelper; @Mock @@ -114,8 +96,6 @@ public class PowerUsageSummaryTest { @Mock private LoaderManager mLoaderManager; @Mock - private BatteryInfo mBatteryInfo; - @Mock private ContentResolver mContentResolver; @Mock private BatteryBroadcastReceiver mBatteryBroadcastReceiver; @@ -128,8 +108,6 @@ public class PowerUsageSummaryTest { private Context mRealContext; private TestFragment mFragment; private FakeFeatureFactory mFeatureFactory; - private BatteryMeterView mBatteryMeterView; - private Intent mIntent; @Before public void setUp() { @@ -139,8 +117,6 @@ public class PowerUsageSummaryTest { mFeatureFactory = FakeFeatureFactory.setupForTest(); mFragment = spy(new TestFragment(mRealContext)); mFragment.initFeatureProvider(); - mBatteryMeterView = new BatteryMeterView(mRealContext); - mBatteryMeterView.mDrawable = new BatteryMeterView.BatteryMeterDrawable(mRealContext, 0); doNothing().when(mFragment).restartBatteryStatsLoader(anyInt()); doReturn(mock(LoaderManager.class)).when(mFragment).getLoaderManager(); @@ -158,12 +134,6 @@ public class PowerUsageSummaryTest { mCellBatterySipper.drainType = BatterySipper.DrainType.CELL; mCellBatterySipper.totalPowerMah = POWER_MAH; - when(mBatteryLayoutPref.findViewById(R.id.summary1)).thenReturn(mSummary1); - when(mBatteryLayoutPref.findViewById(R.id.battery_percent)).thenReturn(mBatteryPercentText); - when(mBatteryLayoutPref.findViewById(R.id.battery_header_icon)) - .thenReturn(mBatteryMeterView); - mFragment.setBatteryLayoutPreference(mBatteryLayoutPref); - mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN; mScreenBatterySipper.usageTimeMs = USAGE_TIME_MS; @@ -206,51 +176,6 @@ public class PowerUsageSummaryTest { .restartLoader(eq(PowerUsageSummary.BATTERY_TIP_LOADER), eq(Bundle.EMPTY), any()); } - @Test - public void showBothEstimates_summariesAreBothModified() { - when(mFeatureFactory.powerUsageFeatureProvider.isEnhancedBatteryPredictionEnabled(any())) - .thenReturn(true); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) { - return mRealContext.getString( - R.string.power_usage_old_debug, invocation.getArguments()[0]); - } - }).when(mFeatureFactory.powerUsageFeatureProvider).getOldEstimateDebugString(any()); - doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocation) { - return mRealContext.getString( - R.string.power_usage_enhanced_debug, invocation.getArguments()[0]); - } - }).when(mFeatureFactory.powerUsageFeatureProvider).getEnhancedEstimateDebugString(any()); - - doReturn(new TextView(mRealContext)).when(mBatteryLayoutPref).findViewById(R.id.summary1); - mFragment.onLongClick(new View(mRealContext)); - TextView summary1 = mFragment.mBatteryLayoutPref.findViewById(R.id.summary1); - Robolectric.flushBackgroundThreadScheduler(); - assertThat(summary1.getText().toString()).contains(NEW_ML_EST_SUFFIX); - assertThat(summary1.getText().toString()).contains(OLD_EST_SUFFIX); - } - - @Test - public void debugMode() { - doReturn(true).when(mFeatureFactory.powerUsageFeatureProvider).isEstimateDebugEnabled(); - - mFragment.restartBatteryInfoLoader(); - ArgumentCaptor listener = ArgumentCaptor.forClass( - View.OnLongClickListener.class); - verify(mSummary1).setOnLongClickListener(listener.capture()); - - // Calling the listener should disable it. - listener.getValue().onLongClick(mSummary1); - verify(mSummary1).setOnLongClickListener(null); - - // Restarting the loader should reset the listener. - mFragment.restartBatteryInfoLoader(); - verify(mSummary1, times(2)).setOnLongClickListener(any(View.OnLongClickListener.class)); - } - @Test public void refreshUi_deviceRotate_doNotUpdateBatteryTip() { mFragment.mBatteryTipPreferenceController = mock(BatteryTipPreferenceController.class); @@ -330,23 +255,5 @@ public class PowerUsageSummaryTest { // Override it so we can access this method in test return super.getContentResolver(); } - - @Override - void showBothEstimates() { - List fakeBatteryInfo = new ArrayList<>(2); - BatteryInfo info1 = new BatteryInfo(); - info1.batteryLevel = 10; - info1.remainingTimeUs = 10000; - info1.discharging = true; - - BatteryInfo info2 = new BatteryInfo(); - info2.batteryLevel = 10; - info2.remainingTimeUs = 10000; - info2.discharging = true; - - fakeBatteryInfo.add(info1); - fakeBatteryInfo.add(info2); - updateViews(fakeBatteryInfo); - } } }