Don't retain global ref to last inflated context.
Also rework URI permission granting to support upcoming
clipboard use.
Change-Id: I9842920350955531c5a511c2ecc5215e8c783343
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 9a55a6f..1d1b4dc 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -1248,8 +1248,9 @@
case IS_USER_A_MONKEY_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
- reply.writeInt(isUserAMonkey() ? 1 : 0);
+ boolean areThey = isUserAMonkey();
reply.writeNoException();
+ reply.writeInt(areThey ? 1 : 0);
return true;
}
@@ -1263,8 +1264,9 @@
case IS_IMMERSIVE_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
IBinder token = data.readStrongBinder();
- reply.writeInt(isImmersive(token) ? 1 : 0);
+ boolean isit = isImmersive(token);
reply.writeNoException();
+ reply.writeInt(isit ? 1 : 0);
return true;
}
@@ -1279,8 +1281,9 @@
case IS_TOP_ACTIVITY_IMMERSIVE_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
- reply.writeInt(isTopActivityImmersive() ? 1 : 0);
+ boolean isit = isTopActivityImmersive();
reply.writeNoException();
+ reply.writeInt(isit ? 1 : 0);
return true;
}
@@ -1295,6 +1298,40 @@
return true;
}
+ case NEW_URI_PERMISSION_OWNER_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ String name = data.readString();
+ IBinder perm = newUriPermissionOwner(name);
+ reply.writeNoException();
+ reply.writeStrongBinder(perm);
+ return true;
+ }
+
+ case GRANT_URI_PERMISSION_FROM_OWNER_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IBinder owner = data.readStrongBinder();
+ int fromUid = data.readInt();
+ String targetPkg = data.readString();
+ Uri uri = Uri.CREATOR.createFromParcel(data);
+ int mode = data.readInt();
+ grantUriPermissionFromOwner(owner, fromUid, targetPkg, uri, mode);
+ reply.writeNoException();
+ return true;
+ }
+
+ case REVOKE_URI_PERMISSION_FROM_OWNER_TRANSACTION: {
+ data.enforceInterface(IActivityManager.descriptor);
+ IBinder owner = data.readStrongBinder();
+ Uri uri = null;
+ if (data.readInt() != 0) {
+ Uri.CREATOR.createFromParcel(data);
+ }
+ int mode = data.readInt();
+ revokeUriPermissionFromOwner(owner, uri, mode);
+ reply.writeNoException();
+ return true;
+ }
+
}
return super.onTransact(code, data, reply, flags);
@@ -2841,8 +2878,8 @@
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(token);
mRemote.transact(IS_IMMERSIVE_TRANSACTION, data, reply, 0);
- boolean res = reply.readInt() == 1;
reply.readException();
+ boolean res = reply.readInt() == 1;
data.recycle();
reply.recycle();
return res;
@@ -2854,8 +2891,8 @@
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
mRemote.transact(IS_TOP_ACTIVITY_IMMERSIVE_TRANSACTION, data, reply, 0);
- boolean res = reply.readInt() == 1;
reply.readException();
+ boolean res = reply.readInt() == 1;
data.recycle();
reply.recycle();
return res;
@@ -2875,6 +2912,55 @@
data.recycle();
reply.recycle();
}
+
+ public IBinder newUriPermissionOwner(String name)
+ throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeString(name);
+ mRemote.transact(NEW_URI_PERMISSION_OWNER_TRANSACTION, data, reply, 0);
+ reply.readException();
+ IBinder res = reply.readStrongBinder();
+ data.recycle();
+ reply.recycle();
+ return res;
+ }
+
+ public void grantUriPermissionFromOwner(IBinder owner, int fromUid, String targetPkg,
+ Uri uri, int mode) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(owner);
+ data.writeInt(fromUid);
+ data.writeString(targetPkg);
+ uri.writeToParcel(data, 0);
+ data.writeInt(mode);
+ mRemote.transact(GRANT_URI_PERMISSION_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
+
+ public void revokeUriPermissionFromOwner(IBinder owner, Uri uri,
+ int mode) throws RemoteException {
+ Parcel data = Parcel.obtain();
+ Parcel reply = Parcel.obtain();
+ data.writeInterfaceToken(IActivityManager.descriptor);
+ data.writeStrongBinder(owner);
+ if (uri != null) {
+ data.writeInt(1);
+ uri.writeToParcel(data, 0);
+ } else {
+ data.writeInt(0);
+ }
+ data.writeInt(mode);
+ mRemote.transact(REVOKE_URI_PERMISSION_TRANSACTION, data, reply, 0);
+ reply.readException();
+ data.recycle();
+ reply.recycle();
+ }
private IBinder mRemote;
}