Merge "Fix crash when startForeground posts a broken Notification." into gingerbread
This commit is contained in:
committed by
Android (Google) Code Review
commit
9b87770f53
@@ -17,6 +17,7 @@
|
|||||||
package android.app;
|
package android.app;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.Binder;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
|||||||
@@ -67,7 +67,8 @@ import java.io.PrintWriter;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
class NotificationManagerService extends INotificationManager.Stub
|
/** {@hide} */
|
||||||
|
public class NotificationManagerService extends INotificationManager.Stub
|
||||||
{
|
{
|
||||||
private static final String TAG = "NotificationService";
|
private static final String TAG = "NotificationService";
|
||||||
private static final boolean DBG = false;
|
private static final boolean DBG = false;
|
||||||
@@ -311,7 +312,8 @@ class NotificationManagerService extends INotificationManager.Stub
|
|||||||
|
|
||||||
public void onNotificationError(String pkg, String tag, int id,
|
public void onNotificationError(String pkg, String tag, int id,
|
||||||
int uid, int initialPid, String message) {
|
int uid, int initialPid, String message) {
|
||||||
Slog.d(TAG, "onNotification error pkg=" + pkg + " tag=" + tag + " id=" + id);
|
Slog.d(TAG, "onNotification error pkg=" + pkg + " tag=" + tag + " id=" + id
|
||||||
|
+ "; will crashApplication(uid=" + uid + ", pid=" + initialPid + ")");
|
||||||
cancelNotification(pkg, tag, id, 0, 0);
|
cancelNotification(pkg, tag, id, 0, 0);
|
||||||
long ident = Binder.clearCallingIdentity();
|
long ident = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
@@ -666,11 +668,20 @@ class NotificationManagerService extends INotificationManager.Stub
|
|||||||
enqueueNotificationWithTag(pkg, null /* tag */, id, notification, idOut);
|
enqueueNotificationWithTag(pkg, null /* tag */, id, notification, idOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void enqueueNotificationWithTag(String pkg, String tag, int id,
|
public void enqueueNotificationWithTag(String pkg, String tag, int id, Notification notification,
|
||||||
Notification notification, int[] idOut)
|
int[] idOut)
|
||||||
{
|
{
|
||||||
final int callingUid = Binder.getCallingUid();
|
enqueueNotificationInternal(pkg, Binder.getCallingUid(), Binder.getCallingPid(),
|
||||||
final int callingPid = Binder.getCallingPid();
|
tag, id, notification, idOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not exposed via Binder; for system use only (otherwise malicious apps could spoof the
|
||||||
|
// uid/pid of another application)
|
||||||
|
public void enqueueNotificationInternal(String pkg, int callingUid, int callingPid,
|
||||||
|
String tag, int id, Notification notification, int[] idOut)
|
||||||
|
{
|
||||||
|
Slog.d(TAG, "enqueueNotificationWithTag: calling uid=" + callingUid
|
||||||
|
+ ", pid=" + callingPid);
|
||||||
|
|
||||||
checkIncomingCall(pkg);
|
checkIncomingCall(pkg);
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package com.android.server.am;
|
package com.android.server.am;
|
||||||
|
|
||||||
import com.android.internal.os.BatteryStatsImpl;
|
import com.android.internal.os.BatteryStatsImpl;
|
||||||
|
import com.android.server.NotificationManagerService;
|
||||||
|
|
||||||
import android.app.INotificationManager;
|
import android.app.INotificationManager;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
@@ -252,6 +253,8 @@ class ServiceRecord extends Binder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void postNotification() {
|
public void postNotification() {
|
||||||
|
final int appUid = appInfo.uid;
|
||||||
|
final int appPid = app.pid;
|
||||||
if (foregroundId != 0 && foregroundNoti != null) {
|
if (foregroundId != 0 && foregroundNoti != null) {
|
||||||
// Do asynchronous communication with notification manager to
|
// Do asynchronous communication with notification manager to
|
||||||
// avoid deadlocks.
|
// avoid deadlocks.
|
||||||
@@ -260,14 +263,15 @@ class ServiceRecord extends Binder {
|
|||||||
final Notification localForegroundNoti = foregroundNoti;
|
final Notification localForegroundNoti = foregroundNoti;
|
||||||
ams.mHandler.post(new Runnable() {
|
ams.mHandler.post(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
INotificationManager inm = NotificationManager.getService();
|
NotificationManagerService nm =
|
||||||
if (inm == null) {
|
(NotificationManagerService) NotificationManager.getService();
|
||||||
|
if (nm == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
int[] outId = new int[1];
|
int[] outId = new int[1];
|
||||||
inm.enqueueNotification(localPackageName, localForegroundId,
|
nm.enqueueNotificationInternal(localPackageName, appUid, appPid,
|
||||||
localForegroundNoti, outId);
|
null, localForegroundId, localForegroundNoti, outId);
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
Slog.w(ActivityManagerService.TAG,
|
Slog.w(ActivityManagerService.TAG,
|
||||||
"Error showing notification for service", e);
|
"Error showing notification for service", e);
|
||||||
@@ -275,7 +279,6 @@ class ServiceRecord extends Binder {
|
|||||||
// get to be foreground.
|
// get to be foreground.
|
||||||
ams.setServiceForeground(name, ServiceRecord.this,
|
ams.setServiceForeground(name, ServiceRecord.this,
|
||||||
localForegroundId, null, true);
|
localForegroundId, null, true);
|
||||||
} catch (RemoteException e) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user