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 android.app; 18 19 import android.content.Context; 20 import android.os.Handler; 21 import android.os.IBinder; 22 import android.os.RemoteException; 23 import android.os.ServiceManager; 24 import android.os.StrictMode; 25 import android.os.UserHandle; 26 import android.util.Log; 27 28 /** 29 * Class to notify the user of events that happen. This is how you tell 30 * the user that something has happened in the background. {@more} 31 * 32 * Notifications can take different forms: 33 * <ul> 34 * <li>A persistent icon that goes in the status bar and is accessible 35 * through the launcher, (when the user selects it, a designated Intent 36 * can be launched),</li> 37 * <li>Turning on or flashing LEDs on the device, or</li> 38 * <li>Alerting the user by flashing the backlight, playing a sound, 39 * or vibrating.</li> 40 * </ul> 41 * 42 * <p> 43 * Each of the notify methods takes an int id parameter and optionally a 44 * {@link String} tag parameter, which may be {@code null}. These parameters 45 * are used to form a pair (tag, id), or ({@code null}, id) if tag is 46 * unspecified. This pair identifies this notification from your app to the 47 * system, so that pair should be unique within your app. If you call one 48 * of the notify methods with a (tag, id) pair that is currently active and 49 * a new set of notification parameters, it will be updated. For example, 50 * if you pass a new status bar icon, the old icon in the status bar will 51 * be replaced with the new one. This is also the same tag and id you pass 52 * to the {@link #cancel(int)} or {@link #cancel(String, int)} method to clear 53 * this notification. 54 * 55 * <p> 56 * You do not instantiate this class directly; instead, retrieve it through 57 * {@link android.content.Context#getSystemService}. 58 * 59 * <div class="special reference"> 60 * <h3>Developer Guides</h3> 61 * <p>For a guide to creating notifications, read the 62 * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Status Bar Notifications</a> 63 * developer guide.</p> 64 * </div> 65 * 66 * @see android.app.Notification 67 * @see android.content.Context#getSystemService 68 */ 69 public class NotificationManager 70 { 71 private static String TAG = "NotificationManager"; 72 private static boolean localLOGV = false; 73 74 private static INotificationManager sService; 75 76 /** @hide */ 77 static public INotificationManager getService() 78 { 79 if (sService != null) { 80 return sService; 81 } 82 IBinder b = ServiceManager.getService("notification"); 83 sService = INotificationManager.Stub.asInterface(b); 84 return sService; 85 } 86 87 /*package*/ NotificationManager(Context context, Handler handler) 88 { 89 mContext = context; 90 } 91 92 /** {@hide} */ 93 public static NotificationManager from(Context context) { 94 return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 95 } 96 97 /** 98 * Post a notification to be shown in the status bar. If a notification with 99 * the same id has already been posted by your application and has not yet been canceled, it 100 * will be replaced by the updated information. 101 * 102 * @param id An identifier for this notification unique within your 103 * application. 104 * @param notification A {@link Notification} object describing what to show the user. Must not 105 * be null. 106 */ 107 public void notify(int id, Notification notification) 108 { 109 notify(null, id, notification); 110 } 111 112 /** 113 * Post a notification to be shown in the status bar. If a notification with 114 * the same tag and id has already been posted by your application and has not yet been 115 * canceled, it will be replaced by the updated information. 116 * 117 * @param tag A string identifier for this notification. May be {@code null}. 118 * @param id An identifier for this notification. The pair (tag, id) must be unique 119 * within your application. 120 * @param notification A {@link Notification} object describing what to 121 * show the user. Must not be null. 122 */ 123 public void notify(String tag, int id, Notification notification) 124 { 125 int[] idOut = new int[1]; 126 INotificationManager service = getService(); 127 String pkg = mContext.getPackageName(); 128 if (notification.sound != null) { 129 notification.sound = notification.sound.getCanonicalUri(); 130 if (StrictMode.vmFileUriExposureEnabled()) { 131 notification.sound.checkFileUriExposed("Notification.sound"); 132 } 133 } 134 if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); 135 try { 136 service.enqueueNotificationWithTag(pkg, mContext.getBasePackageName(), tag, id, 137 notification, idOut, UserHandle.myUserId()); 138 if (id != idOut[0]) { 139 Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]); 140 } 141 } catch (RemoteException e) { 142 } 143 } 144 145 /** 146 * @hide 147 */ 148 public void notifyAsUser(String tag, int id, Notification notification, UserHandle user) 149 { 150 int[] idOut = new int[1]; 151 INotificationManager service = getService(); 152 String pkg = mContext.getPackageName(); 153 if (notification.sound != null) { 154 notification.sound = notification.sound.getCanonicalUri(); 155 if (StrictMode.vmFileUriExposureEnabled()) { 156 notification.sound.checkFileUriExposed("Notification.sound"); 157 } 158 } 159 if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); 160 try { 161 service.enqueueNotificationWithTag(pkg, mContext.getBasePackageName(), tag, id, 162 notification, idOut, user.getIdentifier()); 163 if (id != idOut[0]) { 164 Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]); 165 } 166 } catch (RemoteException e) { 167 } 168 } 169 170 /** 171 * Cancel a previously shown notification. If it's transient, the view 172 * will be hidden. If it's persistent, it will be removed from the status 173 * bar. 174 */ 175 public void cancel(int id) 176 { 177 cancel(null, id); 178 } 179 180 /** 181 * Cancel a previously shown notification. If it's transient, the view 182 * will be hidden. If it's persistent, it will be removed from the status 183 * bar. 184 */ 185 public void cancel(String tag, int id) 186 { 187 INotificationManager service = getService(); 188 String pkg = mContext.getPackageName(); 189 if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")"); 190 try { 191 service.cancelNotificationWithTag(pkg, tag, id, UserHandle.myUserId()); 192 } catch (RemoteException e) { 193 } 194 } 195 196 /** 197 * @hide 198 */ 199 public void cancelAsUser(String tag, int id, UserHandle user) 200 { 201 INotificationManager service = getService(); 202 String pkg = mContext.getPackageName(); 203 if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")"); 204 try { 205 service.cancelNotificationWithTag(pkg, tag, id, user.getIdentifier()); 206 } catch (RemoteException e) { 207 } 208 } 209 210 /** 211 * Cancel all previously shown notifications. See {@link #cancel} for the 212 * detailed behavior. 213 */ 214 public void cancelAll() 215 { 216 INotificationManager service = getService(); 217 String pkg = mContext.getPackageName(); 218 if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); 219 try { 220 service.cancelAllNotifications(pkg, UserHandle.myUserId()); 221 } catch (RemoteException e) { 222 } 223 } 224 225 private Context mContext; 226 } 227