1ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski/* 2ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * Copyright (C) 2013 The Android Open Source Project 3ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * 4ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * Licensed under the Apache License, Version 2.0 (the "License"); 5ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * you may not use this file except in compliance with the License. 6ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * You may obtain a copy of the License at 7ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * 8ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * http://www.apache.org/licenses/LICENSE-2.0 9ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * 10ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * Unless required by applicable law or agreed to in writing, software 11ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * distributed under the License is distributed on an "AS IS" BASIS, 12ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * See the License for the specific language governing permissions and 14ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski * limitations under the License. 15ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski */ 16ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskipackage com.android.deskclock.alarms; 17ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 18ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.app.PendingIntent; 19ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.content.Context; 20ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.content.Intent; 21ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.content.res.Resources; 227e6864814023f0a35f90cc16042bc3ff96eba86cAnnie Chinimport android.support.v4.app.NotificationCompat; 2396fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chinimport android.support.v4.app.NotificationManagerCompat; 24ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 256806f6761dd6c10df03ad0c564a4c741a70244e0Paul Sliwowskiimport com.android.deskclock.AlarmClockFragment; 26ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.AlarmUtils; 27ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.DeskClock; 28cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassenimport com.android.deskclock.LogUtils; 29ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.R; 30ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.provider.Alarm; 31ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.provider.AlarmInstance; 32ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 33ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskipublic final class AlarmNotifications { 34fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin public static final String EXTRA_NOTIFICATION_ID = "extra_notification_id"; 35fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin 36ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski public static void showLowPriorityNotification(Context context, AlarmInstance instance) { 37cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen LogUtils.v("Displaying low priority notification for alarm instance: " + instance.mId); 3896fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin NotificationManagerCompat nm = NotificationManagerCompat.from(context); 39ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 407e6864814023f0a35f90cc16042bc3ff96eba86cAnnie Chin NotificationCompat.Builder notification = new NotificationCompat.Builder(context) 41e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin .setContentTitle(context.getString( 42e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin R.string.alarm_alert_predismiss_title)) 43e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin .setContentText(AlarmUtils.getAlarmText(context, instance)) 44ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setSmallIcon(R.drawable.stat_notify_alarm) 45ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setAutoCancel(false) 4686add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setPriority(NotificationCompat.PRIORITY_DEFAULT) 4786add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setCategory(NotificationCompat.CATEGORY_ALARM) 4886add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 4986add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setLocalOnly(true); 50ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 51ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup up hide notification 52b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro Intent hideIntent = AlarmStateManager.createStateChangeIntent(context, 53b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro AlarmStateManager.ALARM_DELETE_TAG, instance, 54b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro AlarmInstance.HIDE_NOTIFICATION_STATE); 55ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski notification.setDeleteIntent(PendingIntent.getBroadcast(context, instance.hashCode(), 56ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski hideIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 57ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 58ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup up dismiss action 59b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, 60f855d573817c0437b6b84aa6a743e65b9d10f476Annie Chin AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.PREDISMISSED_STATE); 61e3764d106d3ff760270219747ce23b7837ff79ffJustin Klaassen notification.addAction(R.drawable.ic_alarm_off_24dp, 62e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin context.getString(R.string.alarm_alert_dismiss_now_text), 63ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski PendingIntent.getBroadcast(context, instance.hashCode(), 64ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 65ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 66ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup content action if instance is owned by alarm 67c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos Intent viewAlarmIntent = createViewAlarmIntent(context, instance); 68ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(), 69ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 70ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 71ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.cancel(instance.hashCode()); 72ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.notify(instance.hashCode(), notification.build()); 73ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski } 74ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 75ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski public static void showHighPriorityNotification(Context context, AlarmInstance instance) { 76cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen LogUtils.v("Displaying high priority notification for alarm instance: " + instance.mId); 7796fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin NotificationManagerCompat nm = NotificationManagerCompat.from(context); 78ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 797e6864814023f0a35f90cc16042bc3ff96eba86cAnnie Chin NotificationCompat.Builder notification = new NotificationCompat.Builder(context) 80e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin .setContentTitle(context.getString(R.string.alarm_alert_predismiss_title)) 81e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin .setContentText(AlarmUtils.getAlarmText(context, instance)) 82ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setSmallIcon(R.drawable.stat_notify_alarm) 83ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setAutoCancel(false) 8496fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin .setOngoing(true) 8596fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin .setGroup(Integer.toString(instance.hashCode())) 8696fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin .setGroupSummary(true) 8786add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setPriority(NotificationCompat.PRIORITY_HIGH) 8886add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setCategory(NotificationCompat.CATEGORY_ALARM) 8986add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 9086097d8e86ef480d0aeb7475e22d27d33e1a1e87Budi Kusmiantoro .setLocalOnly(true); 91ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 92ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup up dismiss action 93b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, 94f855d573817c0437b6b84aa6a743e65b9d10f476Annie Chin AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.PREDISMISSED_STATE); 95e3764d106d3ff760270219747ce23b7837ff79ffJustin Klaassen notification.addAction(R.drawable.ic_alarm_off_24dp, 96e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin context.getString(R.string.alarm_alert_dismiss_now_text), 97ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski PendingIntent.getBroadcast(context, instance.hashCode(), 98ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 99ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 100ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup content action if instance is owned by alarm 101c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos Intent viewAlarmIntent = createViewAlarmIntent(context, instance); 102ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(), 103ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 104ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 105ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.cancel(instance.hashCode()); 106ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.notify(instance.hashCode(), notification.build()); 107ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski } 108ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 109ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski public static void showSnoozeNotification(Context context, AlarmInstance instance) { 110cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen LogUtils.v("Displaying snoozed notification for alarm instance: " + instance.mId); 11196fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin NotificationManagerCompat nm = NotificationManagerCompat.from(context); 112ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 1137e6864814023f0a35f90cc16042bc3ff96eba86cAnnie Chin NotificationCompat.Builder notification = new NotificationCompat.Builder(context) 114e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin .setContentTitle(instance.getLabelOrDefault(context)) 115e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin .setContentText(context.getString(R.string.alarm_alert_snooze_until, 116e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin AlarmUtils.getFormattedTime(context, instance.getAlarmTime()))) 117ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setSmallIcon(R.drawable.stat_notify_alarm) 118ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setAutoCancel(false) 11996fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin .setOngoing(true) 12086add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setPriority(NotificationCompat.PRIORITY_MAX) 12186add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setCategory(NotificationCompat.CATEGORY_ALARM) 12286add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 12386097d8e86ef480d0aeb7475e22d27d33e1a1e87Budi Kusmiantoro .setLocalOnly(true); 124ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 125ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup up dismiss action 126b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, 127b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE); 128e3764d106d3ff760270219747ce23b7837ff79ffJustin Klaassen notification.addAction(R.drawable.ic_alarm_off_24dp, 129e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin context.getString(R.string.alarm_alert_dismiss_text), 130ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski PendingIntent.getBroadcast(context, instance.hashCode(), 131ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 132ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 133ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup content action if instance is owned by alarm 134c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos Intent viewAlarmIntent = createViewAlarmIntent(context, instance); 135ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(), 136ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 137ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.cancel(instance.hashCode()); 138ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.notify(instance.hashCode(), notification.build()); 139ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski } 140ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 141ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski public static void showMissedNotification(Context context, AlarmInstance instance) { 142cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen LogUtils.v("Displaying missed notification for alarm instance: " + instance.mId); 14396fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin NotificationManagerCompat nm = NotificationManagerCompat.from(context); 144ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 145ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski String label = instance.mLabel; 146ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski String alarmTime = AlarmUtils.getFormattedTime(context, instance.getAlarmTime()); 14786add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen NotificationCompat.Builder notification = new NotificationCompat.Builder(context) 148ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setContentTitle(context.getString(R.string.alarm_missed_title)) 149e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin .setContentText(instance.mLabel.isEmpty() ? alarmTime : 150e2ce410438088a3ea251f6e437c0515cb86f0ae4Annie Chin context.getString(R.string.alarm_missed_text, alarmTime, label)) 151ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setSmallIcon(R.drawable.stat_notify_alarm) 15286add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setPriority(NotificationCompat.PRIORITY_HIGH) 15386add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setCategory(NotificationCompat.CATEGORY_ALARM) 15486add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 15586add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setLocalOnly(true); 156ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 157fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin final int hashCode = instance.hashCode(); 158fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin 159ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup dismiss intent 160b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, 161b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE); 162fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin notification.setDeleteIntent(PendingIntent.getBroadcast(context, hashCode, 163ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 164ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 165ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup content intent 16620dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski Intent showAndDismiss = AlarmInstance.createIntent(context, AlarmStateManager.class, 16720dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski instance.mId); 168fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin showAndDismiss.putExtra(EXTRA_NOTIFICATION_ID, hashCode); 16920dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski showAndDismiss.setAction(AlarmStateManager.SHOW_AND_DISMISS_ALARM_ACTION); 170fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin notification.setContentIntent(PendingIntent.getBroadcast(context, hashCode, 17120dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski showAndDismiss, PendingIntent.FLAG_UPDATE_CURRENT)); 172ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 173fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin nm.cancel(hashCode); 174fd8f7c8412ed802088be99d78366ed31e1c69b0eAnnie Chin nm.notify(hashCode, notification.build()); 175ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski } 176ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 177ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski public static void showAlarmNotification(Context context, AlarmInstance instance) { 178cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen LogUtils.v("Displaying alarm notification for alarm instance: " + instance.mId); 17986add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen NotificationManagerCompat nm = NotificationManagerCompat.from(context); 180ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 181ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski Resources resources = context.getResources(); 18286add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen NotificationCompat.Builder notification = new NotificationCompat.Builder(context) 183ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setContentTitle(instance.getLabelOrDefault(context)) 184ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setContentText(AlarmUtils.getFormattedTime(context, instance.getAlarmTime())) 185ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setSmallIcon(R.drawable.stat_notify_alarm) 186ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setOngoing(true) 187ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski .setAutoCancel(false) 18886add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setDefaults(NotificationCompat.DEFAULT_LIGHTS) 189692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro .setWhen(0) 19086add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setCategory(NotificationCompat.CATEGORY_ALARM) 19186add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) 19286097d8e86ef480d0aeb7475e22d27d33e1a1e87Budi Kusmiantoro .setLocalOnly(true); 193ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 194ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup Snooze Action 195b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro Intent snoozeIntent = AlarmStateManager.createStateChangeIntent(context, 196b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro AlarmStateManager.ALARM_SNOOZE_TAG, instance, AlarmInstance.SNOOZE_STATE); 19750ab55f5778342f83d0fcb2e6b2c3e8cae91ca8aJames Lemieux snoozeIntent.putExtra(AlarmStateManager.FROM_NOTIFICATION_EXTRA, true); 198ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(context, instance.hashCode(), 199ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski snoozeIntent, 200ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski PendingIntent.FLAG_UPDATE_CURRENT); 2017f5209b10f08a3919245552516e60b4f07982a04Annie Chin notification.addAction(R.drawable.ic_snooze_24dp, 202ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski resources.getString(R.string.alarm_alert_snooze_text), snoozePendingIntent); 203ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 204ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup Dismiss Action 205b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, 206b4aacfb276d66f2bf02691e56d0d20fe6bab31a4Budi Kusmiantoro AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE); 20750ab55f5778342f83d0fcb2e6b2c3e8cae91ca8aJames Lemieux dismissIntent.putExtra(AlarmStateManager.FROM_NOTIFICATION_EXTRA, true); 208ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski PendingIntent dismissPendingIntent = PendingIntent.getBroadcast(context, 209ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski instance.hashCode(), dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT); 210e3764d106d3ff760270219747ce23b7837ff79ffJustin Klaassen notification.addAction(R.drawable.ic_alarm_off_24dp, 211ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski resources.getString(R.string.alarm_alert_dismiss_text), 212ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski dismissPendingIntent); 213ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 214ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup Content Action 215ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski Intent contentIntent = AlarmInstance.createIntent(context, AlarmActivity.class, 216ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski instance.mId); 217ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski notification.setContentIntent(PendingIntent.getActivity(context, 218ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski instance.hashCode(), contentIntent, PendingIntent.FLAG_UPDATE_CURRENT)); 219ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 220ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // Setup fullscreen intent 221ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski Intent fullScreenIntent = AlarmInstance.createIntent(context, AlarmActivity.class, 222ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski instance.mId); 223ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski // set action, so we can be different then content pending intent 224ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski fullScreenIntent.setAction("fullscreen_activity"); 225ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 226ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski Intent.FLAG_ACTIVITY_NO_USER_ACTION); 227ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski notification.setFullScreenIntent(PendingIntent.getActivity(context, 228ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski instance.hashCode(), fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT), true); 22986add3e7ce11282d154ced319b5ba1febffd5064Justin Klaassen notification.setPriority(NotificationCompat.PRIORITY_MAX); 230ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 231ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.cancel(instance.hashCode()); 232ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.notify(instance.hashCode(), notification.build()); 233ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski } 234ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski 235ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski public static void clearNotification(Context context, AlarmInstance instance) { 236cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen LogUtils.v("Clearing notifications for alarm instance: " + instance.mId); 23796fd82995fecb612d7651efd1e7c361d1f14fafeAnnie Chin NotificationManagerCompat nm = NotificationManagerCompat.from(context); 238ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski nm.cancel(instance.hashCode()); 239ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski } 240c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos 241d77967b768d6fa7d1c2daa7d40e11a584513c464Annie Chin public static Intent createViewAlarmIntent(Context context, AlarmInstance instance) { 242c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId; 243c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId); 244c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX); 245c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos viewAlarmIntent.putExtra(AlarmClockFragment.SCROLL_TO_ALARM_INTENT_EXTRA, alarmId); 246c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 247c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos return viewAlarmIntent; 248c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos } 249ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski} 250