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