AlarmNotifications.java revision 1c7788b33dd4516dae81e6bcab043addc45fc1a1
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.deskclock.alarms;
17
18import android.app.Notification;
19import android.app.NotificationManager;
20import android.app.PendingIntent;
21import android.content.Context;
22import android.content.Intent;
23import android.content.res.Resources;
24import android.provider.Settings;
25
26import com.android.deskclock.AlarmUtils;
27import com.android.deskclock.DeskClock;
28import com.android.deskclock.Log;
29import com.android.deskclock.R;
30import com.android.deskclock.provider.Alarm;
31import com.android.deskclock.provider.AlarmInstance;
32
33import java.util.Calendar;
34
35public final class AlarmNotifications {
36    // System intent action to notify that we change the alarm text.
37    public static final String SYSTEM_ALARM_CHANGE_ACTION = "android.intent.action.ALARM_CHANGED";
38
39    public static void broadcastNextAlarm(Context context, AlarmInstance instance)  {
40        String timeString = "";
41        boolean showStatusIcon = false;
42        if (instance != null) {
43            timeString = AlarmUtils.getFormattedTime(context, instance.getAlarmTime());
44            showStatusIcon = true;
45        }
46
47        // Set and notify next alarm text to system
48        Log.i("Displaying next alarm time: \'" + timeString + '\'');
49        Settings.System.putString(context.getContentResolver(),
50                Settings.System.NEXT_ALARM_FORMATTED,
51                timeString);
52        Intent alarmChanged = new Intent(SYSTEM_ALARM_CHANGE_ACTION);
53        alarmChanged.putExtra("alarmSet", showStatusIcon);
54        context.sendBroadcast(alarmChanged);
55    }
56
57    public static void showLowPriorityNotification(Context context, AlarmInstance instance) {
58        Log.v("Displaying low priority notification for alarm instance: " + instance.mId);
59        NotificationManager nm = (NotificationManager)
60                context.getSystemService(Context.NOTIFICATION_SERVICE);
61
62        Resources resources = context.getResources();
63        Notification.Builder notification = new Notification.Builder(context)
64                .setContentTitle(resources.getString(R.string.alarm_alert_predismiss_title))
65                .setContentText(AlarmUtils.getAlarmText(context, instance))
66                .setSmallIcon(R.drawable.stat_notify_alarm)
67                .setOngoing(false)
68                .setAutoCancel(false)
69                .setPriority(Notification.PRIORITY_DEFAULT);
70
71        // Setup up hide notification
72        Intent hideIntent = AlarmStateManager.createStateChangeIntent(context, "DELETE_TAG",
73                instance, AlarmInstance.HIDE_NOTIFICATION_STATE);
74        notification.setDeleteIntent(PendingIntent.getBroadcast(context, instance.hashCode(),
75                hideIntent, PendingIntent.FLAG_UPDATE_CURRENT));
76
77        // Setup up dismiss action
78        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
79                instance, AlarmInstance.DISMISSED_STATE);
80        notification.addAction(android.R.drawable.ic_menu_close_clear_cancel,
81                resources.getString(R.string.alarm_alert_dismiss_now_text),
82                PendingIntent.getBroadcast(context, instance.hashCode(),
83                        dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
84
85        // Setup content action if instance is owned by alarm
86        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
87        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, instance.mAlarmId);
88        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
89        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
90        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
91                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
92
93        nm.cancel(instance.hashCode());
94        nm.notify(instance.hashCode(), notification.build());
95    }
96
97    public static void showHighPriorityNotification(Context context, AlarmInstance instance) {
98        Log.v("Displaying high priority notification for alarm instance: " + instance.mId);
99        NotificationManager nm = (NotificationManager)
100                context.getSystemService(Context.NOTIFICATION_SERVICE);
101
102        Resources resources = context.getResources();
103        Notification.Builder notification = new Notification.Builder(context)
104                .setContentTitle(resources.getString(R.string.alarm_alert_predismiss_title))
105                .setContentText(AlarmUtils.getAlarmText(context, instance))
106                .setSmallIcon(R.drawable.stat_notify_alarm)
107                .setOngoing(true)
108                .setAutoCancel(false)
109                .setPriority(Notification.PRIORITY_HIGH);
110
111        // Setup up dismiss action
112        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
113                instance, AlarmInstance.DISMISSED_STATE);
114        notification.addAction(android.R.drawable.ic_menu_close_clear_cancel,
115                resources.getString(R.string.alarm_alert_dismiss_now_text),
116                PendingIntent.getBroadcast(context, instance.hashCode(),
117                        dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
118
119        // Setup content action if instance is owned by alarm
120        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
121        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, instance.mAlarmId);
122        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
123        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
124        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
125                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
126
127        nm.cancel(instance.hashCode());
128        nm.notify(instance.hashCode(), notification.build());
129    }
130
131    public static void showSnoozeNotification(Context context, AlarmInstance instance) {
132        Log.v("Displaying snoozed notification for alarm instance: " + instance.mId);
133        NotificationManager nm = (NotificationManager)
134                context.getSystemService(Context.NOTIFICATION_SERVICE);
135
136        Resources resources = context.getResources();
137        Notification.Builder notification = new Notification.Builder(context)
138                .setContentTitle(instance.getLabelOrDefault(context))
139                .setContentText(resources.getString(R.string.alarm_alert_snooze_until,
140                        AlarmUtils.getFormattedTime(context, instance.getAlarmTime())))
141                .setSmallIcon(R.drawable.stat_notify_alarm)
142                .setOngoing(true)
143                .setAutoCancel(false)
144                .setPriority(Notification.PRIORITY_MAX);
145
146        // Setup up dismiss action
147        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
148                instance, AlarmInstance.DISMISSED_STATE);
149        notification.addAction(android.R.drawable.ic_menu_close_clear_cancel,
150                resources.getString(R.string.alarm_alert_dismiss_text),
151                PendingIntent.getBroadcast(context, instance.hashCode(),
152                        dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
153
154        // Setup content action if instance is owned by alarm
155        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
156        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
157        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
158        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
159        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
160                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
161        nm.cancel(instance.hashCode());
162        nm.notify(instance.hashCode(), notification.build());
163    }
164
165    public static void showMissedNotification(Context context, AlarmInstance instance) {
166        Log.v("Displaying missed notification for alarm instance: " + instance.mId);
167        NotificationManager nm = (NotificationManager)
168                context.getSystemService(Context.NOTIFICATION_SERVICE);
169
170        String label = instance.mLabel;
171        String alarmTime = AlarmUtils.getFormattedTime(context, instance.getAlarmTime());
172        String contextText = instance.mLabel.isEmpty() ? alarmTime :
173                context.getString(R.string.alarm_missed_text, alarmTime, label);
174        Notification.Builder notification = new Notification.Builder(context)
175                .setContentTitle(context.getString(R.string.alarm_missed_title))
176                .setContentText(contextText)
177                .setSmallIcon(R.drawable.stat_notify_alarm)
178                .setAutoCancel(true)
179                .setPriority(Notification.PRIORITY_HIGH)
180                .setDefaults(Notification.DEFAULT_ALL);
181
182        // Setup dismiss intent
183        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
184                instance, AlarmInstance.DISMISSED_STATE);
185        notification.setDeleteIntent(PendingIntent.getBroadcast(context, instance.hashCode(),
186                dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
187
188        // Setup content intent
189        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
190        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
191        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
192        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
193        context.startActivity(viewAlarmIntent);
194        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
195                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
196
197        nm.cancel(instance.hashCode());
198        nm.notify(instance.hashCode(), notification.build());
199    }
200
201    public static void showAlarmNotification(Context context, AlarmInstance instance) {
202        Log.v("Displaying alarm notification for alarm instance: " + instance.mId);
203        NotificationManager nm = (NotificationManager)
204                context.getSystemService(Context.NOTIFICATION_SERVICE);
205
206        // Close dialogs and window shade, so this will display
207        context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
208
209        Resources resources = context.getResources();
210        Notification.Builder notification = new Notification.Builder(context)
211                .setContentTitle(instance.getLabelOrDefault(context))
212                .setContentText(AlarmUtils.getFormattedTime(context, instance.getAlarmTime()))
213                .setSmallIcon(R.drawable.stat_notify_alarm)
214                .setOngoing(true)
215                .setAutoCancel(false)
216                .setDefaults(Notification.DEFAULT_LIGHTS)
217                .setWhen(0);
218
219        // Setup Snooze Action
220        Intent snoozeIntent = AlarmStateManager.createStateChangeIntent(context, "SNOOZE_TAG",
221                instance, AlarmInstance.SNOOZE_STATE);
222        PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(context, instance.hashCode(),
223                snoozeIntent,
224                PendingIntent.FLAG_UPDATE_CURRENT);
225        notification.addAction(R.drawable.stat_notify_alarm,
226                resources.getString(R.string.alarm_alert_snooze_text), snoozePendingIntent);
227
228        // Setup Dismiss Action
229        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
230                instance, AlarmInstance.DISMISSED_STATE);
231        PendingIntent dismissPendingIntent = PendingIntent.getBroadcast(context,
232                instance.hashCode(), dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT);
233        notification.addAction(android.R.drawable.ic_menu_close_clear_cancel,
234                resources.getString(R.string.alarm_alert_dismiss_text),
235                dismissPendingIntent);
236
237        // Setup Content Action
238        Intent contentIntent = AlarmInstance.createIntent(context, AlarmActivity.class,
239                instance.mId);
240        notification.setContentIntent(PendingIntent.getActivity(context,
241                instance.hashCode(), contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
242
243        // Setup fullscreen intent
244        Intent fullScreenIntent = AlarmInstance.createIntent(context, AlarmActivity.class,
245                instance.mId);
246        // set action, so we can be different then content pending intent
247        fullScreenIntent.setAction("fullscreen_activity");
248        fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
249                Intent.FLAG_ACTIVITY_NO_USER_ACTION);
250        notification.setFullScreenIntent(PendingIntent.getActivity(context,
251                instance.hashCode(), fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT), true);
252        notification.setPriority(Notification.PRIORITY_MAX);
253
254        nm.cancel(instance.hashCode());
255        nm.notify(instance.hashCode(), notification.build());
256    }
257
258    public static void clearNotification(Context context, AlarmInstance instance) {
259        Log.v("Clearing notifications for alarm instance: " + instance.mId);
260        NotificationManager nm = (NotificationManager)
261                context.getSystemService(Context.NOTIFICATION_SERVICE);
262        nm.cancel(instance.hashCode());
263    }
264}
265