NotificationManager.java revision 69ddab4575ff684c533c995e07ca15fe18543fc0
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 2269ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkeyimport android.os.RemoteException; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class to notify the user of events that happen. This is how you tell 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the user that something has happened in the background. {@more} 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notifications can take different forms: 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>A persistent icon that goes in the status bar and is accessible 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * through the launcher, (when the user selects it, a designated Intent 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be launched),</li> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Turning on or flashing LEDs on the device, or</li> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Alerting the user by flashing the backlight, playing a sound, 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or vibrating.</li> 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 41b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * Each of the notify methods takes an int id parameter and optionally a 42b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * {@link String} tag parameter, which may be {@code null}. These parameters 43b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * are used to form a pair (tag, id), or ({@code null}, id) if tag is 44b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * unspecified. This pair identifies this notification from your app to the 45b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * system, so that pair should be unique within your app. If you call one 46b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * of the notify methods with a (tag, id) pair that is currently active and 47b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * a new set of notification parameters, it will be updated. For example, 48b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * if you pass a new status bar icon, the old icon in the status bar will 49b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * be replaced with the new one. This is also the same tag and id you pass 50b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * to the {@link #cancel(int)} or {@link #cancel(String, int)} method to clear 51b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * this notification. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You do not instantiate this class directly; instead, retrieve it through 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService}. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 57558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <div class="special reference"> 58558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <h3>Developer Guides</h3> 59558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <p>For a guide to creating notifications, read the 60558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Status Bar Notifications</a> 61558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * developer guide.</p> 62558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * </div> 63558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.app.Notification 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.content.Context#getSystemService 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class NotificationManager 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String TAG = "NotificationManager"; 7043a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato private static boolean localLOGV = false; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static INotificationManager sService; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 74d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn /** @hide */ 75d8a43f61680bacf0d4b52a03ff3c7a07307377fcDianne Hackborn static public INotificationManager getService() 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService("notification"); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = INotificationManager.Stub.asInterface(b); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ NotificationManager(Context context, Handler handler) 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9069ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkey /** {@hide} */ 9169ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkey public static NotificationManager from(Context context) { 9269ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkey return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 9369ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkey } 9469ddab4575ff684c533c995e07ca15fe18543fc0Jeff Sharkey 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 96e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * Post a notification to be shown in the status bar. If a notification with 97e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * the same id has already been posted by your application and has not yet been canceled, it 98e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * will be replaced by the updated information. 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param id An identifier for this notification unique within your 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application. 102e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * @param notification A {@link Notification} object describing what to show the user. Must not 103e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * be null. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notify(int id, Notification notification) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1076ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana notify(null, id, notification); 1086ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana } 1096ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana 1106ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana /** 111e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * Post a notification to be shown in the status bar. If a notification with 112e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * the same tag and id has already been posted by your application and has not yet been 113e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * canceled, it will be replaced by the updated information. 1146ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana * 115b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * @param tag A string identifier for this notification. May be {@code null}. 116b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * @param id An identifier for this notification. The pair (tag, id) must be unique 117b97c34948e5fcb765f46d655bbf358d06ef89a67Peter Collingbourne * within your application. 118e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * @param notification A {@link Notification} object describing what to 119e97a3bce3c91d76b623f57d309f7bf74947494daDaniel Sandler * show the user. Must not be null. 1206ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana */ 1216ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana public void notify(String tag, int id, Notification notification) 1226ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] idOut = new int[1]; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INotificationManager service = getService(); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = mContext.getPackageName(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1286ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana service.enqueueNotificationWithTag(pkg, tag, id, notification, idOut); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id != idOut[0]) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "notify: id corrupted: sent " + id + ", got back " + idOut[0]); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cancel a previously shown notification. If it's transient, the view 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be hidden. If it's persistent, it will be removed from the status 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * bar. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void cancel(int id) 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1436ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana cancel(null, id); 1446ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana } 1456ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana 1466ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana /** 1476ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana * Cancel a previously shown notification. If it's transient, the view 1486ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana * will be hidden. If it's persistent, it will be removed from the status 1496ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana * bar. 1506ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana */ 1516ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana public void cancel(String tag, int id) 1526ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INotificationManager service = getService(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = mContext.getPackageName(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.v(TAG, pkg + ": cancel(" + id + ")"); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1576ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana service.cancelNotificationWithTag(pkg, tag, id); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cancel all previously shown notifications. See {@link #cancel} for the 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * detailed behavior. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void cancelAll() 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INotificationManager service = getService(); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg = mContext.getPackageName(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localLOGV) Log.v(TAG, pkg + ": cancelAll()"); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service.cancelAllNotifications(pkg); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 179