From e6e7f76e81e6d844555d64d962291601a068637a Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 11 Mar 2015 17:14:16 -0500 Subject: [PATCH] Add complete and snooze notification actions --- src/main/AndroidManifest.xml | 4 ++ .../andlib/utility/AndroidUtilities.java | 4 ++ .../astrid/reminders/Notifications.java | 35 +++++++--- .../reminders/ShowNotificationReceiver.java | 28 ++++++-- .../org/tasks/injection/ActivityModule.java | 4 +- .../org/tasks/reminders/SnoozeActivity.java | 65 ++++++++++++++++++ src/main/res/drawable-hdpi/ic_action_tick.png | Bin 0 -> 604 bytes .../res/drawable-xhdpi/ic_action_tick.png | Bin 0 -> 592 bytes .../res/drawable-xxhdpi/ic_action_tick.png | Bin 0 -> 814 bytes src/main/res/drawable/ic_action_tick.png | Bin 0 -> 428 bytes 10 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/tasks/reminders/SnoozeActivity.java create mode 100644 src/main/res/drawable-hdpi/ic_action_tick.png create mode 100644 src/main/res/drawable-xhdpi/ic_action_tick.png create mode 100644 src/main/res/drawable-xxhdpi/ic_action_tick.png create mode 100644 src/main/res/drawable/ic_action_tick.png diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index f6763cfd4..a3c1a1d62 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -280,6 +280,10 @@ android:name="com.todoroo.astrid.calls.MissedCallActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + + diff --git a/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java b/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java index 2b36457ab..b5fba07b1 100644 --- a/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java +++ b/src/main/java/com/todoroo/andlib/utility/AndroidUtilities.java @@ -379,6 +379,10 @@ public class AndroidUtilities { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH; } + public static boolean atLeastJellybean() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; + } + public static boolean atLeastLollipop() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; } diff --git a/src/main/java/com/todoroo/astrid/reminders/Notifications.java b/src/main/java/com/todoroo/astrid/reminders/Notifications.java index 77ec1d868..ad0562e37 100644 --- a/src/main/java/com/todoroo/astrid/reminders/Notifications.java +++ b/src/main/java/com/todoroo/astrid/reminders/Notifications.java @@ -31,6 +31,8 @@ import org.tasks.preferences.Preferences; import javax.inject.Inject; +import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybean; + public class Notifications extends InjectingBroadcastReceiver { private static final Logger log = LoggerFactory.getLogger(Notifications.class); @@ -131,8 +133,16 @@ public class Notifications extends InjectingBroadcastReceiver { String title = context.getString(R.string.app_name); - Intent notifyIntent = new Intent(context, TaskListActivity.class); - FilterWithCustomIntent itemFilter = new FilterWithCustomIntent(context.getString(R.string.rmd_NoA_filter), + Intent intent = atLeastJellybean() + ? createEditIntent(id, task) + : createNotificationIntent(id, taskTitle); + + broadcaster.requestNotification((int) id, intent, type, title, taskTitle, ringTimes); + return true; + } + + public Intent createNotificationIntent(final long id, final String taskTitle) { + final FilterWithCustomIntent itemFilter = new FilterWithCustomIntent(context.getString(R.string.rmd_NoA_filter), context.getString(R.string.rmd_NoA_filter), new QueryTemplate().where(TaskCriteria.byId(id)), null); @@ -142,13 +152,20 @@ public class Notifications extends InjectingBroadcastReceiver { itemFilter.customExtras = customExtras; itemFilter.customTaskList = new ComponentName(context, NotificationFragment.class); - notifyIntent.setAction("NOTIFY" + id); //$NON-NLS-1$ - notifyIntent.putExtra(TaskListFragment.TOKEN_FILTER, itemFilter); - notifyIntent.putExtra(NotificationFragment.TOKEN_ID, id); - notifyIntent.putExtra(EXTRAS_TEXT, taskTitle); - notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + return new Intent(context, TaskListActivity.class) {{ + setAction("NOTIFY" + id); //$NON-NLS-1$ + putExtra(TaskListFragment.TOKEN_FILTER, itemFilter); + putExtra(NotificationFragment.TOKEN_ID, id); + putExtra(EXTRAS_TEXT, taskTitle); + setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + }}; + } - broadcaster.requestNotification((int) id, notifyIntent, type, title, taskTitle, ringTimes); - return true; + public Intent createEditIntent(final long id, final Task task) { + return new Intent(context, TaskListActivity.class) {{ + setAction("NOTIFY" + id); + putExtra(TaskListActivity.OPEN_TASK, task.getId()); + setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + }}; } } diff --git a/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java b/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java index 803e8e537..589bb167a 100644 --- a/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java +++ b/src/main/java/com/todoroo/astrid/reminders/ShowNotificationReceiver.java @@ -12,6 +12,7 @@ import android.telephony.TelephonyManager; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; +import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.utility.Flags; import com.todoroo.astrid.voice.VoiceOutputAssistant; @@ -22,12 +23,15 @@ import org.tasks.R; import org.tasks.injection.InjectingBroadcastReceiver; import org.tasks.notifications.NotificationManager; import org.tasks.preferences.Preferences; +import org.tasks.receivers.CompleteTaskReceiver; +import org.tasks.reminders.SnoozeActivity; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.inject.Inject; +import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybean; import static org.tasks.date.DateTimeUtils.currentTimeMillis; /** @@ -101,7 +105,7 @@ public class ShowNotificationReceiver extends InjectingBroadcastReceiver { * * @param ringTimes number of times to ring (-1 = nonstop) */ - private void showNotification(Context context, int notificationId, Intent intent, int type, String title, + private void showNotification(Context context, int notificationId, final Intent intent, int type, String title, String text, int ringTimes) { // don't ring multiple times if random reminder if (type == ReminderService.TYPE_RANDOM) { @@ -113,14 +117,30 @@ public class ShowNotificationReceiver extends InjectingBroadcastReceiver { PendingIntent pendingIntent = PendingIntent.getActivity(context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT); - Notification notification = new NotificationCompat.Builder(context) + NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.notif_astrid) .setTicker(text) .setWhen(System.currentTimeMillis()) .setContentTitle(title) .setContentText(text) - .setContentIntent(pendingIntent) - .build(); + .setContentIntent(pendingIntent); + if (atLeastJellybean()) { + final long taskId = intent.getLongExtra(TaskListActivity.OPEN_TASK, 0L); + PendingIntent completeIntent = PendingIntent.getBroadcast(context, notificationId, new Intent(context, CompleteTaskReceiver.class) {{ + putExtra(CompleteTaskReceiver.TASK_ID, taskId); + }}, PendingIntent.FLAG_UPDATE_CURRENT); + + PendingIntent snoozePendingIntent = PendingIntent.getActivity(context, notificationId, new Intent(context, SnoozeActivity.class) {{ + setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + putExtra(SnoozeActivity.TASK_ID, taskId); + }}, PendingIntent.FLAG_UPDATE_CURRENT); + + builder.addAction(R.drawable.ic_action_tick, context.getResources().getString(R.string.rmd_NoA_done), completeIntent) + .addAction(R.drawable.ic_action_alarm, context.getResources().getString(R.string.rmd_NoA_snooze), snoozePendingIntent); + } + + + Notification notification = builder.build(); notification.flags |= Notification.FLAG_AUTO_CANCEL; if (preferences.getBoolean(R.string.p_rmd_persistent, true)) { notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_SHOW_LIGHTS; diff --git a/src/main/java/org/tasks/injection/ActivityModule.java b/src/main/java/org/tasks/injection/ActivityModule.java index 9b00d1e9d..5bffe774c 100644 --- a/src/main/java/org/tasks/injection/ActivityModule.java +++ b/src/main/java/org/tasks/injection/ActivityModule.java @@ -26,6 +26,7 @@ import com.todoroo.astrid.tags.DeleteTagActivity; import com.todoroo.astrid.tags.RenameTagActivity; import com.todoroo.astrid.widget.WidgetConfigActivity; +import org.tasks.reminders.SnoozeActivity; import org.tasks.voice.VoiceCommandActivity; import javax.inject.Singleton; @@ -58,7 +59,8 @@ import dagger.Provides; BeastModePreferences.class, DefaultsPreferences.class, ReminderPreferences.class, - AACRecordingActivity.class + AACRecordingActivity.class, + SnoozeActivity.class }) public class ActivityModule { diff --git a/src/main/java/org/tasks/reminders/SnoozeActivity.java b/src/main/java/org/tasks/reminders/SnoozeActivity.java new file mode 100644 index 000000000..271f4e54e --- /dev/null +++ b/src/main/java/org/tasks/reminders/SnoozeActivity.java @@ -0,0 +1,65 @@ +package org.tasks.reminders; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; + +import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.reminders.SnoozeCallback; +import com.todoroo.astrid.reminders.SnoozeDialog; +import com.todoroo.astrid.service.StartupService; +import com.todoroo.astrid.service.TaskService; + +import org.tasks.R; +import org.tasks.injection.InjectingActivity; +import org.tasks.notifications.NotificationManager; +import org.tasks.preferences.ActivityPreferences; + +import javax.inject.Inject; + +public class SnoozeActivity extends InjectingActivity { + + public static final String TASK_ID = "id"; + + @Inject StartupService startupService; + @Inject ActivityPreferences preferences; + @Inject TaskService taskService; + @Inject NotificationManager notificationManager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + preferences.applyTranslucentDialogTheme(); + startupService.onStartupApplication(this); + long taskId = getIntent().getLongExtra(TASK_ID, 0L); + snooze(taskId); + } + + private void snooze(final long taskId) { + SnoozeCallback callback = new SnoozeCallback() { + @Override + public void snoozeForTime(long time) { + setResult(RESULT_OK); + Task task = new Task(); + task.setId(taskId); + task.setReminderSnooze(time); + taskService.save(task); + notificationManager.cancel(taskId); + finish(); + } + }; + SnoozeDialog sd = new SnoozeDialog(this, callback); + new AlertDialog.Builder(this) + .setTitle(R.string.rmd_NoA_snooze) + .setView(sd) + .setPositiveButton(android.R.string.ok, sd) + .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + setResult(RESULT_CANCELED); + finish(); + } + }) + .show().setOwnerActivity(this); + } +} diff --git a/src/main/res/drawable-hdpi/ic_action_tick.png b/src/main/res/drawable-hdpi/ic_action_tick.png new file mode 100644 index 0000000000000000000000000000000000000000..95ee27457c6c8d4e62ce01035a0d3fcc2fc24fb9 GIT binary patch literal 604 zcmV-i0;BzjP)|Cv#2fu;-r zu^9qlGX%tD2#8Iu1B@{*cFpN+K$@mg5&3A0dE=Yc%YZaZr_Q+#z-tj%_#%22@F*`L zlfOeRMPxCX%?^s@_bQ-39suXu-Db17FFK|-0Ur5pS(be*JFXW2q4Lm!fF|+~IiRUL zL=5oAUsjceNC7+KztmZ)^MHNIL&pJS^1xMyJiyb1o-v=#->T{f@Y!1XJLDwbmtQWI z=b`I*e*t66k*c1G$T4tQWp`LaTk_xuFvc7K?;lSpB2xk)+LQ-RK%VD6fnVEWbtBrA z2T#Cyz5bEs`6pF<*dDJM(S4kwezLPTC|kE`nU(P(t*oO{=$Jk$(;@`w^zm4|?>MA_w3K(i!;;LTiFgsR?HYtOZ#|E?PCMxREg>P?nqXI;rdz)f64k|c-Y@i<+rRu^5$!=3_S q68)=0Q-*-p3<0qj0%9`+#O4n{CuL#^g`a5v00002?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4 zvEgxB;)AK5m+39=6JLOv2rxE0mdlYC{AuQLL4o8y4BzhkcJ6FhE->Li`MI6u&+qJV zar(@3?&0x`LY%(bJJ{-{P5u7w?>(8bTsv6pc@CQw*v$2d|Nbm9$U*H-`nj01oGUo_ zdpTF|^7C@eV3v~-G!VBjQAqHsFwjfLt1!?>;H)svO32?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR42Ak6uW7a(oR`mPn5gxAO*ffu@_Fyv z0}+?1B_e0dmksigkX8T6_@$4zqmaRnPvIEj5sL;1c7ewXNiq&SxCQ55VJ|RA>M7S; z`d+bR{$YbZQNQc{v7AvjR>5vF&u{tq1I|4k>)uvd9dL2`so0{=px7eJs$_A1Mek|< zl#T}s<~!8tQ*v3@e>6mYazDoL{PWMxcWNyTh%P(zzyJC4>C^3tzdvSpZxCMR_0s%< z3D4pCJAW57aA%!jXRmP1{rP}ly~dMfW(F%DE9mEiN`|d9FDwqoJ#k*n_)SUPif4oR z&kK(+^)7-BSA0rL zY{>rPp5d$}=nJ>fyqo(t> z%DYeRxzJp5Bf)loOH14n=9abptgBWY*>khC=7s@-PM?GRr^Lq$8(wS=o1Ecj7ZM>n zuiAHpllG^DmloBWULgORU^QgcDD1vrWygi zW4@gicGU>mdKI;Vst0Js=U`~Uy| literal 0 HcmV?d00001 diff --git a/src/main/res/drawable/ic_action_tick.png b/src/main/res/drawable/ic_action_tick.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6cdeee475b18dada8955ae60d0e1a6d28761da GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E8#o-U3d z5v^~p8~U|4h#dR)URopP&aIUG2V#>W+kA9-c9jQMXL~@Y|C?_M`RtzsFxRD1Lm?-rdOGv1y%6-pwtsUQ)Oa#BS zbTHf2yPP!^)Z+Vc$HDg4jJZLt3_@xQ7#KW)nCzCbF*}|AzhjDC!~AE$x*1oQoKEU1 Q0YjF-)78&qol`;+0KX@vZ~y=R literal 0 HcmV?d00001