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