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