diff --git a/res/values/strings.xml b/res/values/strings.xml index 8cad24e3765..a2119fb18f3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6325,38 +6325,52 @@ Manage battery usage + + ^1 total • ^2 background\nfrom last full charge - ^1 total • ^2 background\nfor past 24 hr + ^1 total • ^2 background\nfor past 24 hr ^1 total • ^2 background\nfor ^3 - - Total less than a minute for past 24 hr + + Total less than a minute from last full charge + + Total less than a minute for past 24 hr Total less than a minute for ^1 - - Background less than a minute for past 24 hr + + Background less than a minute from last full charge + + Background less than a minute for past 24 hr Background less than a minute for ^1 + + ^1 total from last full charge - ^1 total for past 24 hr + ^1 total for past 24 hr ^1 total for ^2 + + ^1 background from last full charge - ^1 background for past 24 hr + ^1 background for past 24 hr ^1 background for ^2 + + ^1 total • background less than a minute\nfrom last full charge - ^1 total • background less than a minute\nfor past 24 hr + ^1 total • background less than a minute\nfor past 24 hr ^1 total • background less than a minute\nfor ^2 + + No usage from last full charge - No usage for past 24 hr + No usage for past 24 hr Battery left estimate is based on your device usage diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 7c2f0523115..2b8328842e9 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -44,6 +44,7 @@ import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; @@ -436,13 +437,18 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements long foregroundTimeMs, long backgroundTimeMs, String slotTime) { final long totalTimeMs = foregroundTimeMs + backgroundTimeMs; final CharSequence usageTimeSummary; + final PowerUsageFeatureProvider powerFeatureProvider = + FeatureFactory.getFactory(getContext()).getPowerUsageFeatureProvider(getContext()); if (totalTimeMs == 0) { - usageTimeSummary = getText(R.string.battery_not_usage); + usageTimeSummary = getText(powerFeatureProvider.isChartGraphEnabled(getContext()) + ? R.string.battery_not_usage_24hr : R.string.battery_not_usage); } else if (slotTime == null) { - // Shows summary text with past 24 hr if slot time is null. - usageTimeSummary = - getAppPast24HrActiveSummary(foregroundTimeMs, backgroundTimeMs, totalTimeMs); + // Shows summary text with past 24 hr or full charge if slot time is null. + usageTimeSummary = powerFeatureProvider.isChartGraphEnabled(getContext()) + ? getAppPast24HrActiveSummary(foregroundTimeMs, backgroundTimeMs, totalTimeMs) + : getAppFullChargeActiveSummary( + foregroundTimeMs, backgroundTimeMs, totalTimeMs); } else { // Shows summary text with slot time. usageTimeSummary = getAppActiveSummaryWithSlotTime( @@ -451,7 +457,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements return usageTimeSummary; } - private CharSequence getAppPast24HrActiveSummary( + private CharSequence getAppFullChargeActiveSummary( long foregroundTimeMs, long backgroundTimeMs, long totalTimeMs) { // Shows background summary only if we don't have foreground usage time. if (foregroundTimeMs == 0 && backgroundTimeMs != 0) { @@ -494,6 +500,49 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements } } + private CharSequence getAppPast24HrActiveSummary( + long foregroundTimeMs, long backgroundTimeMs, long totalTimeMs) { + // Shows background summary only if we don't have foreground usage time. + if (foregroundTimeMs == 0 && backgroundTimeMs != 0) { + return backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS + ? getText(R.string.battery_bg_usage_less_minute_24hr) + : TextUtils.expandTemplate(getText(R.string.battery_bg_usage_24hr), + StringUtil.formatElapsedTime( + getContext(), + backgroundTimeMs, + /* withSeconds */ false, + /* collapseTimeUnit */ false)); + // Shows total usage summary only if total usage time is small. + } else if (totalTimeMs < DateUtils.MINUTE_IN_MILLIS) { + return getText(R.string.battery_total_usage_less_minute_24hr); + // Shows different total usage summary when background usage time is small. + } else if (backgroundTimeMs < DateUtils.MINUTE_IN_MILLIS) { + return TextUtils.expandTemplate( + getText(backgroundTimeMs == 0 + ? R.string.battery_total_usage_24hr + : R.string.battery_total_usage_and_bg_less_minute_usage_24hr), + StringUtil.formatElapsedTime( + getContext(), + totalTimeMs, + /* withSeconds */ false, + /* collapseTimeUnit */ false)); + // Shows default summary. + } else { + return TextUtils.expandTemplate( + getText(R.string.battery_total_and_bg_usage_24hr), + StringUtil.formatElapsedTime( + getContext(), + totalTimeMs, + /* withSeconds */ false, + /* collapseTimeUnit */ false), + StringUtil.formatElapsedTime( + getContext(), + backgroundTimeMs, + /* withSeconds */ false, + /* collapseTimeUnit */ false)); + } + } + private CharSequence getAppActiveSummaryWithSlotTime( long foregroundTimeMs, long backgroundTimeMs, long totalTimeMs, String slotTime) { // Shows background summary only if we don't have foreground usage time. diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index 00c71dff8f2..e5ca4e3f8be 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -128,6 +128,7 @@ public class AdvancedPowerUsageDetailTest { private RadioButtonPreference mUnrestrictedPreference; private AdvancedPowerUsageDetail mFragment; private SettingsActivity mTestActivity; + private FakeFeatureFactory mFeatureFactory; @Before public void setUp() { @@ -135,7 +136,7 @@ public class AdvancedPowerUsageDetailTest { mContext = spy(RuntimeEnvironment.application); when(mContext.getPackageName()).thenReturn("foo"); - FakeFeatureFactory.setupForTest(); + mFeatureFactory = FakeFeatureFactory.setupForTest(); mFragment = spy(new AdvancedPowerUsageDetail()); doReturn(mContext).when(mFragment).getContext(); @@ -144,6 +145,8 @@ public class AdvancedPowerUsageDetailTest { doReturn(APP_LABEL).when(mBundle).getString(nullable(String.class)); when(mFragment.getArguments()).thenReturn(mBundle); doReturn(mLoaderManager).when(mFragment).getLoaderManager(); + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(true); ShadowEntityHeaderController.setUseMock(mEntityHeaderController); doReturn(mEntityHeaderController).when(mEntityHeaderController) @@ -269,6 +272,144 @@ public class AdvancedPowerUsageDetailTest { verify(mEntityHeaderController).setIsInstantApp(true); } + @Test + public void testInitHeader_noUsageTimeAndGraphDisabled_hasCorrectSummary() { + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(false); + + Bundle bundle = new Bundle(2); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, /* value */ 0); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, /* value */ 0); + when(mFragment.getArguments()).thenReturn(bundle); + + mFragment.initHeader(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); + verify(mEntityHeaderController).setSummary(captor.capture()); + assertThat(captor.getValue().toString()) + .isEqualTo("No usage from last full charge"); + } + + @Test + public void testInitHeader_bgTwoMinFgZeroAndGraphDisabled_hasCorrectSummary() { + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(false); + + final long backgroundTimeTwoMinutes = 120000; + final long foregroundTimeZero = 0; + Bundle bundle = new Bundle(2); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeTwoMinutes); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero); + when(mFragment.getArguments()).thenReturn(bundle); + + mFragment.initHeader(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); + verify(mEntityHeaderController).setSummary(captor.capture()); + assertThat(captor.getValue().toString()) + .isEqualTo("2 min background from last full charge"); + } + + @Test + public void testInitHeader_bgLessThanAMinFgZeroAndGraphDisabled_hasCorrectSummary() { + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(false); + + final long backgroundTimeLessThanAMinute = 59999; + final long foregroundTimeZero = 0; + Bundle bundle = new Bundle(2); + bundle.putLong( + AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanAMinute); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeZero); + when(mFragment.getArguments()).thenReturn(bundle); + + mFragment.initHeader(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); + verify(mEntityHeaderController).setSummary(captor.capture()); + assertThat(captor.getValue().toString()) + .isEqualTo("Background less than a minute from last full charge"); + } + + @Test + public void testInitHeader_totalUsageLessThanAMinAndGraphDisabled_hasCorrectSummary() { + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(false); + + final long backgroundTimeLessThanHalfMinute = 20000; + final long foregroundTimeLessThanHalfMinute = 20000; + Bundle bundle = new Bundle(2); + bundle.putLong( + AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeLessThanHalfMinute); + bundle.putLong( + AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeLessThanHalfMinute); + when(mFragment.getArguments()).thenReturn(bundle); + + mFragment.initHeader(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); + verify(mEntityHeaderController).setSummary(captor.capture()); + assertThat(captor.getValue().toString()) + .isEqualTo("Total less than a minute from last full charge"); + } + + @Test + public void testInitHeader_TotalAMinutesBgLessThanAMinAndGraphDisabled_hasCorrectSummary() { + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(false); + + final long backgroundTimeZero = 59999; + final long foregroundTimeTwoMinutes = 1; + Bundle bundle = new Bundle(2); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeZero); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes); + when(mFragment.getArguments()).thenReturn(bundle); + + mFragment.initHeader(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); + verify(mEntityHeaderController).setSummary(captor.capture()); + assertThat(captor.getValue().toString()) + .isEqualTo("1 min total • background less than a minute\nfrom last full charge"); + } + + @Test + public void testInitHeader_TotalAMinBackgroundZeroAndGraphDisabled_hasCorrectSummary() { + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(false); + final long backgroundTimeZero = 0; + final long foregroundTimeAMinutes = 60000; + Bundle bundle = new Bundle(2); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeZero); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeAMinutes); + when(mFragment.getArguments()).thenReturn(bundle); + + mFragment.initHeader(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); + verify(mEntityHeaderController).setSummary(captor.capture()); + assertThat(captor.getValue().toString()) + .isEqualTo("1 min total from last full charge"); + } + + @Test + public void testInitHeader_fgTwoMinBgFourMinAndGraphDisabled_hasCorrectSummary() { + when(mFeatureFactory.powerUsageFeatureProvider.isChartGraphEnabled(mContext)) + .thenReturn(false); + final long backgroundTimeFourMinute = 240000; + final long foregroundTimeTwoMinutes = 120000; + Bundle bundle = new Bundle(2); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_BACKGROUND_TIME, backgroundTimeFourMinute); + bundle.putLong(AdvancedPowerUsageDetail.EXTRA_FOREGROUND_TIME, foregroundTimeTwoMinutes); + when(mFragment.getArguments()).thenReturn(bundle); + mFragment.initHeader(); + + ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); + verify(mEntityHeaderController).setSummary(captor.capture()); + assertThat(captor.getValue().toString()) + .isEqualTo("6 min total • 4 min background\nfrom last full charge"); + } + @Test public void testInitHeader_noUsageTime_hasCorrectSummary() { Bundle bundle = new Bundle(2); @@ -352,7 +493,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("1 min total • background less than a minute for past 24 hr"); + .isEqualTo("1 min total • background less than a minute\nfor past 24 hr"); } @Test @@ -385,7 +526,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("6 min total • 4 min background for past 24 hr"); + .isEqualTo("6 min total • 4 min background\nfor past 24 hr"); } @Test @@ -423,7 +564,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("1 min total • background less than a minute for 12 am-2 am"); + .isEqualTo("1 min total • background less than a minute\nfor 12 am-2 am"); } @Test @@ -458,7 +599,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("6 min total • 4 min background for 12 am-2 am"); + .isEqualTo("6 min total • 4 min background\nfor 12 am-2 am"); } @Test