summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Wale Ogunwale <ogunwale@google.com> 2015-06-05 00:23:25 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2015-06-05 00:23:28 +0000
commit733f147401f180b14acb13137cf99e65da1d72cc (patch)
tree3fafdf02c8125caf3348f9da2df8df9d94168db7
parent73d2f160ecdd0e00b805fd956abc88996758e516 (diff)
parent9a6ef1e94c2c7cd937a6af668b33988057042520 (diff)
Merge "Always have a handler for PendingIntents sent in the system process" into mnc-dev
-rw-r--r--core/java/android/app/ActivityThread.java4
-rw-r--r--core/java/android/app/PendingIntent.java14
2 files changed, 17 insertions, 1 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 3224d4142229..10d76f750ac5 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -1640,6 +1640,10 @@ public final class ActivityThread {
return sCurrentActivityThread;
}
+ public static boolean isSystem() {
+ return (sCurrentActivityThread != null) ? sCurrentActivityThread.mSystemThread : false;
+ }
+
public static String currentOpPackageName() {
ActivityThread am = currentActivityThread();
return (am != null && am.getApplication() != null)
diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java
index 2cfc1fa48f67..031854a6a69a 100644
--- a/core/java/android/app/PendingIntent.java
+++ b/core/java/android/app/PendingIntent.java
@@ -25,11 +25,13 @@ import android.content.IIntentReceiver;
import android.content.IIntentSender;
import android.content.IntentSender;
import android.os.Bundle;
+import android.os.Looper;
import android.os.RemoteException;
import android.os.Handler;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
+import android.os.Process;
import android.os.UserHandle;
import android.util.AndroidException;
@@ -206,10 +208,20 @@ public final class PendingIntent implements Parcelable {
private int mResultCode;
private String mResultData;
private Bundle mResultExtras;
+ private static Handler sDefaultSystemHandler;
FinishedDispatcher(PendingIntent pi, OnFinished who, Handler handler) {
mPendingIntent = pi;
mWho = who;
- mHandler = handler;
+ if (handler == null && ActivityThread.isSystem()) {
+ // We assign a default handler for the system process to avoid deadlocks when
+ // processing receivers in various components that hold global service locks.
+ if (sDefaultSystemHandler == null) {
+ sDefaultSystemHandler = new Handler(Looper.getMainLooper());
+ }
+ mHandler = sDefaultSystemHandler;
+ } else {
+ mHandler = handler;
+ }
}
public void performReceive(Intent intent, int resultCode, String data,
Bundle extras, boolean serialized, boolean sticky, int sendingUser) {