diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java
index b08114e..eb92521 100644
--- a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java
+++ b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java
@@ -26,6 +26,7 @@ import com.philliphsu.clock2.BaseActivity;
import com.philliphsu.clock2.DaysOfWeek;
import com.philliphsu.clock2.R;
import com.philliphsu.clock2.model.AlarmsRepository;
+import com.philliphsu.clock2.util.DurationUtils;
import java.util.Date;
@@ -421,6 +422,9 @@ public class EditAlarmActivity extends BaseActivity implements
@Override
public void scheduleAlarm(Alarm alarm) {
AlarmUtils.scheduleAlarm(this, alarm);
+ String message = getString(R.string.alarm_set_for,
+ DurationUtils.toString(this, alarm.ringsIn(), false /*abbreviate?*/));
+ Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
@Override
diff --git a/app/src/main/java/com/philliphsu/clock2/util/DurationUtils.java b/app/src/main/java/com/philliphsu/clock2/util/DurationUtils.java
new file mode 100644
index 0000000..6976add
--- /dev/null
+++ b/app/src/main/java/com/philliphsu/clock2/util/DurationUtils.java
@@ -0,0 +1,125 @@
+package com.philliphsu.clock2.util;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.StringRes;
+
+import com.philliphsu.clock2.R;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by Phillip Hsu on 6/6/2016.
+ */
+public class DurationUtils {
+
+ public static String toString(Context context, long millis, boolean abbreviate) {
+ long[] fields = breakdown(millis);
+ long numHours = fields[0];
+ long numMins = fields[1];
+ long numSecs = fields[2]; // only considered for rounding of minutes
+ if (numSecs >= 31) {
+ numMins++;
+ }
+
+ @StringRes int res;
+
+ if (abbreviate) {
+ if (numHours == 0) {
+ if (numMins == 0) {
+ res = R.string.abbrev_less_than_one_minute; // TODO: verify formatArgs can be passed in but are ignored
+ } else {
+ res = R.string.abbrev_minutes;
+ }
+ } else {
+ if (numMins == 0) {
+ res = R.string.abbrev_hours;
+ } else {
+ res = R.string.abbrev_hours_and_minutes;
+ }
+ }
+ } else {
+ if (numHours == 0) {
+ if (numMins == 0) {
+ res = R.string.less_than_one_minute; // TODO: verify formatArgs can be passed in but are ignored
+ } else if (numMins == 1) {
+ res = R.string.minute;
+ } else {
+ res = R.string.minutes;
+ }
+ } else {
+ if (numHours == 1) {
+ if (numMins == 0) {
+ res = R.string.hour;
+ } else if (numMins == 1) {
+ res = R.string.hour_and_minute;
+ } else {
+ res = R.string.hour_and_minutes;
+ }
+ } else {
+ if (numMins == 0) {
+ res = R.string.hours;
+ } else if (numMins == 1) {
+ res = R.string.hours_and_minute;
+ } else {
+ res = R.string.hours_and_minutes;
+ }
+ }
+ }
+ }
+
+ return context.getString(res, numHours, numMins);
+ }
+
+ /**
+ * Equivalent to
+ * {@link #breakdown(long, TimeUnit, boolean)
+ * breakdown(millis, TimeUnit.MILLISECONDS, true)},
+ * which rounds milliseconds. Callers who use this are probably not
+ * concerned about displaying the milliseconds value.
+ */
+ public static long[] breakdown(long millis) {
+ return breakdown(millis, TimeUnit.MILLISECONDS, true);
+ }
+
+ /**
+ * Equivalent to
+ * {@link #breakdown(long, TimeUnit, boolean) breakdown(t, unit, false)},
+ * i.e. does not round milliseconds.
+ */
+ public static long[] breakdown(long t, @NonNull TimeUnit unit) {
+ return breakdown(t, unit, false);
+ }
+
+ /**
+ * Returns a breakdown of a given time into its values
+ * in hours, minutes, seconds and milliseconds.
+ * @param t the time to break down
+ * @param unit the {@link TimeUnit} the given time is expressed in
+ * @param roundMillis whether rounding of milliseconds is desired
+ * @return a {@code long[]} of the values in hours, minutes, seconds
+ * and milliseconds in that order
+ */
+ public static long[] breakdown(long t, @NonNull TimeUnit unit, boolean roundMillis) {
+ long hours = unit.toHours(t);
+ long minutes = unit.toMinutes(t) % 60;
+ long seconds = unit.toSeconds(t) % 60;
+ long msecs = unit.toMillis(t) % 1000;
+ if (roundMillis) {
+ if (msecs >= 500) {
+ seconds++;
+ msecs = 0;
+ if (seconds == 60) {
+ minutes++;
+ seconds = 0;
+ if (minutes == 60) {
+ hours++;
+ minutes = 0;
+ }
+ }
+ }
+ }
+ return new long[] { hours, minutes, seconds, msecs };
+ }
+
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7994cc1..1736b40 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -16,6 +16,24 @@
Snoozing until %1$s
Dismiss now
Done snoozing
+ Alarm set for %1$s from now.
+
+
+
+ %1$d hour and %2$d minute
+ %1$d hour and %2$d minutes
+ %1$d hours and %2$d minute
+ %1$d hours and %2$d minutes
+ %1$d hour
+ %1$d hours
+ %2$d minute
+ %2$d minutes
+ less than 1 minute
+
+ %1$dh %2$dm
+ %1$dh
+ %2$dm
+ <1m