diff --git a/res/values/strings.xml b/res/values/strings.xml index f15759ef49e..670eb7817f6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4164,27 +4164,6 @@ Always allow %1$s to create widgets and access their data - - %1$dd %2$dh %3$dm %4$ds - - - %1$dh %2$dm %3$ds - - - %1$dm %2$ds - - - %1$ds - - - %1$dd %2$dh %3$dm - - - %1$dh %2$dm - - - %1$dm - Usage statistics diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 15e4eb3fbcc..d1deaafd963 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -51,6 +51,9 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.hardware.fingerprint.FingerprintManager; +import android.icu.text.MeasureFormat; +import android.icu.util.Measure; +import android.icu.util.MeasureUnit; import android.net.ConnectivityManager; import android.net.LinkProperties; import android.net.Network; @@ -821,33 +824,36 @@ public final class Utils extends com.android.settingslib.Utils { minutes = seconds / SECONDS_PER_MINUTE; seconds -= minutes * SECONDS_PER_MINUTE; } - if (withSeconds) { - if (days > 0) { - sb.append(context.getString(R.string.battery_history_days, - days, hours, minutes, seconds)); - } else if (hours > 0) { - sb.append(context.getString(R.string.battery_history_hours, - hours, minutes, seconds)); - } else if (minutes > 0) { - sb.append(context.getString(R.string.battery_history_minutes, minutes, seconds)); - } else { - sb.append(context.getString(R.string.battery_history_seconds, seconds)); - } - } else { - if (days > 0) { - sb.append(context.getString(R.string.battery_history_days_no_seconds, - days, hours, minutes)); - } else if (hours > 0) { - sb.append(context.getString(R.string.battery_history_hours_no_seconds, - hours, minutes)); - } else { - sb.append(context.getString(R.string.battery_history_minutes_no_seconds, minutes)); - // Add ttsSpan if it only have minute value, because it will be read as "meters" - TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes) - .setUnit("minute").build(); - sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } + final ArrayList measureList = new ArrayList(4); + if (days > 0) { + measureList.add(new Measure(days, MeasureUnit.DAY)); + } + if (hours > 0) { + measureList.add(new Measure(hours, MeasureUnit.HOUR)); + } + if (minutes > 0) { + measureList.add(new Measure(minutes, MeasureUnit.MINUTE)); + } + if (withSeconds && seconds > 0) { + measureList.add(new Measure(seconds, MeasureUnit.SECOND)); + } + if (measureList.size() == 0) { + // Everything addable was zero, so nothing was added. We add a zero. + measureList.add(new Measure(0, withSeconds ? MeasureUnit.SECOND : MeasureUnit.MINUTE)); + } + final Measure[] measureArray = measureList.toArray(new Measure[measureList.size()]); + + final Locale locale = context.getResources().getConfiguration().locale; + final MeasureFormat measureFormat = MeasureFormat.getInstance( + locale, MeasureFormat.FormatWidth.NARROW); + sb.append(measureFormat.formatMeasures(measureArray)); + + if (measureArray.length == 1 && MeasureUnit.MINUTE.equals(measureArray[0].getUnit())) { + // Add ttsSpan if it only have minute value, because it will be read as "meters" + final TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(minutes) + .setUnit("minute").build(); + sb.setSpan(ttsSpan, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } return sb; diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index 93ab4063c48..d85464d1e08 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -94,8 +94,8 @@ public class UtilsTest { @Test public void testFormatElapsedTime_WithSeconds_ShowSeconds() { - final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS; - final String expectedTime = "5m 0s"; + final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS; + final String expectedTime = "5m 30s"; assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo( expectedTime); @@ -103,8 +103,8 @@ public class UtilsTest { @Test public void testFormatElapsedTime_NoSeconds_DoNotShowSeconds() { - final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS; - final String expectedTime = "5m"; + final double testMillis = 5 * DateUtils.MINUTE_IN_MILLIS + 30 * DateUtils.SECOND_IN_MILLIS; + final String expectedTime = "6m"; assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo( expectedTime); @@ -120,6 +120,33 @@ public class UtilsTest { expectedTime); } + @Test + public void testFormatElapsedTime_ZeroFieldsInTheMiddleDontShow() { + final double testMillis = 2 * DateUtils.DAY_IN_MILLIS + 15 * DateUtils.MINUTE_IN_MILLIS; + final String expectedTime = "2d 15m"; + + assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo( + expectedTime); + } + + @Test + public void testFormatElapsedTime_FormatZero_WithSeconds() { + final double testMillis = 0; + final String expectedTime = "0s"; + + assertThat(Utils.formatElapsedTime(mContext, testMillis, true).toString()).isEqualTo( + expectedTime); + } + + @Test + public void testFormatElapsedTime_FormatZero_NoSeconds() { + final double testMillis = 0; + final String expectedTime = "0m"; + + assertThat(Utils.formatElapsedTime(mContext, testMillis, false).toString()).isEqualTo( + expectedTime); + } + @Test public void testFormatElapsedTime_onlyContainsMinute_hasTtsSpan() { final double testMillis = 15 * DateUtils.MINUTE_IN_MILLIS;