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