1 /*
2  * Copyright (C) 2007 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  */
16 
17 package com.android.calendar.alerts;
18 
19 import android.app.Notification;
20 import android.app.PendingIntent;
21 import android.app.Service;
22 import android.content.BroadcastReceiver;
23 import android.content.ContentUris;
24 import android.content.Context;
25 import android.content.Intent;
26 import android.content.res.Resources;
27 import android.database.Cursor;
28 import android.net.Uri;
29 import android.os.Handler;
30 import android.os.HandlerThread;
31 import android.os.PowerManager;
32 import android.provider.CalendarContract.Attendees;
33 import android.provider.CalendarContract.Calendars;
34 import android.provider.CalendarContract.Events;
35 import android.telephony.TelephonyManager;
36 import android.text.Spannable;
37 import android.text.SpannableStringBuilder;
38 import android.text.TextUtils;
39 import android.text.style.RelativeSizeSpan;
40 import android.text.style.TextAppearanceSpan;
41 import android.text.style.URLSpan;
42 import android.util.Log;
43 import android.view.View;
44 import android.widget.RemoteViews;
45 
46 import com.android.calendar.R;
47 import com.android.calendar.Utils;
48 import com.android.calendar.alerts.AlertService.NotificationWrapper;
49 
50 import java.util.ArrayList;
51 import java.util.List;
52 import java.util.regex.Pattern;
53 
54 /**
55  * Receives android.intent.action.EVENT_REMINDER intents and handles
56  * event reminders.  The intent URI specifies an alert id in the
57  * CalendarAlerts database table.  This class also receives the
58  * BOOT_COMPLETED intent so that it can add a status bar notification
59  * if there are Calendar event alarms that have not been dismissed.
60  * It also receives the TIME_CHANGED action so that it can fire off
61  * snoozed alarms that have become ready.  The real work is done in
62  * the AlertService class.
63  *
64  * To trigger this code after pushing the apk to device:
65  * adb shell am broadcast -a "android.intent.action.EVENT_REMINDER"
66  *    -n "com.android.calendar/.alerts.AlertReceiver"
67  */
68 public class AlertReceiver extends BroadcastReceiver {
69     private static final String TAG = "AlertReceiver";
70 
71     // The broadcast for notification refreshes scheduled by the app. This is to
72     // distinguish the EVENT_REMINDER broadcast sent by the provider.
73     public static final String EVENT_REMINDER_APP_ACTION =
74             "com.android.calendar.EVENT_REMINDER_APP";
75 
76     public static final String ACTION_DISMISS_OLD_REMINDERS = "removeOldReminders";
77 
78     @Override
onReceive(final Context context, final Intent intent)79     public void onReceive(final Context context, final Intent intent) {
80         if (AlertService.DEBUG) {
81             Log.d(TAG, "onReceive: a=" + intent.getAction() + " " + intent.toString());
82         }
83         closeNotificationShade(context);
84     }
85 
makeBasicNotification(Context context, String title, String summaryText, long startMillis, long endMillis, long eventId, int notificationId, boolean doPopup, int priority)86     public static NotificationWrapper makeBasicNotification(Context context, String title,
87             String summaryText, long startMillis, long endMillis, long eventId,
88             int notificationId, boolean doPopup, int priority) {
89         Notification n = buildBasicNotification(new Notification.Builder(context),
90                 context, title, summaryText, startMillis, endMillis, eventId, notificationId,
91                 doPopup, priority, false);
92         return new NotificationWrapper(n, notificationId, eventId, startMillis, endMillis, doPopup);
93     }
94 
buildBasicNotification(Notification.Builder notificationBuilder, Context context, String title, String summaryText, long startMillis, long endMillis, long eventId, int notificationId, boolean doPopup, int priority, boolean addActionButtons)95     private static Notification buildBasicNotification(Notification.Builder notificationBuilder,
96             Context context, String title, String summaryText, long startMillis, long endMillis,
97             long eventId, int notificationId, boolean doPopup, int priority,
98             boolean addActionButtons) {
99         Resources resources = context.getResources();
100         if (title == null || title.length() == 0) {
101             title = resources.getString(R.string.no_title_label);
102         }
103 
104         // Create the base notification.
105         notificationBuilder.setContentTitle(title);
106         notificationBuilder.setContentText(summaryText);
107         notificationBuilder.setSmallIcon(R.drawable.stat_notify_calendar);
108         if (Utils.isJellybeanOrLater()) {
109             // Turn off timestamp.
110             notificationBuilder.setWhen(0);
111 
112             // Should be one of the values in Notification (ie. Notification.PRIORITY_HIGH, etc).
113             // A higher priority will encourage notification manager to expand it.
114             notificationBuilder.setPriority(priority);
115         }
116         return notificationBuilder.getNotification();
117     }
118 
closeNotificationShade(Context context)119     private void closeNotificationShade(Context context) {
120         Intent closeNotificationShadeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
121         context.sendBroadcast(closeNotificationShadeIntent);
122     }
123 }
124