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