• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package android.service.notification;
18 
19 import android.app.Notification;
20 import android.os.Parcel;
21 import android.os.Parcelable;
22 import 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  */
28 public 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
StatusBarNotification(String pkg, int id, String tag, int uid, int initialPid, int score, Notification notification)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 */
StatusBarNotification(String pkg, int id, String tag, int uid, int initialPid, int score, Notification notification, UserHandle user)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 */
StatusBarNotification(String pkg, String basePkg, int id, String tag, int uid, int initialPid, int score, Notification notification, UserHandle user)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 
StatusBarNotification(String pkg, String basePkg, int id, String tag, int uid, int initialPid, int score, Notification notification, UserHandle user, long postTime)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 
StatusBarNotification(Parcel in)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 
writeToParcel(Parcel out, int flags)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 
describeContents()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      */
cloneLight()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
clone()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
toString()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      */
isOngoing()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      */
isClearable()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. */
getUserId()184     public int getUserId() {
185         return this.user.getIdentifier();
186     }
187 
188     /** The package of the app that posted the notification. */
getPackageName()189     public String getPackageName() {
190         return pkg;
191     }
192 
193     /** The id supplied to {@link android.app.NotificationManager#notify(int,Notification)}. */
getId()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. */
getTag()200     public String getTag() {
201         return tag;
202     }
203 
204     /** The notifying app's calling uid. @hide */
getUid()205     public int getUid() {
206         return uid;
207     }
208 
209     /** The notifying app's base package. @hide */
getBasePkg()210     public String getBasePkg() {
211         return basePkg;
212     }
213 
214     /** @hide */
getInitialPid()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)}. */
getNotification()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      */
getUser()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      */
getPostTime()236     public long getPostTime() {
237         return postTime;
238     }
239 
240     /** @hide */
getScore()241     public int getScore() {
242         return score;
243     }
244 }
245