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
18c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roosimport android.app.AlarmManager;
19ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.app.Notification;
20ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.app.NotificationManager;
21ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.app.PendingIntent;
22ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.content.Context;
23ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.content.Intent;
24ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport android.content.res.Resources;
25ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
266806f6761dd6c10df03ad0c564a4c741a70244e0Paul Sliwowskiimport com.android.deskclock.AlarmClockFragment;
27ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.AlarmUtils;
28ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.DeskClock;
29cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassenimport com.android.deskclock.LogUtils;
30ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.R;
31ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.provider.Alarm;
32ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskiimport com.android.deskclock.provider.AlarmInstance;
33ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
34ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowskipublic final class AlarmNotifications {
35ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
36c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos    public static void registerNextAlarmWithAlarmManager(Context context, AlarmInstance instance)  {
37c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        // Sets a surrogate alarm with alarm manager that provides the AlarmClockInfo for the
38c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        // alarm that is going to fire next. The operation is constructed such that it is ignored
39c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        // by AlarmStateManager.
40c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos
41c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
42c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos
43c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        int flags = instance == null ? PendingIntent.FLAG_NO_CREATE : 0;
44c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        PendingIntent operation = PendingIntent.getBroadcast(context, 0 /* requestCode */,
45c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos                AlarmStateManager.createIndicatorIntent(context), flags);
46c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos
47ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        if (instance != null) {
48c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos            long alarmTime = instance.getAlarmTime().getTimeInMillis();
49c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos
50c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos            // Create an intent that can be used to show or edit details of the next alarm.
51c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos            PendingIntent viewIntent = PendingIntent.getActivity(context, instance.hashCode(),
52c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos                    createViewAlarmIntent(context, instance), PendingIntent.FLAG_UPDATE_CURRENT);
53ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
54b157a2dd7a189aa30fd6d79ee5a2b0fad952e31eJose Lima            AlarmManager.AlarmClockInfo info =
55b157a2dd7a189aa30fd6d79ee5a2b0fad952e31eJose Lima                    new AlarmManager.AlarmClockInfo(alarmTime, viewIntent);
56c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos            alarmManager.setAlarmClock(info, operation);
57c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        } else if (operation != null) {
58c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos            alarmManager.cancel(operation);
59c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        }
60ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
61ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
62ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    public static void showLowPriorityNotification(Context context, AlarmInstance instance) {
63cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen        LogUtils.v("Displaying low priority notification for alarm instance: " + instance.mId);
64ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        NotificationManager nm = (NotificationManager)
65ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                context.getSystemService(Context.NOTIFICATION_SERVICE);
66ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
67ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Resources resources = context.getResources();
68ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Notification.Builder notification = new Notification.Builder(context)
69ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentTitle(resources.getString(R.string.alarm_alert_predismiss_title))
70ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentText(AlarmUtils.getAlarmText(context, instance))
71ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setSmallIcon(R.drawable.stat_notify_alarm)
72ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setOngoing(false)
73ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setAutoCancel(false)
74692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setPriority(Notification.PRIORITY_DEFAULT)
75692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setCategory(Notification.CATEGORY_ALARM);
76ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
77ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup up hide notification
78ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent hideIntent = AlarmStateManager.createStateChangeIntent(context, "DELETE_TAG",
79ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance, AlarmInstance.HIDE_NOTIFICATION_STATE);
80ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setDeleteIntent(PendingIntent.getBroadcast(context, instance.hashCode(),
81ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                hideIntent, PendingIntent.FLAG_UPDATE_CURRENT));
82ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
83ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup up dismiss action
84ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
85ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance, AlarmInstance.DISMISSED_STATE);
8675691afe7bd7aa1bbe3286708d2305e6871d15aaJustin Klaassen        notification.addAction(R.drawable.ic_alarm_off_black,
87ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                resources.getString(R.string.alarm_alert_dismiss_now_text),
88ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                PendingIntent.getBroadcast(context, instance.hashCode(),
89ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                        dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
90ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
91ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup content action if instance is owned by alarm
92c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        Intent viewAlarmIntent = createViewAlarmIntent(context, instance);
93ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
94ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
95ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
96ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.cancel(instance.hashCode());
97ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.notify(instance.hashCode(), notification.build());
98ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
99ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
100ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    public static void showHighPriorityNotification(Context context, AlarmInstance instance) {
101cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen        LogUtils.v("Displaying high priority notification for alarm instance: " + instance.mId);
102ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        NotificationManager nm = (NotificationManager)
103ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                context.getSystemService(Context.NOTIFICATION_SERVICE);
104ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
105ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Resources resources = context.getResources();
106ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Notification.Builder notification = new Notification.Builder(context)
107ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentTitle(resources.getString(R.string.alarm_alert_predismiss_title))
108ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentText(AlarmUtils.getAlarmText(context, instance))
109ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setSmallIcon(R.drawable.stat_notify_alarm)
110ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setOngoing(true)
111ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setAutoCancel(false)
112692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setPriority(Notification.PRIORITY_HIGH)
113692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setCategory(Notification.CATEGORY_ALARM);
114ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
115ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup up dismiss action
116ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
117ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance, AlarmInstance.DISMISSED_STATE);
11875691afe7bd7aa1bbe3286708d2305e6871d15aaJustin Klaassen        notification.addAction(R.drawable.ic_alarm_off_black,
119ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                resources.getString(R.string.alarm_alert_dismiss_now_text),
120ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                PendingIntent.getBroadcast(context, instance.hashCode(),
121ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                        dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
122ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
123ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup content action if instance is owned by alarm
124c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        Intent viewAlarmIntent = createViewAlarmIntent(context, instance);
125ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
126ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
127ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
128ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.cancel(instance.hashCode());
129ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.notify(instance.hashCode(), notification.build());
130ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
131ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
132ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    public static void showSnoozeNotification(Context context, AlarmInstance instance) {
133cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen        LogUtils.v("Displaying snoozed notification for alarm instance: " + instance.mId);
134ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        NotificationManager nm = (NotificationManager)
135ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                context.getSystemService(Context.NOTIFICATION_SERVICE);
136ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
137ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Resources resources = context.getResources();
138ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Notification.Builder notification = new Notification.Builder(context)
139ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentTitle(instance.getLabelOrDefault(context))
140ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentText(resources.getString(R.string.alarm_alert_snooze_until,
141ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                        AlarmUtils.getFormattedTime(context, instance.getAlarmTime())))
142ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setSmallIcon(R.drawable.stat_notify_alarm)
143ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setOngoing(true)
144ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setAutoCancel(false)
145692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setPriority(Notification.PRIORITY_MAX)
146692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setCategory(Notification.CATEGORY_ALARM);
147ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
148ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup up dismiss action
149ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
150ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance, AlarmInstance.DISMISSED_STATE);
15175691afe7bd7aa1bbe3286708d2305e6871d15aaJustin Klaassen        notification.addAction(R.drawable.ic_alarm_off_black,
152ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                resources.getString(R.string.alarm_alert_dismiss_text),
153ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                PendingIntent.getBroadcast(context, instance.hashCode(),
154ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                        dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
155ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
156ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup content action if instance is owned by alarm
157c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        Intent viewAlarmIntent = createViewAlarmIntent(context, instance);
158ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
159ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
160ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.cancel(instance.hashCode());
161ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.notify(instance.hashCode(), notification.build());
162ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
163ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
164ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    public static void showMissedNotification(Context context, AlarmInstance instance) {
165cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen        LogUtils.v("Displaying missed notification for alarm instance: " + instance.mId);
166ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        NotificationManager nm = (NotificationManager)
167ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                context.getSystemService(Context.NOTIFICATION_SERVICE);
168ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
169ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        String label = instance.mLabel;
170ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        String alarmTime = AlarmUtils.getFormattedTime(context, instance.getAlarmTime());
171ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        String contextText = instance.mLabel.isEmpty() ? alarmTime :
172ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                context.getString(R.string.alarm_missed_text, alarmTime, label);
173ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Notification.Builder notification = new Notification.Builder(context)
174ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentTitle(context.getString(R.string.alarm_missed_title))
175ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentText(contextText)
176ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setSmallIcon(R.drawable.stat_notify_alarm)
177692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setPriority(Notification.PRIORITY_HIGH)
178692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setCategory(Notification.CATEGORY_ALARM);
179ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
180ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup dismiss intent
181ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
182ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance, AlarmInstance.DISMISSED_STATE);
183ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setDeleteIntent(PendingIntent.getBroadcast(context, instance.hashCode(),
184ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
185ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
186ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup content intent
18720dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski        Intent showAndDismiss = AlarmInstance.createIntent(context, AlarmStateManager.class,
18820dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski                instance.mId);
18920dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski        showAndDismiss.setAction(AlarmStateManager.SHOW_AND_DISMISS_ALARM_ACTION);
19020dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski        notification.setContentIntent(PendingIntent.getBroadcast(context, instance.hashCode(),
19120dccf1991285ab46670521cea5adbc795b5be5ePaul Sliwowski                showAndDismiss, PendingIntent.FLAG_UPDATE_CURRENT));
192ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
193ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.cancel(instance.hashCode());
194ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.notify(instance.hashCode(), notification.build());
195ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
196ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
197ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    public static void showAlarmNotification(Context context, AlarmInstance instance) {
198cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen        LogUtils.v("Displaying alarm notification for alarm instance: " + instance.mId);
199ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        NotificationManager nm = (NotificationManager)
200ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                context.getSystemService(Context.NOTIFICATION_SERVICE);
201ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
202ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Close dialogs and window shade, so this will display
203ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
204ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
205ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Resources resources = context.getResources();
206ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Notification.Builder notification = new Notification.Builder(context)
207ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentTitle(instance.getLabelOrDefault(context))
208ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setContentText(AlarmUtils.getFormattedTime(context, instance.getAlarmTime()))
209ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setSmallIcon(R.drawable.stat_notify_alarm)
210ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setOngoing(true)
211ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setAutoCancel(false)
212ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                .setDefaults(Notification.DEFAULT_LIGHTS)
213692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setWhen(0)
214692718499fc480f29a9aabcc3cb38ba6bb7847ceBudi Kusmiantoro                .setCategory(Notification.CATEGORY_ALARM);
215ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
216ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup Snooze Action
217ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent snoozeIntent = AlarmStateManager.createStateChangeIntent(context, "SNOOZE_TAG",
218ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance, AlarmInstance.SNOOZE_STATE);
219ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(context, instance.hashCode(),
220ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                snoozeIntent,
221ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                PendingIntent.FLAG_UPDATE_CURRENT);
22275691afe7bd7aa1bbe3286708d2305e6871d15aaJustin Klaassen        notification.addAction(R.drawable.ic_snooze_black,
223ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                resources.getString(R.string.alarm_alert_snooze_text), snoozePendingIntent);
224ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
225ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup Dismiss Action
226ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
227ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance, AlarmInstance.DISMISSED_STATE);
228ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        PendingIntent dismissPendingIntent = PendingIntent.getBroadcast(context,
229ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance.hashCode(), dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT);
23075691afe7bd7aa1bbe3286708d2305e6871d15aaJustin Klaassen        notification.addAction(R.drawable.ic_alarm_off_black,
231ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                resources.getString(R.string.alarm_alert_dismiss_text),
232ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                dismissPendingIntent);
233ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
234ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup Content Action
235ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent contentIntent = AlarmInstance.createIntent(context, AlarmActivity.class,
236ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance.mId);
237ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setContentIntent(PendingIntent.getActivity(context,
238ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance.hashCode(), contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
239ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
240ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // Setup fullscreen intent
241ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        Intent fullScreenIntent = AlarmInstance.createIntent(context, AlarmActivity.class,
242ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance.mId);
243ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        // set action, so we can be different then content pending intent
244ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        fullScreenIntent.setAction("fullscreen_activity");
245ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
246ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                Intent.FLAG_ACTIVITY_NO_USER_ACTION);
247ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setFullScreenIntent(PendingIntent.getActivity(context,
248ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                instance.hashCode(), fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT), true);
249ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        notification.setPriority(Notification.PRIORITY_MAX);
250ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
251ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.cancel(instance.hashCode());
252ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.notify(instance.hashCode(), notification.build());
253ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
254ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski
255ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    public static void clearNotification(Context context, AlarmInstance instance) {
256cdbb71b08c13c84af850f4036febc0b90dcfcc7dJustin Klaassen        LogUtils.v("Clearing notifications for alarm instance: " + instance.mId);
257ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        NotificationManager nm = (NotificationManager)
258ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski                context.getSystemService(Context.NOTIFICATION_SERVICE);
259ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski        nm.cancel(instance.hashCode());
260ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski    }
261c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos
262c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos    private static Intent createViewAlarmIntent(Context context, AlarmInstance instance) {
263c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
264c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
265c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
266c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        viewAlarmIntent.putExtra(AlarmClockFragment.SCROLL_TO_ALARM_INTENT_EXTRA, alarmId);
267c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
268c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos        return viewAlarmIntent;
269c0743272ad924bc97d335d695be3e6b32a83dd7dAdrian Roos    }
270ab0d28c68a77bea2a4a2ee50378da3670a1dd939Paul Sliwowski}
271