diff --git a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java index 26b1e3fe8..c8b223ab1 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/util/UiUtils.java @@ -171,7 +171,7 @@ public class UiUtils { /** * Returns the given duration in a human-friendly format. For example, * "7 days" or "1 hour". Returns only the largest meaningful unit of time, - * from days up to hours. + * from days up to minutes. */ public static String formatDuration(Context ctx, long millis) { Resources r = ctx.getResources(); @@ -182,11 +182,20 @@ public class UiUtils { r.getQuantityString(R.plurals.duration_days, days, days); if (rest < HOUR_IN_MILLIS / 2) return dayStr; else return dayStr + " " + formatDuration(ctx, rest); + } else if (millis >= HOUR_IN_MILLIS) { + int hours = (int) (millis / HOUR_IN_MILLIS); + int rest = (int) (millis % HOUR_IN_MILLIS); + String hourStr = + r.getQuantityString(R.plurals.duration_hours, hours, hours); + if (rest < MINUTE_IN_MILLIS / 2) return hourStr; + else return hourStr + " " + formatDuration(ctx, rest); } else { - int hours = (int) ((millis + HOUR_IN_MILLIS / 2) / HOUR_IN_MILLIS); - // anything less than one hour is shown as one hour - if (hours < 1) hours = 1; - return r.getQuantityString(R.plurals.duration_hours, hours, hours); + int minutes = + (int) ((millis + MINUTE_IN_MILLIS / 2) / MINUTE_IN_MILLIS); + // anything less than one minute is shown as one minute + if (minutes < 1) minutes = 1; + return r.getQuantityString(R.plurals.duration_minutes, minutes, + minutes); } } diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index fea7e7af0..698320fc5 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -174,6 +174,10 @@ Your messages will not disappear. %1$s %1$s\'s messages will disappear after %2$s. %3$s + + %d minute + %d minutes + %d hour %d hours diff --git a/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java b/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java index eb056cf56..7d282aae9 100644 --- a/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java +++ b/briar-android/src/test/java/org/briarproject/briar/android/util/UiUtilsFormatDurationTest.java @@ -12,12 +12,14 @@ import org.junit.Test; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.briarproject.briar.android.util.UiUtils.formatDuration; public class UiUtilsFormatDurationTest extends BrambleMockTestCase { private final Context ctx; private final Resources r; + private final int strMinutes = R.plurals.duration_minutes; private final int strHours = R.plurals.duration_hours; private final int strDays = R.plurals.duration_days; @@ -27,6 +29,12 @@ public class UiUtilsFormatDurationTest extends BrambleMockTestCase { r = context.mock(Resources.class); } + @Test + public void testOneMinute() { + expectMinuteString(1); + formatDuration(ctx, MINUTES.toMillis(1)); + } + @Test public void testOneHour() { expectHourString(1); @@ -39,12 +47,44 @@ public class UiUtilsFormatDurationTest extends BrambleMockTestCase { formatDuration(ctx, DAYS.toMillis(1)); } + @Test + public void test10Seconds() { + // capped to 1min + expectMinuteString(1); + formatDuration(ctx, SECONDS.toMillis(10)); + } + + @Test + public void test100Seconds() { + expectMinuteString(2); + formatDuration(ctx, SECONDS.toMillis(100)); + } + + @Test + public void test2Minutes() { + expectMinuteString(2); + formatDuration(ctx, MINUTES.toMillis(2)); + } + @Test public void test10Minutes() { - expectHourString(1); + expectMinuteString(10); formatDuration(ctx, MINUTES.toMillis(10)); } + @Test + public void test130Minutes() { + expectHourString(2); + expectMinuteString(10); + formatDuration(ctx, MINUTES.toMillis(130)); + } + + @Test + public void test13Hours() { + expectHourString(13); + formatDuration(ctx, HOURS.toMillis(13)); + } + @Test public void testSevenDays() { expectDayString(7); @@ -67,7 +107,7 @@ public class UiUtilsFormatDurationTest extends BrambleMockTestCase { @Test public void testSevenDays40Minutes() { expectDayString(7); - expectHourString(1); + expectMinuteString(40); formatDuration(ctx, DAYS.toMillis(7) + MINUTES.toMillis(40)); } @@ -92,6 +132,23 @@ public class UiUtilsFormatDurationTest extends BrambleMockTestCase { formatDuration(ctx, DAYS.toMillis(2) + HOURS.toMillis(13)); } + @Test + public void test7Days23Hours55Minutes() { + expectDayString(7); + expectHourString(23); + expectMinuteString(55); + formatDuration(ctx, + DAYS.toMillis(7) + HOURS.toMillis(23) + MINUTES.toMillis(55)); + } + + private void expectMinuteString(int minutes) { + context.checking(new Expectations() {{ + oneOf(ctx).getResources(); + will(returnValue(r)); + oneOf(r).getQuantityString(strMinutes, minutes, minutes); + }}); + } + private void expectHourString(int hours) { context.checking(new Expectations() {{ oneOf(ctx).getResources();