diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java index 0a70f72518d42..673f2438de8aa 100644 --- a/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java +++ b/packages/SettingsLib/src/com/android/settingslib/utils/PowerUtil.java @@ -41,6 +41,7 @@ public class PowerUtil { private static final long ONE_DAY_MILLIS = TimeUnit.DAYS.toMillis(1); private static final long TWO_DAYS_MILLIS = TimeUnit.DAYS.toMillis(2); private static final long ONE_HOUR_MILLIS = TimeUnit.HOURS.toMillis(1); + private static final long ONE_MIN_MILLIS = TimeUnit.MINUTES.toMillis(1); /** * This method produces the text used in various places throughout the system to describe the @@ -63,7 +64,7 @@ public class PowerUtil { // show a less than 15 min remaining warning if appropriate CharSequence timeString = StringUtil.formatElapsedTime(context, FIFTEEN_MINUTES_MILLIS, - false /* withSeconds */); + false /* withSeconds */, false /* collapseTimeUnit */); return getUnderFifteenString(context, timeString, percentageString); } else if (drainTimeMs >= TWO_DAYS_MILLIS) { // just say more than two day if over 48 hours @@ -151,7 +152,7 @@ public class PowerUtil { final long roundedTimeMs = roundTimeToNearestThreshold(drainTimeMs, ONE_HOUR_MILLIS); CharSequence timeString = StringUtil.formatElapsedTime(context, roundedTimeMs, - false /* withSeconds */); + false /* withSeconds */, true /* collapseTimeUnit */); if (TextUtils.isEmpty(percentageString)) { int id = basedOnUsage @@ -170,7 +171,7 @@ public class PowerUtil { int resId) { final long roundedTimeMs = roundTimeToNearestThreshold(drainTimeMs, ONE_HOUR_MILLIS); CharSequence timeString = StringUtil.formatElapsedTime(context, roundedTimeMs, - false /* withSeconds */); + false /* withSeconds */, false /* collapseTimeUnit */); return context.getString(resId, timeString); } @@ -193,17 +194,18 @@ public class PowerUtil { private static String getRegularTimeRemainingString(Context context, long drainTimeMs, String percentageString, boolean basedOnUsage) { - CharSequence timeString = getDateTimeStringFromMs(context, drainTimeMs); + CharSequence timeString = StringUtil.formatElapsedTime(context, + drainTimeMs, false /* withSeconds */, true /* collapseTimeUnit */); if (TextUtils.isEmpty(percentageString)) { int id = basedOnUsage - ? R.string.power_discharge_by_only_enhanced - : R.string.power_discharge_by_only; + ? R.string.power_remaining_duration_only_enhanced + : R.string.power_remaining_duration_only; return context.getString(id, timeString); } else { int id = basedOnUsage - ? R.string.power_discharge_by_enhanced - : R.string.power_discharge_by; + ? R.string.power_discharging_duration_enhanced + : R.string.power_discharging_duration; return context.getString(id, timeString, percentageString); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java index 83ef4f940ad14..b65637f4c45fa 100644 --- a/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java +++ b/packages/SettingsLib/src/com/android/settingslib/utils/StringUtil.java @@ -40,6 +40,8 @@ public class StringUtil { public static final int SECONDS_PER_HOUR = 60 * 60; public static final int SECONDS_PER_DAY = 24 * 60 * 60; + private static final int LIMITED_TIME_UNIT_COUNT = 2; + /** * Returns elapsed time for the given millis, in the following format: * 2 days, 5 hr, 40 min, 29 sec @@ -47,10 +49,12 @@ public class StringUtil { * @param context the application context * @param millis the elapsed time in milli seconds * @param withSeconds include seconds? + * @param collapseTimeUnit limit the output to top 2 time unit + * e.g 2 days, 5 hr, 40 min, 29 sec will convert to 2 days, 5 hr * @return the formatted elapsed time */ public static CharSequence formatElapsedTime(Context context, double millis, - boolean withSeconds) { + boolean withSeconds, boolean collapseTimeUnit) { SpannableStringBuilder sb = new SpannableStringBuilder(); int seconds = (int) Math.floor(millis / 1000); if (!withSeconds) { @@ -89,6 +93,12 @@ public class StringUtil { // Everything addable was zero, so nothing was added. We add a zero. measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE)); } + + if (collapseTimeUnit && measureList.size() > LIMITED_TIME_UNIT_COUNT) { + // Limit the output to top 2 time unit. + measureList.subList(LIMITED_TIME_UNIT_COUNT, measureList.size()).clear(); + } + final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]); final Locale locale = context.getResources().getConfiguration().locale; diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java index 4b779ac4a7f50..3029736e37e66 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/PowerUtilTest.java @@ -35,10 +35,12 @@ import java.util.regex.Pattern; @RunWith(RobolectricTestRunner.class) public class PowerUtilTest { private static final String TEST_BATTERY_LEVEL_10 = "10%"; + private static final long TEN_SEC_MILLIS = Duration.ofSeconds(10).toMillis(); private static final long SEVENTEEN_MIN_MILLIS = Duration.ofMinutes(17).toMillis(); private static final long FIVE_MINUTES_MILLIS = Duration.ofMinutes(5).toMillis(); private static final long TEN_MINUTES_MILLIS = Duration.ofMinutes(10).toMillis(); private static final long THREE_DAYS_MILLIS = Duration.ofDays(3).toMillis(); + private static final long TEN_HOURS_MILLIS = Duration.ofHours(10).toMillis(); private static final long THIRTY_HOURS_MILLIS = Duration.ofHours(30).toMillis(); private static final String NORMAL_CASE_EXPECTED_PREFIX = "Should last until about"; private static final String ENHANCED_SUFFIX = " based on your usage"; @@ -152,11 +154,40 @@ public class PowerUtilTest { THIRTY_HOURS_MILLIS, TEST_BATTERY_LEVEL_10 /* percentageString */, false /* basedOnUsage */); + String info3 = PowerUtil.getBatteryRemainingStringFormatted(mContext, + THIRTY_HOURS_MILLIS + TEN_MINUTES_MILLIS, + null /* percentageString */, + false /* basedOnUsage */); // We only add special mention for the long string assertThat(info).isEqualTo("About 1 day, 6 hr left based on your usage"); // shortened string should not have extra text assertThat(info2).isEqualTo("About 1 day, 6 hr left (10%)"); + // present 2 time unit at most + assertThat(info3).isEqualTo("About 1 day, 6 hr left"); + } + + @Test + public void testGetBatteryRemainingStringFormatted_lessThanOneDay_usesCorrectString() { + String info = PowerUtil.getBatteryRemainingStringFormatted(mContext, + TEN_HOURS_MILLIS, + null /* percentageString */, + true /* basedOnUsage */); + String info2 = PowerUtil.getBatteryRemainingStringFormatted(mContext, + TEN_HOURS_MILLIS, + TEST_BATTERY_LEVEL_10 /* percentageString */, + false /* basedOnUsage */); + String info3 = PowerUtil.getBatteryRemainingStringFormatted(mContext, + TEN_HOURS_MILLIS + TEN_MINUTES_MILLIS + TEN_SEC_MILLIS, + null /* percentageString */, + false /* basedOnUsage */); + + // We only add special mention for the long string + assertThat(info).isEqualTo("About 10 hr left based on your usage"); + // shortened string should not have extra text + assertThat(info2).isEqualTo("About 10 hr left (10%)"); + // present 2 time unit at most + assertThat(info3).isEqualTo("About 10 hr, 10 min left"); } @Test diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java index b503972c7bc25..6a1d3262076a9 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/StringUtilTest.java @@ -46,7 +46,7 @@ public class StringUtilTest { final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS; final String expectedTime = "5 min, 30 sec"; - assertThat(StringUtil.formatElapsedTime(mContext, testMillis, true).toString()) + assertThat(StringUtil.formatElapsedTime(mContext, testMillis, true, false).toString()) .isEqualTo(expectedTime); } @@ -55,7 +55,7 @@ public class StringUtilTest { final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS; final String expectedTime = "6 min"; - assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString()) + assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false, false).toString()) .isEqualTo(expectedTime); } @@ -65,7 +65,17 @@ public class StringUtilTest { + 4 * DateUtils.HOUR_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS; final String expectedTime = "2 days, 4 hr, 15 min"; - assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString()) + assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false, false).toString()) + .isEqualTo(expectedTime); + } + + @Test + public void testFormatElapsedTime_TimeMoreThanOneDayAndCollapseTimeUnit_ShowCorrectly() { + final double testMillis = 2 * DateUtils.DAY_IN_MILLIS + + 4 * DateUtils.HOUR_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS; + final String expectedTime = "2 days, 4 hr"; + + assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false, true).toString()) .isEqualTo(expectedTime); } @@ -74,7 +84,7 @@ public class StringUtilTest { final double testMillis = 2 * DateUtils.DAY_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS; final String expectedTime = "2 days, 15 min"; - assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString()) + assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false, false).toString()) .isEqualTo(expectedTime); } @@ -83,7 +93,7 @@ public class StringUtilTest { final double testMillis = 0; final String expectedTime = "0 sec"; - assertThat(StringUtil.formatElapsedTime(mContext, testMillis, true).toString()) + assertThat(StringUtil.formatElapsedTime(mContext, testMillis, true, false).toString()) .isEqualTo(expectedTime); } @@ -92,7 +102,7 @@ public class StringUtilTest { final double testMillis = 0; final String expectedTime = "0 min"; - assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false).toString()) + assertThat(StringUtil.formatElapsedTime(mContext, testMillis, false, false).toString()) .isEqualTo(expectedTime); } @@ -101,7 +111,7 @@ public class StringUtilTest { final double testMillis = 15 * DateUtils.MINUTE_IN_MILLIS; final CharSequence charSequence = - StringUtil.formatElapsedTime(mContext, testMillis, false); + StringUtil.formatElapsedTime(mContext, testMillis, false, false); assertThat(charSequence).isInstanceOf(SpannableStringBuilder.class); final SpannableStringBuilder expectedString = (SpannableStringBuilder) charSequence;