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
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 @@
             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 @@
             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 @@
         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 @@
         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;