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