118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato/*
218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * Copyright (C) 2008 The Android Open Source Project
318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato *
418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * you may not use this file except in compliance with the License.
618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * You may obtain a copy of the License at
718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato *
818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato *
1018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * Unless required by applicable law or agreed to in writing, software
1118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
1218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * See the License for the specific language governing permissions and
1418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * limitations under the License.
1518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato */
1618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
175feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandlerpackage android.service.notification;
1818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
1918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratoimport android.app.Notification;
2068079d54f3690885df9c5bbb691090633f3ef541Dan Sandlerimport android.content.Context;
2168079d54f3690885df9c5bbb691090633f3ef541Dan Sandlerimport android.content.pm.ApplicationInfo;
2268079d54f3690885df9c5bbb691090633f3ef541Dan Sandlerimport android.content.pm.PackageManager;
2318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratoimport android.os.Parcel;
2418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratoimport android.os.Parcelable;
25f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
2618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
272561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler/**
28fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler * Class encapsulating a Notification. Sent by the NotificationManagerService to clients including
295feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler * the status bar and any {@link android.service.notification.NotificationListenerService}s.
302561b0b10a55841a08e0e1d467e73e10b1bf256dDaniel Sandler */
3118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratopublic class StatusBarNotification implements Parcelable {
32e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final String pkg;
33e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final int id;
34e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final String tag;
35a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock    private final String key;
36e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    private String groupKey;
37e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    private String overrideGroupKey;
385feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler
39e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final int uid;
408fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer    private final String opPkg;
41e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final int initialPid;
42e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final Notification notification;
43e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final UserHandle user;
44e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    private final long postTime;
456d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey
4668079d54f3690885df9c5bbb691090633f3ef541Dan Sandler    private Context mContext; // used for inflation & icon expansion
475feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler
485feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler    /** @hide */
498fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer    public StatusBarNotification(String pkg, String opPkg, int id, String tag, int uid,
50fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            int initialPid, int score, Notification notification, UserHandle user) {
518fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer        this(pkg, opPkg, id, tag, uid, initialPid, score, notification, user,
52fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler                System.currentTimeMillis());
53fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    }
54fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler
55e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    /** @hide */
56e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    public StatusBarNotification(String pkg, String opPkg, int id, String tag, int uid,
57e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            int initialPid, Notification notification, UserHandle user, String overrideGroupKey,
58e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            long postTime) {
59e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        if (pkg == null) throw new NullPointerException();
60e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        if (notification == null) throw new NullPointerException();
61e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds
62e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.pkg = pkg;
63e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.opPkg = opPkg;
64e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.id = id;
65e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.tag = tag;
66e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.uid = uid;
67e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.initialPid = initialPid;
68e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.notification = notification;
69e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.user = user;
70e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.postTime = postTime;
71e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.overrideGroupKey = overrideGroupKey;
72e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.key = key();
73e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.groupKey = groupKey();
74e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    }
75e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds
768fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer    public StatusBarNotification(String pkg, String opPkg, int id, String tag, int uid,
77fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            int initialPid, int score, Notification notification, UserHandle user,
78fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            long postTime) {
7918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        if (pkg == null) throw new NullPointerException();
8018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        if (notification == null) throw new NullPointerException();
8118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
8218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.pkg = pkg;
838fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer        this.opPkg = opPkg;
8418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.id = id;
8518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.tag = tag;
869d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        this.uid = uid;
879d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        this.initialPid = initialPid;
8818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.notification = notification;
896d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        this.user = user;
90fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler        this.postTime = postTime;
91a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock        this.key = key();
921031c974855ff4117a6d7866e664295786840319Chris Wren        this.groupKey = groupKey();
9318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    }
9418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
9518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public StatusBarNotification(Parcel in) {
9618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.pkg = in.readString();
978fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer        this.opPkg = in.readString();
9818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.id = in.readInt();
9918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        if (in.readInt() != 0) {
10018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            this.tag = in.readString();
10118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        } else {
10218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            this.tag = null;
10318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
1049d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        this.uid = in.readInt();
1059d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        this.initialPid = in.readInt();
10618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.notification = new Notification(in);
1076d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        this.user = UserHandle.readFromParcel(in);
108fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler        this.postTime = in.readLong();
109e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        if (in.readInt() != 0) {
110e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            this.overrideGroupKey = in.readString();
111e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        } else {
112e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            this.overrideGroupKey = null;
113e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
114a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock        this.key = key();
1151031c974855ff4117a6d7866e664295786840319Chris Wren        this.groupKey = groupKey();
116a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock    }
117a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock
118a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock    private String key() {
119e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        String sbnKey = user.getIdentifier() + "|" + pkg + "|" + id + "|" + tag + "|" + uid;
120e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        if (overrideGroupKey != null && getNotification().isGroupSummary()) {
121e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            sbnKey = sbnKey + "|" + overrideGroupKey;
122e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
123e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        return sbnKey;
12418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    }
12518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
1261031c974855ff4117a6d7866e664295786840319Chris Wren    private String groupKey() {
127e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        if (overrideGroupKey != null) {
128e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            return user.getIdentifier() + "|" + pkg + "|" + "g:" + overrideGroupKey;
129e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
1301031c974855ff4117a6d7866e664295786840319Chris Wren        final String group = getNotification().getGroup();
1311031c974855ff4117a6d7866e664295786840319Chris Wren        final String sortKey = getNotification().getSortKey();
1321031c974855ff4117a6d7866e664295786840319Chris Wren        if (group == null && sortKey == null) {
1331031c974855ff4117a6d7866e664295786840319Chris Wren            // a group of one
1341031c974855ff4117a6d7866e664295786840319Chris Wren            return key;
1351031c974855ff4117a6d7866e664295786840319Chris Wren        }
1361031c974855ff4117a6d7866e664295786840319Chris Wren        return user.getIdentifier() + "|" + pkg + "|" +
1371031c974855ff4117a6d7866e664295786840319Chris Wren                (group == null
1381031c974855ff4117a6d7866e664295786840319Chris Wren                        ? "p:" + notification.priority
1391031c974855ff4117a6d7866e664295786840319Chris Wren                        : "g:" + group);
1401031c974855ff4117a6d7866e664295786840319Chris Wren    }
1411031c974855ff4117a6d7866e664295786840319Chris Wren
142e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    /**
143e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds     * Returns true if this notification is part of a group.
144e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds     */
145e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    public boolean isGroup() {
1468a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren        if (overrideGroupKey != null || isAppGroup()) {
1478a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren            return true;
1488a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren        }
1498a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren        return false;
1508a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren    }
1518a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren
1528a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren    /**
1538a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren     * Returns true if application asked that this notification be part of a group.
1548a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren     * @hide
1558a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren     */
1568a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren    public boolean isAppGroup() {
1578a1638f66a79dbf471e7e53294ba853b862434e6Chris Wren        if (getNotification().getGroup() != null || getNotification().getSortKey() != null) {
158e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            return true;
159e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
160e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        return false;
161e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    }
162e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds
16318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public void writeToParcel(Parcel out, int flags) {
16418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        out.writeString(this.pkg);
1658fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer        out.writeString(this.opPkg);
16618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        out.writeInt(this.id);
16718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        if (this.tag != null) {
16818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            out.writeInt(1);
16918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            out.writeString(this.tag);
17018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        } else {
17118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            out.writeInt(0);
17218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
1739d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        out.writeInt(this.uid);
1749d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        out.writeInt(this.initialPid);
17518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        this.notification.writeToParcel(out, flags);
1766d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey        user.writeToParcel(out, flags);
177fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler
178fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler        out.writeLong(this.postTime);
179e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        if (this.overrideGroupKey != null) {
180e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            out.writeInt(1);
181e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            out.writeString(this.overrideGroupKey);
182e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        } else {
183e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds            out.writeInt(0);
184e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        }
18518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    }
18618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
18718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public int describeContents() {
18818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        return 0;
18918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    }
19018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
19118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public static final Parcelable.Creator<StatusBarNotification> CREATOR
19218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            = new Parcelable.Creator<StatusBarNotification>()
19318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    {
19418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        public StatusBarNotification createFromParcel(Parcel parcel)
19518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        {
19618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            return new StatusBarNotification(parcel);
19718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
19818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
19918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        public StatusBarNotification[] newArray(int size)
20018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        {
20118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            return new StatusBarNotification[size];
20218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
20318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    };
20418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
2051a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler    /**
2061a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler     * @hide
2071a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler     */
2081a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler    public StatusBarNotification cloneLight() {
2091a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler        final Notification no = new Notification();
2101a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler        this.notification.cloneInto(no, false); // light copy
2118fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer        return new StatusBarNotification(this.pkg, this.opPkg,
2121a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler                this.id, this.tag, this.uid, this.initialPid,
213e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                no, this.user, this.overrideGroupKey, this.postTime);
2141a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler    }
2151a497d3a2b1496c12949e47e55f8e46d8f585be5Daniel Sandler
2166d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    @Override
21718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public StatusBarNotification clone() {
2188fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer        return new StatusBarNotification(this.pkg, this.opPkg,
219fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler                this.id, this.tag, this.uid, this.initialPid,
220e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                this.notification.clone(), this.user, this.overrideGroupKey, this.postTime);
22118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    }
22218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
2236d51571835737c7502a2e111ee9dc2527ebad984Jeff Sharkey    @Override
22418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public String toString() {
225fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler        return String.format(
226e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                "StatusBarNotification(pkg=%s user=%s id=%d tag=%s key=%s: %s)",
227fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler                this.pkg, this.user, this.id, this.tag,
228e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds                this.key, this.notification);
22918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    }
23018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
2315feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler    /** Convenience method to check the notification's flags for
2325feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler     * {@link Notification#FLAG_ONGOING_EVENT}.
2335feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler     */
234e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato    public boolean isOngoing() {
235e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato        return (notification.flags & Notification.FLAG_ONGOING_EVENT) != 0;
236e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato    }
237e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato
2385feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler    /** Convenience method to check the notification's flags for
2395feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler     * either {@link Notification#FLAG_ONGOING_EVENT} or
2405feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler     * {@link Notification#FLAG_NO_CLEAR}.
2415feceebb892d4cb5777cea3c6174b206705d456bDaniel Sandler     */
2425dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato    public boolean isClearable() {
2435dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato        return ((notification.flags & Notification.FLAG_ONGOING_EVENT) == 0)
2445dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato                && ((notification.flags & Notification.FLAG_NO_CLEAR) == 0);
2455dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato    }
246b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler
247a263e4e438746f91fb78857bd569ba4f796a346dKenny Guy    /**
248a263e4e438746f91fb78857bd569ba4f796a346dKenny Guy     * Returns a userHandle for the instance of the app that posted this notification.
249a263e4e438746f91fb78857bd569ba4f796a346dKenny Guy     *
250a263e4e438746f91fb78857bd569ba4f796a346dKenny Guy     * @deprecated Use {@link #getUser()} instead.
251a263e4e438746f91fb78857bd569ba4f796a346dKenny Guy     */
252b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler    public int getUserId() {
25350cdf7c3069eb2cf82acbad73c322b7a5f3af4b1Dianne Hackborn        return this.user.getIdentifier();
254b9301c3a686df05950710ec80e2cd691c3082871Daniel Sandler    }
255e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
256e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    /** The package of the app that posted the notification. */
2574f91efdf421e354ee2033ed640e4150cf0cef21bDaniel Sandler    public String getPackageName() {
258e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return pkg;
259e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
260e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
26126510320646339fc59e01d392f96efeeac6d91ddScott Main    /** The id supplied to {@link android.app.NotificationManager#notify(int,Notification)}. */
262e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    public int getId() {
263e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return id;
264e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
265e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
26626510320646339fc59e01d392f96efeeac6d91ddScott Main    /** The tag supplied to {@link android.app.NotificationManager#notify(int,Notification)},
26726510320646339fc59e01d392f96efeeac6d91ddScott Main     * or null if no tag was specified. */
268e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    public String getTag() {
269e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return tag;
270e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
271e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
272e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    /** The notifying app's calling uid. @hide */
273e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    public int getUid() {
274e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return uid;
275e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
276e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
2778fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer    /** The package used for AppOps tracking. @hide */
2788fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer    public String getOpPkg() {
2798fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer        return opPkg;
280e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
281e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
282e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    /** @hide */
283e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    public int getInitialPid() {
284e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return initialPid;
285e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
286e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
287e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    /** The {@link android.app.Notification} supplied to
28826510320646339fc59e01d392f96efeeac6d91ddScott Main     * {@link android.app.NotificationManager#notify(int,Notification)}. */
289e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    public Notification getNotification() {
290e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return notification;
291e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
292e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
293e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    /**
294e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler     * The {@link android.os.UserHandle} for whom this notification is intended.
295e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler     */
296e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    public UserHandle getUser() {
297e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return user;
298e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
299e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
300e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    /** The time (in {@link System#currentTimeMillis} time) the notification was posted,
301e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler     * which may be different than {@link android.app.Notification#when}.
302e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler     */
303e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    public long getPostTime() {
304e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler        return postTime;
305e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler    }
306e6f7f2e3a01b8deb00e03ccfa93751c315f14ef0Daniel Sandler
307a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock    /**
308a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock     * A unique instance key for this notification record.
309a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock     */
310a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock    public String getKey() {
311a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock        return key;
312a4294297d46cc0b9f45897bc688c267502cce3efJohn Spurlock    }
3131031c974855ff4117a6d7866e664295786840319Chris Wren
3141031c974855ff4117a6d7866e664295786840319Chris Wren    /**
3151031c974855ff4117a6d7866e664295786840319Chris Wren     * A key that indicates the group with which this message ranks.
3161031c974855ff4117a6d7866e664295786840319Chris Wren     */
3171031c974855ff4117a6d7866e664295786840319Chris Wren    public String getGroupKey() {
3181031c974855ff4117a6d7866e664295786840319Chris Wren        return groupKey;
3191031c974855ff4117a6d7866e664295786840319Chris Wren    }
32068079d54f3690885df9c5bbb691090633f3ef541Dan Sandler
32168079d54f3690885df9c5bbb691090633f3ef541Dan Sandler    /**
322e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds     * Sets the override group key.
323e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds     */
324e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    public void setOverrideGroupKey(String overrideGroupKey) {
325e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        this.overrideGroupKey = overrideGroupKey;
326e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        groupKey = groupKey();
327e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    }
328e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds
329e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    /**
330e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds     * Returns the override group key.
331e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds     */
332e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    public String getOverrideGroupKey() {
333e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds        return overrideGroupKey;
334e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    }
335e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds
336e46bb37acf6d3cfb9974672ace93f5381f70ad99Julia Reynolds    /**
33768079d54f3690885df9c5bbb691090633f3ef541Dan Sandler     * @hide
33868079d54f3690885df9c5bbb691090633f3ef541Dan Sandler     */
33968079d54f3690885df9c5bbb691090633f3ef541Dan Sandler    public Context getPackageContext(Context context) {
34068079d54f3690885df9c5bbb691090633f3ef541Dan Sandler        if (mContext == null) {
34168079d54f3690885df9c5bbb691090633f3ef541Dan Sandler            try {
34268079d54f3690885df9c5bbb691090633f3ef541Dan Sandler                ApplicationInfo ai = context.getPackageManager()
34368079d54f3690885df9c5bbb691090633f3ef541Dan Sandler                        .getApplicationInfo(pkg, PackageManager.GET_UNINSTALLED_PACKAGES);
34468079d54f3690885df9c5bbb691090633f3ef541Dan Sandler                mContext = context.createApplicationContext(ai,
34568079d54f3690885df9c5bbb691090633f3ef541Dan Sandler                        Context.CONTEXT_RESTRICTED);
34668079d54f3690885df9c5bbb691090633f3ef541Dan Sandler            } catch (PackageManager.NameNotFoundException e) {
34768079d54f3690885df9c5bbb691090633f3ef541Dan Sandler                mContext = null;
34868079d54f3690885df9c5bbb691090633f3ef541Dan Sandler            }
34968079d54f3690885df9c5bbb691090633f3ef541Dan Sandler        }
35068079d54f3690885df9c5bbb691090633f3ef541Dan Sandler        if (mContext == null) {
35168079d54f3690885df9c5bbb691090633f3ef541Dan Sandler            mContext = context;
35268079d54f3690885df9c5bbb691090633f3ef541Dan Sandler        }
35368079d54f3690885df9c5bbb691090633f3ef541Dan Sandler        return mContext;
35468079d54f3690885df9c5bbb691090633f3ef541Dan Sandler    }
35518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato}
356