summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2014-01-10 10:16:43 -0800
committerCraig Mautner <cmautner@google.com>2014-01-10 10:16:43 -0800
commitbd503a4e3a1c897695f0edcf6e4aaac3a7e962c5 (patch)
tree0e6045e9f4770ccb99d7f2efa05bf08dde8e8f9b /core/java
parentb6d9eb875a0bf1bb655a90c88457689342eb0991 (diff)
downloadframeworks_base-bd503a4e3a1c897695f0edcf6e4aaac3a7e962c5.zip
frameworks_base-bd503a4e3a1c897695f0edcf6e4aaac3a7e962c5.tar.gz
frameworks_base-bd503a4e3a1c897695f0edcf6e4aaac3a7e962c5.tar.bz2
Allow for the possibility of null ActivityContainer
When BinderProxy is passed in as the IBinder for getEnclosingActivityContainer the activity manager cannot turn it into an ActivityRecord. This causes NPE in ActivityThread which is Not Good (tm). Allowing null to be returned when requesting an ActivityContainer and handling it appropriately fixes this bug. Fixes bug 12473669. Change-Id: I6937636042f8853b3ddc2df40be010e7391e41a5
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/app/ActivityManagerNative.java32
-rw-r--r--core/java/android/app/ActivityThread.java3
2 files changed, 28 insertions, 7 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 3bc2ee6..7b81713 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -2027,7 +2027,12 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
IActivityContainer activityContainer =
createActivityContainer(parentActivityToken, callback);
reply.writeNoException();
- reply.writeStrongBinder(activityContainer.asBinder());
+ if (activityContainer != null) {
+ reply.writeInt(1);
+ reply.writeStrongBinder(activityContainer.asBinder());
+ } else {
+ reply.writeInt(0);
+ }
return true;
}
@@ -2036,7 +2041,12 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
IBinder activityToken = data.readStrongBinder();
IActivityContainer activityContainer = getEnclosingActivityContainer(activityToken);
reply.writeNoException();
- reply.writeStrongBinder(activityContainer.asBinder());
+ if (activityContainer != null) {
+ reply.writeInt(1);
+ reply.writeStrongBinder(activityContainer.asBinder());
+ } else {
+ reply.writeInt(0);
+ }
return true;
}
@@ -4670,8 +4680,13 @@ class ActivityManagerProxy implements IActivityManager
data.writeStrongBinder((IBinder)callback);
mRemote.transact(CREATE_ACTIVITY_CONTAINER_TRANSACTION, data, reply, 0);
reply.readException();
- IActivityContainer res =
- IActivityContainer.Stub.asInterface(reply.readStrongBinder());
+ final int result = reply.readInt();
+ final IActivityContainer res;
+ if (result == 1) {
+ res = IActivityContainer.Stub.asInterface(reply.readStrongBinder());
+ } else {
+ res = null;
+ }
data.recycle();
reply.recycle();
return res;
@@ -4685,8 +4700,13 @@ class ActivityManagerProxy implements IActivityManager
data.writeStrongBinder(activityToken);
mRemote.transact(GET_ACTIVITY_CONTAINER_TRANSACTION, data, reply, 0);
reply.readException();
- IActivityContainer res =
- IActivityContainer.Stub.asInterface(reply.readStrongBinder());
+ final int result = reply.readInt();
+ final IActivityContainer res;
+ if (result == 1) {
+ res = IActivityContainer.Stub.asInterface(reply.readStrongBinder());
+ } else {
+ res = null;
+ }
data.recycle();
reply.recycle();
return res;
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 9ae2543..9f21a36 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2225,7 +2225,8 @@ public final class ActivityThread {
try {
IActivityContainer container =
ActivityManagerNative.getDefault().getEnclosingActivityContainer(r.token);
- final int displayId = container.getDisplayId();
+ final int displayId =
+ container == null ? Display.DEFAULT_DISPLAY : container.getDisplayId();
if (displayId > Display.DEFAULT_DISPLAY) {
Display display = dm.getRealDisplay(displayId, r.token);
baseContext = appContext.createDisplayContext(display);