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