StatusBarNotification.java revision 26510320646339fc59e01d392f96efeeac6d91dd
1/*
2 * Copyright (C) 2008 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.service.notification;
18
19import android.app.Notification;
20import android.os.Parcel;
21import android.os.Parcelable;
22import android.os.UserHandle;
23
24/**
25 * Class encapsulating a Notification. Sent by the NotificationManagerService to clients including
26 * the status bar and any {@link android.service.notification.NotificationListenerService}s.
27 */
28public class StatusBarNotification implements Parcelable {
29    private final String pkg;
30    private final int id;
31    private final String tag;
32
33    private final int uid;
34    private final String basePkg;
35    private final int initialPid;
36    // TODO: make this field private and move callers to an accessor that
37    // ensures sourceUser is applied.
38
39    private final Notification notification;
40    private final UserHandle user;
41    private final long postTime;
42
43    private final int score;
44
45    /** This is temporarily needed for the JB MR1 PDK.
46     * @hide */
47    @Deprecated
48    public StatusBarNotification(String pkg, int id, String tag, int uid, int initialPid, int score,
49            Notification notification) {
50        this(pkg, id, tag, uid, initialPid, score, notification, UserHandle.OWNER);
51    }
52
53    /** @hide */
54    public StatusBarNotification(String pkg, int id, String tag, int uid, int initialPid, int score,
55            Notification notification, UserHandle user) {
56        this(pkg, null, id, tag, uid, initialPid, score, notification, user);
57    }
58
59    /** @hide */
60    public StatusBarNotification(String pkg, String basePkg, int id, String tag, int uid,
61            int initialPid, int score, Notification notification, UserHandle user) {
62        this(pkg, basePkg, id, tag, uid, initialPid, score, notification, user,
63                System.currentTimeMillis());
64    }
65
66    public StatusBarNotification(String pkg, String basePkg, int id, String tag, int uid,
67            int initialPid, int score, Notification notification, UserHandle user,
68            long postTime) {
69        if (pkg == null) throw new NullPointerException();
70        if (notification == null) throw new NullPointerException();
71
72        this.pkg = pkg;
73        this.basePkg = pkg;
74        this.id = id;
75        this.tag = tag;
76        this.uid = uid;
77        this.initialPid = initialPid;
78        this.score = score;
79        this.notification = notification;
80        this.user = user;
81        this.notification.setUser(user);
82
83        this.postTime = postTime;
84    }
85
86    public StatusBarNotification(Parcel in) {
87        this.pkg = in.readString();
88        this.basePkg = in.readString();
89        this.id = in.readInt();
90        if (in.readInt() != 0) {
91            this.tag = in.readString();
92        } else {
93            this.tag = null;
94        }
95        this.uid = in.readInt();
96        this.initialPid = in.readInt();
97        this.score = in.readInt();
98        this.notification = new Notification(in);
99        this.user = UserHandle.readFromParcel(in);
100        this.notification.setUser(this.user);
101        this.postTime = in.readLong();
102    }
103
104    public void writeToParcel(Parcel out, int flags) {
105        out.writeString(this.pkg);
106        out.writeString(this.basePkg);
107        out.writeInt(this.id);
108        if (this.tag != null) {
109            out.writeInt(1);
110            out.writeString(this.tag);
111        } else {
112            out.writeInt(0);
113        }
114        out.writeInt(this.uid);
115        out.writeInt(this.initialPid);
116        out.writeInt(this.score);
117        this.notification.writeToParcel(out, flags);
118        user.writeToParcel(out, flags);
119
120        out.writeLong(this.postTime);
121    }
122
123    public int describeContents() {
124        return 0;
125    }
126
127    public static final Parcelable.Creator<StatusBarNotification> CREATOR
128            = new Parcelable.Creator<StatusBarNotification>()
129    {
130        public StatusBarNotification createFromParcel(Parcel parcel)
131        {
132            return new StatusBarNotification(parcel);
133        }
134
135        public StatusBarNotification[] newArray(int size)
136        {
137            return new StatusBarNotification[size];
138        }
139    };
140
141    /**
142     * @hide
143     */
144    public StatusBarNotification cloneLight() {
145        final Notification no = new Notification();
146        this.notification.cloneInto(no, false); // light copy
147        return new StatusBarNotification(this.pkg, this.basePkg,
148                this.id, this.tag, this.uid, this.initialPid,
149                this.score, no, this.user, this.postTime);
150    }
151
152    @Override
153    public StatusBarNotification clone() {
154        return new StatusBarNotification(this.pkg, this.basePkg,
155                this.id, this.tag, this.uid, this.initialPid,
156                this.score, this.notification.clone(), this.user, this.postTime);
157    }
158
159    @Override
160    public String toString() {
161        return String.format(
162                "StatusBarNotification(pkg=%s user=%s id=%d tag=%s score=%d: %s)",
163                this.pkg, this.user, this.id, this.tag,
164                this.score, this.notification);
165    }
166
167    /** Convenience method to check the notification's flags for
168     * {@link Notification#FLAG_ONGOING_EVENT}.
169     */
170    public boolean isOngoing() {
171        return (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0;
172    }
173
174    /** Convenience method to check the notification's flags for
175     * either {@link Notification#FLAG_ONGOING_EVENT} or
176     * {@link Notification#FLAG_NO_CLEAR}.
177     */
178    public boolean isClearable() {
179        return ((notification.flags & Notification.FLAG_ONGOING_EVENT) == 0)
180                && ((notification.flags & Notification.FLAG_NO_CLEAR) == 0);
181    }
182
183    /** Returns a userHandle for the instance of the app that posted this notification. */
184    public int getUserId() {
185        return this.user.getIdentifier();
186    }
187
188    /** The package of the app that posted the notification. */
189    public String getPackageName() {
190        return pkg;
191    }
192
193    /** The id supplied to {@link android.app.NotificationManager#notify(int,Notification)}. */
194    public int getId() {
195        return id;
196    }
197
198    /** The tag supplied to {@link android.app.NotificationManager#notify(int,Notification)},
199     * or null if no tag was specified. */
200    public String getTag() {
201        return tag;
202    }
203
204    /** The notifying app's calling uid. @hide */
205    public int getUid() {
206        return uid;
207    }
208
209    /** The notifying app's base package. @hide */
210    public String getBasePkg() {
211        return basePkg;
212    }
213
214    /** @hide */
215    public int getInitialPid() {
216        return initialPid;
217    }
218
219    /** The {@link android.app.Notification} supplied to
220     * {@link android.app.NotificationManager#notify(int,Notification)}. */
221    public Notification getNotification() {
222        return notification;
223    }
224
225    /**
226     * The {@link android.os.UserHandle} for whom this notification is intended.
227     * @hide
228     */
229    public UserHandle getUser() {
230        return user;
231    }
232
233    /** The time (in {@link System#currentTimeMillis} time) the notification was posted,
234     * which may be different than {@link android.app.Notification#when}.
235     */
236    public long getPostTime() {
237        return postTime;
238    }
239
240    /** @hide */
241    public int getScore() {
242        return score;
243    }
244}
245