From aa4359ac7a58bac1671418264da0e264ae486826 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Mon, 30 Jan 2012 15:43:11 -0800 Subject: [PATCH] Added new layouts for astrid reminders, can get in-app notifications with a popup --- astrid/AndroidManifest.xml | 6 + .../todoroo/astrid/alarms/AlarmService.java | 2 +- .../reminders/NotificationFragment.java | 52 +++++---- .../astrid/reminders/Notifications.java | 51 ++++++++- .../astrid/reminders/ReminderDialog.java | 89 +++++++++++++++ .../astrid/reminders/ReminderService.java | 2 +- .../astrid/reminders/ReminderView.java | 14 +++ .../astrid/reminders/SnoozeCallback.java | 7 ++ astrid/res/drawable-hdpi/icon.png | Bin 0 -> 7760 bytes astrid/res/drawable-hdpi/icon_32.png | Bin 0 -> 3422 bytes astrid/res/drawable-hdpi/icon_48.png | Bin 0 -> 5777 bytes .../speech_bubble_reminder.9.png | Bin 0 -> 760 bytes .../drawable/reminder_dialog_background.xml | 8 ++ .../res/drawable/speech_bubble_reminder.9.png | Bin 0 -> 760 bytes astrid/res/layout/astrid_reminder_view.xml | 108 ++++++++++++++++++ astrid/res/layout/notification_control.xml | 46 ++++---- astrid/res/values/colors.xml | 1 + astrid/res/values/strings-reminders.xml | 4 +- astrid/res/values/styles.xml | 13 ++- .../astrid/activity/AstridActivity.java | 40 +++++++ 20 files changed, 387 insertions(+), 56 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/reminders/ReminderDialog.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/reminders/ReminderView.java create mode 100644 astrid/plugin-src/com/todoroo/astrid/reminders/SnoozeCallback.java create mode 100644 astrid/res/drawable-hdpi/icon.png create mode 100644 astrid/res/drawable-hdpi/icon_32.png create mode 100644 astrid/res/drawable-hdpi/icon_48.png create mode 100644 astrid/res/drawable-hdpi/speech_bubble_reminder.9.png create mode 100644 astrid/res/drawable/reminder_dialog_background.xml create mode 100644 astrid/res/drawable/speech_bubble_reminder.9.png create mode 100644 astrid/res/layout/astrid_reminder_view.xml diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 5f0a91b90..682ebcdfa 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -165,6 +165,12 @@ + + + + + + diff --git a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java index b1e1392b4..61085a2f6 100644 --- a/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java +++ b/astrid/plugin-src/com/todoroo/astrid/alarms/AlarmService.java @@ -166,7 +166,7 @@ public class AlarmService { Intent intent = new Intent(context, Notifications.class); intent.setAction("ALARM" + alarm.getId()); //$NON-NLS-1$ intent.putExtra(Notifications.ID_KEY, taskId); - intent.putExtra(Notifications.TYPE_KEY, type); + intent.putExtra(Notifications.EXTRAS_TYPE, type); AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, (int)alarm.getId(), diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java index 8b8b8b0d0..84554ef37 100644 --- a/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/NotificationFragment.java @@ -21,6 +21,7 @@ package com.todoroo.astrid.reminders; import java.util.Date; +import android.app.Activity; import android.app.AlertDialog; import android.app.TimePickerDialog; import android.app.TimePickerDialog.OnTimeSetListener; @@ -32,7 +33,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.widget.Button; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.Spinner; @@ -61,7 +61,7 @@ import com.todoroo.astrid.ui.NumberPicker; * @author timsu * */ -public class NotificationFragment extends TaskListFragment implements OnTimeSetListener { +public class NotificationFragment extends TaskListFragment implements OnTimeSetListener, SnoozeCallback { // --- constants @@ -121,33 +121,37 @@ public class NotificationFragment extends TaskListFragment implements OnTimeSetL // instantiate reminder window ViewGroup parent = (ViewGroup) getView().findViewById(R.id.taskListParent); - getActivity().getLayoutInflater().inflate(R.layout.notification_control, parent, true); + getActivity().getLayoutInflater().inflate(R.layout.astrid_reminder_view, parent, true); + getView().findViewById(R.id.reminder_root).setBackgroundResource(R.color.reminder_background); String reminder = Notifications.getRandomReminder(getResources().getStringArray(R.array.reminder_responses)); if(Preferences.getBoolean(R.string.p_rmd_nagging, true)) - ((TextView)getView().findViewById(R.id.reminderLabel)).setText(reminder); + ((TextView)getView().findViewById(R.id.reminder_message)).setText(reminder); else { - getView().findViewById(R.id.reminderLabel).setVisibility(View.GONE); + getView().findViewById(R.id.reminder_message).setVisibility(View.GONE); getView().findViewById(R.id.astridIcon).setVisibility(View.GONE); + getView().findViewById(R.id.speech_bubble_content).setVisibility(View.GONE); } + getView().findViewById(R.id.reminder_edit).setVisibility(View.GONE); + // set up listeners - ((Button)getView().findViewById(R.id.goAway)).setOnClickListener(new OnClickListener() { + getView().findViewById(R.id.dismiss).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { getActivity().finish(); } }); - ((Button)getView().findViewById(R.id.snooze)).setOnClickListener(new OnClickListener() { + getView().findViewById(R.id.reminder_snooze).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { - snooze(); + snooze(getActivity(), NotificationFragment.this, NotificationFragment.this); } }); - ((Button)getView().findViewById(R.id.done)).setOnClickListener(new OnClickListener() { + getView().findViewById(R.id.reminder_complete).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Task task = new Task(); @@ -163,13 +167,13 @@ public class NotificationFragment extends TaskListFragment implements OnTimeSetL LinearLayout snoozePicker; NumberPicker snoozeValue; Spinner snoozeUnits; - NotificationFragment parent; + SnoozeCallback snoozeCallback; - public SnoozeDialog(NotificationFragment parent) { - super(parent.getActivity()); - this.parent = parent; + public SnoozeDialog(Activity activity, SnoozeCallback callback) { + super(activity); + this.snoozeCallback = callback; - LayoutInflater mInflater = (LayoutInflater) parent.getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + LayoutInflater mInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater.inflate(R.layout.snooze_dialog, this, true); snoozePicker = (LinearLayout) findViewById(R.id.snoozePicker); @@ -206,7 +210,7 @@ public class NotificationFragment extends TaskListFragment implements OnTimeSetL break; } - parent.snoozeTime(time); + snoozeCallback.snoozeForTime(time); } } @@ -214,24 +218,24 @@ public class NotificationFragment extends TaskListFragment implements OnTimeSetL /** * Snooze and re-trigger this alarm */ - private void snooze() { + public static void snooze(Activity activity, OnTimeSetListener onTimeSet, SnoozeCallback snoozeCallback) { if(Preferences.getBoolean(R.string.p_rmd_snooze_dialog, false)) { Date now = new Date(); now.setHours(now.getHours() + 1); int hour = now.getHours(); int minute = now.getMinutes(); - TimePickerDialog tpd = new TimePickerDialog(getActivity(), this, hour, minute, - DateUtilities.is24HourFormat(getActivity())); + TimePickerDialog tpd = new TimePickerDialog(activity, onTimeSet, hour, minute, + DateUtilities.is24HourFormat(activity)); tpd.show(); - tpd.setOwnerActivity(getActivity()); + tpd.setOwnerActivity(activity); } else { - SnoozeDialog sd = new SnoozeDialog(this); - new AlertDialog.Builder(getActivity()) + SnoozeDialog sd = new SnoozeDialog(activity, snoozeCallback); + new AlertDialog.Builder(activity) .setTitle(R.string.rmd_NoA_snooze) .setView(sd) .setPositiveButton(android.R.string.ok, sd) .setNegativeButton(android.R.string.cancel, null) - .show().setOwnerActivity(getActivity()); + .show().setOwnerActivity(activity); } } @@ -243,10 +247,10 @@ public class NotificationFragment extends TaskListFragment implements OnTimeSetL alarmTime.setMinutes(minutes); if(alarmTime.getTime() < DateUtilities.now()) alarmTime.setDate(alarmTime.getDate() + 1); - snoozeTime(alarmTime.getTime()); + snoozeForTime(alarmTime.getTime()); } - public void snoozeTime(long time) { + public void snoozeForTime(long time) { Task task = new Task(); task.setId(taskId); task.setValue(Task.REMINDER_SNOOZE, time); diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java index ac8704120..57d300005 100644 --- a/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/Notifications.java @@ -26,6 +26,7 @@ import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListFragment; +import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.service.AstridDependencyInjector; @@ -39,14 +40,24 @@ public class Notifications extends BroadcastReceiver { /** task id extra */ public static final String ID_KEY = "id"; //$NON-NLS-1$ - /** notification type extra */ - public static final String TYPE_KEY = "type"; //$NON-NLS-1$ /** preference values */ public static final int ICON_SET_PINK = 0; public static final int ICON_SET_BORING = 1; public static final int ICON_SET_ASTRID = 2; + /** + * Action name for broadcast intent notifying that task was created from repeating template + */ + public static final String BROADCAST_IN_APP_NOTIFY = Constants.PACKAGE + ".IN_APP_NOTIFY"; //$NON-NLS-1$ + public static final String EXTRAS_CUSTOM_INTENT = "intent"; + public static final String EXTRAS_NOTIF_ID = "notifId"; + /** notification type extra */ + public static final String EXTRAS_TYPE = "type"; //$NON-NLS-1$ + public static final String EXTRAS_TITLE = "title"; + public static final String EXTRAS_TEXT = "text"; + public static final String EXTRAS_RING_TIMES = "ringTimes"; + // --- instance variables @Autowired @@ -73,7 +84,7 @@ public class Notifications extends BroadcastReceiver { ContextManager.setContext(context); long id = intent.getLongExtra(ID_KEY, 0); - int type = intent.getIntExtra(TYPE_KEY, (byte) 0); + int type = intent.getIntExtra(EXTRAS_TYPE, (byte) 0); Resources r = context.getResources(); String reminder; @@ -169,10 +180,41 @@ public class Notifications extends BroadcastReceiver { notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); notifyIntent.putExtra(TaskListFragment.TOKEN_SOURCE, Constants.SOURCE_NOTIFICATION); - showNotification((int)id, notifyIntent, type, title, text, ringTimes); + requestNotification((int)id, notifyIntent, type, title, text, ringTimes); return true; } + private static void requestNotification(int notificationId, Intent intent, int type, String title, String text, int ringTimes) { + Context context = ContextManager.getContext(); + Intent inAppNotify = new Intent(BROADCAST_IN_APP_NOTIFY); + inAppNotify.putExtra(EXTRAS_NOTIF_ID, notificationId); + inAppNotify.putExtra(EXTRAS_CUSTOM_INTENT, intent); + inAppNotify.putExtra(EXTRAS_TYPE, type); + inAppNotify.putExtra(EXTRAS_TITLE, title); + inAppNotify.putExtra(EXTRAS_TEXT, text); + inAppNotify.putExtra(EXTRAS_RING_TIMES, ringTimes); + context.sendOrderedBroadcast(inAppNotify, AstridApiConstants.PERMISSION_READ); + } + + /** + * Receives requests to show an Astrid notification if they were not intercepted and handled + * by the in-app reminders in AstridActivity. + * @author Sam + * + */ + public static class ShowNotificationReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + int notificationId = intent.getIntExtra(EXTRAS_NOTIF_ID, 0); + Intent customIntent = intent.getParcelableExtra(EXTRAS_CUSTOM_INTENT); + int type = intent.getIntExtra(EXTRAS_TYPE, 0); + String title = intent.getStringExtra(EXTRAS_TITLE); + String text = intent.getStringExtra(EXTRAS_TEXT); + int ringTimes = intent.getIntExtra(EXTRAS_RING_TIMES, 1); + showNotification(notificationId, customIntent, type, title, text, ringTimes); + } + } + /** * Shows an Astrid notification. Pulls in ring tone and quiet hour settings * from preferences. You can make it say anything you like. @@ -181,6 +223,7 @@ public class Notifications extends BroadcastReceiver { public static void showNotification(int notificationId, Intent intent, int type, String title, String text, int ringTimes) { Context context = ContextManager.getContext(); + if(notificationManager == null) notificationManager = new AndroidNotificationManager(context); diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderDialog.java b/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderDialog.java new file mode 100644 index 000000000..0d0bc0152 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderDialog.java @@ -0,0 +1,89 @@ +package com.todoroo.astrid.reminders; + +import java.util.Date; + +import android.app.Dialog; +import android.app.TimePickerDialog.OnTimeSetListener; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.TextView; +import android.widget.TimePicker; + +import com.timsu.astrid.R; +import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.activity.AstridActivity; +import com.todoroo.astrid.core.PluginServices; +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.service.StatisticsConstants; +import com.todoroo.astrid.service.StatisticsService; + + +public class ReminderDialog { + + public static Dialog createReminderDialog(final AstridActivity activity, final long taskId, String title) { + final Dialog d = new Dialog(activity, R.style.ReminderDialog); + final SnoozeCallback dialogSnooze = new SnoozeCallback() { + @Override + public void snoozeForTime(long time) { + Task task = new Task(); + task.setId(taskId); + task.setValue(Task.REMINDER_SNOOZE, time); + PluginServices.getTaskService().save(task); + d.dismiss(); + StatisticsService.reportEvent(StatisticsConstants.TASK_SNOOZE); + } + }; + final OnTimeSetListener onTimeSet = new OnTimeSetListener() { + @Override + public void onTimeSet(TimePicker view, int hours, int minutes) { + Date alarmTime = new Date(); + alarmTime.setHours(hours); + alarmTime.setMinutes(minutes); + if(alarmTime.getTime() < DateUtilities.now()) + alarmTime.setDate(alarmTime.getDate() + 1); + dialogSnooze.snoozeForTime(alarmTime.getTime()); + } + }; + d.setContentView(R.layout.astrid_reminder_view); + + // set up listeners + d.findViewById(R.id.dismiss).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + d.dismiss(); + } + }); + + d.findViewById(R.id.reminder_snooze).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + NotificationFragment.snooze(activity, onTimeSet, dialogSnooze); + } + }); + + d.findViewById(R.id.reminder_complete).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + Task task = new Task(); + task.setId(taskId); + PluginServices.getTaskService().setComplete(task, true); + d.dismiss(); + } + }); + + d.findViewById(R.id.reminder_edit).setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + d.dismiss(); + activity.onTaskListItemClicked(taskId); + } + }); + + ((TextView) d.findViewById(R.id.reminder_title)).setText(title); + ((TextView) d.findViewById(R.id.reminder_message)).setText( + Notifications.getRandomReminder(activity.getResources().getStringArray(R.array.reminder_responses))); + + return d; + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderService.java b/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderService.java index b6f65fae3..ea208d2b9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderService.java +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderService.java @@ -446,7 +446,7 @@ public final class ReminderService { intent.setType(Long.toString(task.getId())); intent.setAction(Integer.toString(type)); intent.putExtra(Notifications.ID_KEY, task.getId()); - intent.putExtra(Notifications.TYPE_KEY, type); + intent.putExtra(Notifications.EXTRAS_TYPE, type); // calculate the unique requestCode as a combination of the task-id and alarm-type: // concatenate id+type to keep the combo unique diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderView.java b/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderView.java new file mode 100644 index 000000000..5d6987ca3 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/ReminderView.java @@ -0,0 +1,14 @@ +package com.todoroo.astrid.reminders; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +public class ReminderView extends LinearLayout { + + public ReminderView(Context context, AttributeSet attrs) { + super(context, attrs); + // TODO Auto-generated constructor stub + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/reminders/SnoozeCallback.java b/astrid/plugin-src/com/todoroo/astrid/reminders/SnoozeCallback.java new file mode 100644 index 000000000..9f12e7e34 --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/reminders/SnoozeCallback.java @@ -0,0 +1,7 @@ +package com.todoroo.astrid.reminders; + +public interface SnoozeCallback { + + public void snoozeForTime(long time); + +} diff --git a/astrid/res/drawable-hdpi/icon.png b/astrid/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f1d6ba8c314eeda9c809da26ec15e9e65051b0 GIT binary patch literal 7760 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 WYEtZSaY_gP0000GI(k{arK_6 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 Ce=9ox literal 0 HcmV?d00001 diff --git a/astrid/res/drawable-hdpi/icon_48.png b/astrid/res/drawable-hdpi/icon_48.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd7ed44ac91e56949c39ac7418ed8174ad92a66 GIT binary patch literal 5777 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 + + + + \ No newline at end of file diff --git a/astrid/res/drawable/speech_bubble_reminder.9.png b/astrid/res/drawable/speech_bubble_reminder.9.png new file mode 100644 index 0000000000000000000000000000000000000000..aa29d212ef67aa6670198a6612d618e966c991d0 GIT binary patch literal 760 zcmVFh-bgUie8e6}GQF;Ia_%8qBBy*{XcOWB-GN3tNh@AlNp zvutjsBAK7{x;ZsLruWL;H7G9!EE#x%hDY~vom zWJMK`49PCIEe+CBMJS`PCvHoFT>a-?#F`g6vF!USCp5*EDngl(y>?rgL@4kFp_D=a zZ&5%fAQTV^2nB>96oeua5DEwdY7)vsp&*p@q0GtNIxRx^c_1^h-Pv%+6f*@^6xGa-~V|C!J4nU?Ly?l>1hY5$S0k=d&3Z1&OV z5K8-K=4E@br%s4ae(%YGTAyFJ?34(leK1|wlI&FJOY9NKZ-0@bFSAD|zHtko_*P&L z3J3*+0zv_yfKY^jP=o?P0il3UKqw#-5Q2yHHwB zKIA9hBa}9wjLmwTmIk?1{A*?3bF18RTN-40QH8wVlWt3cEUhY()ox2eyvW8?6-sw@ z+l^^}V?~wn04uYv?o5rn&*m0Y%Y*E4Yiev~(Fu8=A>U*1mW8@GoOKnQRQ5ed>Rq>| z23nsi-`4s^z8DC3;L+LUvhVpGKX`pGh$k1$7wl+JGJ;)xJb#RZf q8`<7$T{b`KE&$-aQJM|F{>V4WkkGFkf0HEu0000 + + + + + + + + + + + + + + + + + + +