diff --git a/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationCreationFragment.java b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationCreationFragment.java index f5e1838..77c0007 100644 --- a/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationCreationFragment.java +++ b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationCreationFragment.java @@ -2,6 +2,7 @@ package net.headlezz.notificationlogger.createnotification; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.NotificationCompat; import android.view.LayoutInflater; @@ -20,8 +21,9 @@ import java.util.Date; import butterknife.Bind; import butterknife.ButterKnife; -public class NotificationCreationFragment extends Fragment implements View.OnClickListener { +public class NotificationCreationFragment extends Fragment implements View.OnClickListener, NotificationScheduleHelper.NotificationScheduleManagerCallback { + // TODO permissions to vibrate etc? // TODO intent // TODO check id size @@ -132,6 +134,44 @@ public class NotificationCreationFragment extends Fragment implements View.OnCli } private void sheduleNotification(DispatchableNotification dn) { - dn.shedule(new Date(System.currentTimeMillis() + 5 * 1000)); + new NotificationScheduleHelper(getContext(), dn, this).shedule(); + } + + @SuppressWarnings("ConstantConditions") + @Override + public void onNotificationScheduleCreated(Date date, DispatchableNotification dn) { + // delayn the shedule to see if user presses the undo button + Snackbar snack = Snackbar.make(getView(), getString(R.string.create_shedule_snack, date.toString()), Snackbar.LENGTH_LONG); + ScheduleSnackbarListener listener = new ScheduleSnackbarListener(dn, date); + snack.setCallback(listener); + snack.setAction(getString(R.string.create_shedule_snack_undo), listener); + snack.show(); + } + + /** + * Snackbar listener to track if the user undoes the schedule operation + */ + class ScheduleSnackbarListener extends Snackbar.Callback implements View.OnClickListener { + + private DispatchableNotification mNotification; + private Date mDispatchDate; + private boolean dispatch = true; + + public ScheduleSnackbarListener(DispatchableNotification notification, Date dispatchDate) { + mDispatchDate = dispatchDate; + mNotification = notification; + } + + @Override + public void onClick(View v) { + dispatch = false; + } + + @Override + public void onDismissed(Snackbar snackbar, int event) { + super.onDismissed(snackbar, event); + if(dispatch) + mNotification.shedule(mDispatchDate); + } } } diff --git a/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationScheduleHelper.java b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationScheduleHelper.java new file mode 100644 index 0000000..da8bc7a --- /dev/null +++ b/app/src/main/java/net/headlezz/notificationlogger/createnotification/NotificationScheduleHelper.java @@ -0,0 +1,70 @@ +package net.headlezz.notificationlogger.createnotification; + + +import android.app.DatePickerDialog; +import android.app.TimePickerDialog; +import android.content.Context; +import android.widget.DatePicker; +import android.widget.TimePicker; + +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * Helper class to create the date to schedule a notification + */ +public class NotificationScheduleHelper { + + private Context mContext; + private DispatchableNotification mNotification; + NotificationScheduleManagerCallback mCallback; + + interface NotificationScheduleManagerCallback { + void onNotificationScheduleCreated(Date date, DispatchableNotification dn); + } + + public NotificationScheduleHelper(Context context, DispatchableNotification dn, NotificationScheduleManagerCallback cb) { + mContext = context; + mNotification = dn; + mCallback = cb; + } + + public void shedule() { + openSheduleDialogs(); + } + + private void openSheduleDialogs() { + NotificationSheduleCreationListener mListener = new NotificationSheduleCreationListener(); + Calendar cal = new GregorianCalendar(); + DatePickerDialog dialog = new DatePickerDialog(mContext, mListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); + dialog.show(); + } + + public void onTimeSet(int year, int monthOfYear, int dayOfMonth, int hour, int minute) { + mCallback.onNotificationScheduleCreated(new Date(year-1900, monthOfYear, dayOfMonth, hour, minute), mNotification); + } + + + class NotificationSheduleCreationListener implements DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { + + private int year; + private int monthOfYear; + private int dayOfMonth; + + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + this.year = year; + this.monthOfYear = monthOfYear; + this.dayOfMonth = dayOfMonth; + Calendar cal = new GregorianCalendar(); + new TimePickerDialog(mContext, this, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)+1, true).show(); + } + + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + NotificationScheduleHelper.this.onTimeSet(year, monthOfYear, dayOfMonth, hourOfDay, minute); + } + } + +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1d10403..1c84b09 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,6 +29,9 @@ schedule dispatch + Notification sheduled for %1$s + Undo + Alarm Call