Merge "Fix crash when startForeground posts a broken Notification." into gingerbread

This commit is contained in:
Daniel Sandler
2010-08-04 20:33:32 -07:00
committed by Android (Google) Code Review
3 changed files with 26 additions and 11 deletions

View File

@ -17,6 +17,7 @@
package android.app;
import android.content.Context;
import android.os.Binder;
import android.os.RemoteException;
import android.os.Handler;
import android.os.IBinder;

View File

@ -67,7 +67,8 @@ import java.io.PrintWriter;
import java.util.ArrayList;
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 boolean DBG = false;
@ -311,7 +312,8 @@ class NotificationManagerService extends INotificationManager.Stub
public void onNotificationError(String pkg, String tag, int id,
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);
long ident = Binder.clearCallingIdentity();
try {
@ -666,11 +668,20 @@ class NotificationManagerService extends INotificationManager.Stub
enqueueNotificationWithTag(pkg, null /* tag */, id, notification, idOut);
}
public void enqueueNotificationWithTag(String pkg, String tag, int id,
Notification notification, int[] idOut)
public void enqueueNotificationWithTag(String pkg, String tag, int id, Notification notification,
int[] idOut)
{
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
enqueueNotificationInternal(pkg, Binder.getCallingUid(), 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);

View File

@ -17,6 +17,7 @@
package com.android.server.am;
import com.android.internal.os.BatteryStatsImpl;
import com.android.server.NotificationManagerService;
import android.app.INotificationManager;
import android.app.Notification;
@ -252,6 +253,8 @@ class ServiceRecord extends Binder {
}
public void postNotification() {
final int appUid = appInfo.uid;
final int appPid = app.pid;
if (foregroundId != 0 && foregroundNoti != null) {
// Do asynchronous communication with notification manager to
// avoid deadlocks.
@ -260,14 +263,15 @@ class ServiceRecord extends Binder {
final Notification localForegroundNoti = foregroundNoti;
ams.mHandler.post(new Runnable() {
public void run() {
INotificationManager inm = NotificationManager.getService();
if (inm == null) {
NotificationManagerService nm =
(NotificationManagerService) NotificationManager.getService();
if (nm == null) {
return;
}
try {
int[] outId = new int[1];
inm.enqueueNotification(localPackageName, localForegroundId,
localForegroundNoti, outId);
nm.enqueueNotificationInternal(localPackageName, appUid, appPid,
null, localForegroundId, localForegroundNoti, outId);
} catch (RuntimeException e) {
Slog.w(ActivityManagerService.TAG,
"Error showing notification for service", e);
@ -275,7 +279,6 @@ class ServiceRecord extends Binder {
// get to be foreground.
ams.setServiceForeground(name, ServiceRecord.this,
localForegroundId, null, true);
} catch (RemoteException e) {
}
}
});