Merge "Use ICU for formatting in DateUtils.formatDuration"

This commit is contained in:
Roozbeh Pournader
2016-12-15 21:59:43 +00:00
committed by Android (Google) Code Review
2 changed files with 71 additions and 9 deletions

View File

@@ -19,6 +19,10 @@ package android.text.format;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.icu.text.MeasureFormat;
import android.icu.text.MeasureFormat.FormatWidth;
import android.icu.util.Measure;
import android.icu.util.MeasureUnit;
import com.android.internal.R;
@@ -351,26 +355,54 @@ public class DateUtils
}
/**
* Return given duration in a human-friendly format. For example, "4
* minutes" or "1 second". Returns only largest meaningful unit of time,
* Returns the given duration in a human-friendly format. For example,
* "4 minutes" or "1 second". Returns only the largest meaningful unit of time,
* from seconds up to hours.
*
* @hide
*/
public static CharSequence formatDuration(long millis) {
final Resources res = Resources.getSystem();
return formatDuration(millis, LENGTH_LONG);
}
/**
* Returns the given duration in a human-friendly format. For example,
* "4 minutes" or "1 second". Returns only the largest meaningful unit of time,
* from seconds up to hours.
* <p>
* You can use abbrev to specify a preference for abbreviations (but note that some
* locales may not have abbreviations). Use LENGTH_LONG for the full spelling (e.g. "2 hours"),
* LENGTH_SHORT for the abbreviated spelling if available (e.g. "2 hr"), and LENGTH_SHORTEST for
* the briefest form available (e.g. "2h").
* @hide
*/
public static CharSequence formatDuration(long millis, int abbrev) {
final FormatWidth width;
switch (abbrev) {
case LENGTH_LONG:
width = FormatWidth.WIDE;
break;
case LENGTH_SHORT:
case LENGTH_SHORTER:
case LENGTH_MEDIUM:
width = FormatWidth.SHORT;
break;
case LENGTH_SHORTEST:
width = FormatWidth.NARROW;
break;
default:
width = FormatWidth.WIDE;
}
final MeasureFormat formatter = MeasureFormat.getInstance(Locale.getDefault(), width);
if (millis >= HOUR_IN_MILLIS) {
final int hours = (int) ((millis + 1800000) / HOUR_IN_MILLIS);
return res.getQuantityString(
com.android.internal.R.plurals.duration_hours, hours, hours);
return formatter.format(new Measure(hours, MeasureUnit.HOUR));
} else if (millis >= MINUTE_IN_MILLIS) {
final int minutes = (int) ((millis + 30000) / MINUTE_IN_MILLIS);
return res.getQuantityString(
com.android.internal.R.plurals.duration_minutes, minutes, minutes);
return formatter.format(new Measure(minutes, MeasureUnit.MINUTE));
} else {
final int seconds = (int) ((millis + 500) / SECOND_IN_MILLIS);
return res.getQuantityString(
com.android.internal.R.plurals.duration_seconds, seconds, seconds);
return formatter.format(new Measure(seconds, MeasureUnit.SECOND));
}
}

View File

@@ -61,6 +61,18 @@ public class DateUtilsTest extends TestCase {
assertEquals("1 second", DateUtils.formatDuration(500));
assertEquals("1 second", DateUtils.formatDuration(1000));
assertEquals("2 seconds", DateUtils.formatDuration(1500));
assertEquals("0 seconds", DateUtils.formatDuration(0, DateUtils.LENGTH_LONG));
assertEquals("1 second", DateUtils.formatDuration(1000, DateUtils.LENGTH_LONG));
assertEquals("2 seconds", DateUtils.formatDuration(1500, DateUtils.LENGTH_LONG));
assertEquals("0 sec", DateUtils.formatDuration(0, DateUtils.LENGTH_SHORT));
assertEquals("1 sec", DateUtils.formatDuration(1000, DateUtils.LENGTH_SHORT));
assertEquals("2 sec", DateUtils.formatDuration(1500, DateUtils.LENGTH_SHORT));
assertEquals("0s", DateUtils.formatDuration(0, DateUtils.LENGTH_SHORTEST));
assertEquals("1s", DateUtils.formatDuration(1000, DateUtils.LENGTH_SHORTEST));
assertEquals("2s", DateUtils.formatDuration(1500, DateUtils.LENGTH_SHORTEST));
}
@SmallTest
@@ -69,6 +81,15 @@ public class DateUtilsTest extends TestCase {
assertEquals("60 seconds", DateUtils.formatDuration(59500));
assertEquals("1 minute", DateUtils.formatDuration(60000));
assertEquals("2 minutes", DateUtils.formatDuration(120000));
assertEquals("1 minute", DateUtils.formatDuration(60000, DateUtils.LENGTH_LONG));
assertEquals("2 minutes", DateUtils.formatDuration(120000, DateUtils.LENGTH_LONG));
assertEquals("1 min", DateUtils.formatDuration(60000, DateUtils.LENGTH_SHORT));
assertEquals("2 min", DateUtils.formatDuration(120000, DateUtils.LENGTH_SHORT));
assertEquals("1m", DateUtils.formatDuration(60000, DateUtils.LENGTH_SHORTEST));
assertEquals("2m", DateUtils.formatDuration(120000, DateUtils.LENGTH_SHORTEST));
}
@SmallTest
@@ -76,5 +97,14 @@ public class DateUtilsTest extends TestCase {
assertEquals("59 minutes", DateUtils.formatDuration(3540000));
assertEquals("1 hour", DateUtils.formatDuration(3600000));
assertEquals("48 hours", DateUtils.formatDuration(172800000));
assertEquals("1 hour", DateUtils.formatDuration(3600000, DateUtils.LENGTH_LONG));
assertEquals("48 hours", DateUtils.formatDuration(172800000, DateUtils.LENGTH_LONG));
assertEquals("1 hr", DateUtils.formatDuration(3600000, DateUtils.LENGTH_SHORT));
assertEquals("48 hr", DateUtils.formatDuration(172800000, DateUtils.LENGTH_SHORT));
assertEquals("1h", DateUtils.formatDuration(3600000, DateUtils.LENGTH_SHORTEST));
assertEquals("48h", DateUtils.formatDuration(172800000, DateUtils.LENGTH_SHORTEST));
}
}