Merge "Each package can enqueue one toast at a time." into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
a606d1049f
@@ -554,7 +554,7 @@ public class NotificationManagerService extends SystemService {
|
|||||||
{
|
{
|
||||||
final int pid;
|
final int pid;
|
||||||
final String pkg;
|
final String pkg;
|
||||||
final ITransientNotification callback;
|
ITransientNotification callback;
|
||||||
int duration;
|
int duration;
|
||||||
Binder token;
|
Binder token;
|
||||||
|
|
||||||
@@ -571,6 +571,10 @@ public class NotificationManagerService extends SystemService {
|
|||||||
this.duration = duration;
|
this.duration = duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void update(ITransientNotification callback) {
|
||||||
|
this.callback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
void dump(PrintWriter pw, String prefix, DumpFilter filter) {
|
void dump(PrintWriter pw, String prefix, DumpFilter filter) {
|
||||||
if (filter != null && !filter.matches(pkg)) return;
|
if (filter != null && !filter.matches(pkg)) return;
|
||||||
pw.println(prefix + this);
|
pw.println(prefix + this);
|
||||||
@@ -1604,38 +1608,28 @@ public class NotificationManagerService extends SystemService {
|
|||||||
long callingId = Binder.clearCallingIdentity();
|
long callingId = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
ToastRecord record;
|
ToastRecord record;
|
||||||
int index = indexOfToastLocked(pkg, callback);
|
int index;
|
||||||
// If it's already in the queue, we update it in place, we don't
|
// All packages aside from the android package can enqueue one toast at a time
|
||||||
// move it to the end of the queue.
|
if (!isSystemToast) {
|
||||||
|
index = indexOfToastPackageLocked(pkg);
|
||||||
|
} else {
|
||||||
|
index = indexOfToastLocked(pkg, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the package already has a toast, we update its toast
|
||||||
|
// in the queue, we don't move it to the end of the queue.
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
record = mToastQueue.get(index);
|
record = mToastQueue.get(index);
|
||||||
record.update(duration);
|
record.update(duration);
|
||||||
|
record.update(callback);
|
||||||
} else {
|
} else {
|
||||||
// Limit the number of toasts that any given package except the android
|
|
||||||
// package can enqueue. Prevents DOS attacks and deals with leaks.
|
|
||||||
if (!isSystemToast) {
|
|
||||||
int count = 0;
|
|
||||||
final int N = mToastQueue.size();
|
|
||||||
for (int i=0; i<N; i++) {
|
|
||||||
final ToastRecord r = mToastQueue.get(i);
|
|
||||||
if (r.pkg.equals(pkg)) {
|
|
||||||
count++;
|
|
||||||
if (count >= MAX_PACKAGE_NOTIFICATIONS) {
|
|
||||||
Slog.e(TAG, "Package has already posted " + count
|
|
||||||
+ " toasts. Not showing more. Package=" + pkg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Binder token = new Binder();
|
Binder token = new Binder();
|
||||||
mWindowManagerInternal.addWindowToken(token, TYPE_TOAST, DEFAULT_DISPLAY);
|
mWindowManagerInternal.addWindowToken(token, TYPE_TOAST, DEFAULT_DISPLAY);
|
||||||
record = new ToastRecord(callingPid, pkg, callback, duration, token);
|
record = new ToastRecord(callingPid, pkg, callback, duration, token);
|
||||||
mToastQueue.add(record);
|
mToastQueue.add(record);
|
||||||
index = mToastQueue.size() - 1;
|
index = mToastQueue.size() - 1;
|
||||||
keepProcessAliveIfNeededLocked(callingPid);
|
|
||||||
}
|
}
|
||||||
|
keepProcessAliveIfNeededLocked(callingPid);
|
||||||
// If it's at index 0, it's the current toast. It doesn't matter if it's
|
// If it's at index 0, it's the current toast. It doesn't matter if it's
|
||||||
// new or just been updated. Call back and tell it to show itself.
|
// new or just been updated. Call back and tell it to show itself.
|
||||||
// If the callback fails, this will remove it from the list, so don't
|
// If the callback fails, this will remove it from the list, so don't
|
||||||
@@ -4241,7 +4235,21 @@ public class NotificationManagerService extends SystemService {
|
|||||||
int len = list.size();
|
int len = list.size();
|
||||||
for (int i=0; i<len; i++) {
|
for (int i=0; i<len; i++) {
|
||||||
ToastRecord r = list.get(i);
|
ToastRecord r = list.get(i);
|
||||||
if (r.pkg.equals(pkg) && r.callback.asBinder() == cbak) {
|
if (r.pkg.equals(pkg) && r.callback.asBinder().equals(cbak)) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GuardedBy("mToastQueue")
|
||||||
|
int indexOfToastPackageLocked(String pkg)
|
||||||
|
{
|
||||||
|
ArrayList<ToastRecord> list = mToastQueue;
|
||||||
|
int len = list.size();
|
||||||
|
for (int i=0; i<len; i++) {
|
||||||
|
ToastRecord r = list.get(i);
|
||||||
|
if (r.pkg.equals(pkg)) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user