Loading core/java/android/app/ActivityManagerNative.java +91 −5 Original line number Diff line number Diff line Loading @@ -1248,8 +1248,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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; } Loading @@ -1263,8 +1264,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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; } Loading @@ -1279,8 +1281,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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; } Loading @@ -1295,6 +1298,40 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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); Loading Loading @@ -2841,8 +2878,8 @@ class ActivityManagerProxy implements IActivityManager 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; Loading @@ -2854,8 +2891,8 @@ class ActivityManagerProxy implements IActivityManager 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; Loading @@ -2876,5 +2913,54 @@ class ActivityManagerProxy implements IActivityManager 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; } core/java/android/app/IActivityManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -318,6 +318,12 @@ public interface IActivityManager extends IInterface { public void crashApplication(int uid, int initialPid, String packageName, String message) throws RemoteException; public IBinder newUriPermissionOwner(String name) throws RemoteException; public void grantUriPermissionFromOwner(IBinder owner, int fromUid, String targetPkg, Uri uri, int mode) throws RemoteException; public void revokeUriPermissionFromOwner(IBinder owner, Uri uri, int mode) throws RemoteException; /* * Private non-Binder interfaces */ Loading Loading @@ -524,4 +530,7 @@ public interface IActivityManager extends IInterface { int SET_IMMERSIVE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+111; int IS_TOP_ACTIVITY_IMMERSIVE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+112; int CRASH_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+113; int NEW_URI_PERMISSION_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+114; int GRANT_URI_PERMISSION_FROM_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+115; int REVOKE_URI_PERMISSION_FROM_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+116; } core/java/android/view/LayoutInflater.java +4 −0 Original line number Diff line number Diff line Loading @@ -434,6 +434,10 @@ public abstract class LayoutInflater { throw ex; } // Told retain static reference on context. mConstructorArgs[0] = null; mConstructorArgs[1] = null; return result; } } Loading services/java/com/android/server/am/ActivityManagerService.java +53 −5 Original line number Diff line number Diff line Loading @@ -4294,12 +4294,10 @@ public final class ActivityManagerService extends ActivityManagerNative implemen + " when granting permission to uri " + uri); } if (targetPkg == null) { Slog.w(TAG, "grantUriPermission: null target"); return; throw new IllegalArgumentException("null target"); } if (uri == null) { Slog.w(TAG, "grantUriPermission: null uri"); return; throw new IllegalArgumentException("null uri"); } grantUriPermissionLocked(r.info.uid, targetPkg, uri, modeFlags, Loading Loading @@ -4451,6 +4449,56 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } } @Override public IBinder newUriPermissionOwner(String name) { synchronized(this) { UriPermissionOwner owner = new UriPermissionOwner(this, name); return owner.getExternalTokenLocked(); } } @Override public void grantUriPermissionFromOwner(IBinder token, int fromUid, String targetPkg, Uri uri, int modeFlags) { synchronized(this) { UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); if (owner == null) { throw new IllegalArgumentException("Unknown owner: " + token); } if (fromUid != Binder.getCallingUid()) { if (Binder.getCallingUid() != Process.myUid()) { // Only system code can grant URI permissions on behalf // of other users. throw new SecurityException("nice try"); } } if (targetPkg == null) { throw new IllegalArgumentException("null target"); } if (uri == null) { throw new IllegalArgumentException("null uri"); } grantUriPermissionLocked(fromUid, targetPkg, uri, modeFlags, owner); } } @Override public void revokeUriPermissionFromOwner(IBinder token, Uri uri, int mode) { synchronized(this) { UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); if (owner == null) { throw new IllegalArgumentException("Unknown owner: " + token); } if (uri == null) { owner.removeUriPermissionsLocked(mode); } else { owner.removeUriPermissionLocked(uri, mode); } } } public void showWaitingForDebugger(IApplicationThread who, boolean waiting) { synchronized (this) { ProcessRecord app = Loading Loading @@ -8260,7 +8308,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen si.deliveryCount++; if (si.targetPermissionUid >= 0) { grantUriPermissionUncheckedFromIntentLocked(si.targetPermissionUid, r.packageName, si.intent, si); r.packageName, si.intent, si.getUriPermissionsLocked()); } if (DEBUG_SERVICE) Slog.v(TAG, ">>> EXECUTING start of " + r); bumpServiceExecutingLocked(r); Loading services/java/com/android/server/am/ActivityRecord.java +22 −62 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ import java.util.HashSet; /** * An entry in the history stack, representing an activity. */ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwner { class ActivityRecord extends IApplicationToken.Stub { final ActivityManagerService service; // owner final ActivityStack stack; // owner final ActivityInfo info; // all about me Loading Loading @@ -78,8 +78,7 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne HashSet<WeakReference<PendingIntentRecord>> pendingResults; // all pending intents for this act ArrayList newIntents; // any pending new intents for single-top mode HashSet<ConnectionRecord> connections; // All ConnectionRecord we hold HashSet<UriPermission> readUriPermissions; // special access to reading uris. HashSet<UriPermission> writeUriPermissions; // special access to writing uris. UriPermissionOwner uriPermissions; // current special URI access perms. ProcessRecord app; // if non-null, hosting application Bitmap thumbnail; // icon representation of paused screen CharSequence description; // textual description of paused screen Loading Loading @@ -141,11 +140,15 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne if (pendingResults != null) { pw.print(prefix); pw.print("pendingResults="); pw.println(pendingResults); } if (readUriPermissions != null) { pw.print(prefix); pw.print("readUriPermissions="); pw.println(readUriPermissions); if (uriPermissions != null) { if (uriPermissions.readUriPermissions != null) { pw.print(prefix); pw.print("readUriPermissions="); pw.println(uriPermissions.readUriPermissions); } if (uriPermissions.writeUriPermissions != null) { pw.print(prefix); pw.print("writeUriPermissions="); pw.println(uriPermissions.writeUriPermissions); } if (writeUriPermissions != null) { pw.print(prefix); pw.print("writeUriPermissions="); pw.println(writeUriPermissions); } pw.print(prefix); pw.print("launchFailed="); pw.print(launchFailed); pw.print(" haveState="); pw.print(haveState); Loading Loading @@ -301,6 +304,13 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne } } UriPermissionOwner getUriPermissionsLocked() { if (uriPermissions == null) { uriPermissions = new UriPermissionOwner(service, this); } return uriPermissions; } void addResultLocked(ActivityRecord from, String resultWho, int requestCode, int resultCode, Intent resultData) { Loading Loading @@ -350,7 +360,7 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne intent = new Intent(intent); ar.add(intent); service.grantUriPermissionFromIntentLocked(callingUid, packageName, intent, this); intent, getUriPermissionsLocked()); app.thread.scheduleNewIntent(ar, this); sent = true; } catch (RemoteException e) { Loading @@ -367,27 +377,9 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne } void removeUriPermissionsLocked() { if (readUriPermissions != null) { for (UriPermission perm : readUriPermissions) { perm.readOwners.remove(this); if (perm.readOwners.size() == 0 && (perm.globalModeFlags &Intent.FLAG_GRANT_READ_URI_PERMISSION) == 0) { perm.modeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION; service.removeUriPermissionIfNeededLocked(perm); } } readUriPermissions = null; } if (writeUriPermissions != null) { for (UriPermission perm : writeUriPermissions) { perm.writeOwners.remove(this); if (perm.writeOwners.size() == 0 && (perm.globalModeFlags &Intent.FLAG_GRANT_WRITE_URI_PERMISSION) == 0) { perm.modeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION; service.removeUriPermissionIfNeededLocked(perm); } } writeUriPermissions = null; if (uriPermissions != null) { uriPermissions.removeUriPermissionsLocked(); uriPermissions = null; } } Loading Loading @@ -578,38 +570,6 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne state == ActivityState.RESUMED; } @Override public void addReadPermission(UriPermission perm) { if (readUriPermissions == null) { readUriPermissions = new HashSet<UriPermission>(); } readUriPermissions.add(perm); } @Override public void addWritePermission(UriPermission perm) { if (writeUriPermissions == null) { writeUriPermissions = new HashSet<UriPermission>(); } writeUriPermissions.add(perm); } @Override public void removeReadPermission(UriPermission perm) { readUriPermissions.remove(perm); if (readUriPermissions.size() == 0) { readUriPermissions = null; } } @Override public void removeWritePermission(UriPermission perm) { writeUriPermissions.remove(perm); if (writeUriPermissions.size() == 0) { writeUriPermissions = null; } } public String toString() { if (stringName != null) { return stringName; Loading Loading
core/java/android/app/ActivityManagerNative.java +91 −5 Original line number Diff line number Diff line Loading @@ -1248,8 +1248,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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; } Loading @@ -1263,8 +1264,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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; } Loading @@ -1279,8 +1281,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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; } Loading @@ -1295,6 +1298,40 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM 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); Loading Loading @@ -2841,8 +2878,8 @@ class ActivityManagerProxy implements IActivityManager 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; Loading @@ -2854,8 +2891,8 @@ class ActivityManagerProxy implements IActivityManager 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; Loading @@ -2876,5 +2913,54 @@ class ActivityManagerProxy implements IActivityManager 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; }
core/java/android/app/IActivityManager.java +9 −0 Original line number Diff line number Diff line Loading @@ -318,6 +318,12 @@ public interface IActivityManager extends IInterface { public void crashApplication(int uid, int initialPid, String packageName, String message) throws RemoteException; public IBinder newUriPermissionOwner(String name) throws RemoteException; public void grantUriPermissionFromOwner(IBinder owner, int fromUid, String targetPkg, Uri uri, int mode) throws RemoteException; public void revokeUriPermissionFromOwner(IBinder owner, Uri uri, int mode) throws RemoteException; /* * Private non-Binder interfaces */ Loading Loading @@ -524,4 +530,7 @@ public interface IActivityManager extends IInterface { int SET_IMMERSIVE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+111; int IS_TOP_ACTIVITY_IMMERSIVE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+112; int CRASH_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+113; int NEW_URI_PERMISSION_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+114; int GRANT_URI_PERMISSION_FROM_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+115; int REVOKE_URI_PERMISSION_FROM_OWNER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+116; }
core/java/android/view/LayoutInflater.java +4 −0 Original line number Diff line number Diff line Loading @@ -434,6 +434,10 @@ public abstract class LayoutInflater { throw ex; } // Told retain static reference on context. mConstructorArgs[0] = null; mConstructorArgs[1] = null; return result; } } Loading
services/java/com/android/server/am/ActivityManagerService.java +53 −5 Original line number Diff line number Diff line Loading @@ -4294,12 +4294,10 @@ public final class ActivityManagerService extends ActivityManagerNative implemen + " when granting permission to uri " + uri); } if (targetPkg == null) { Slog.w(TAG, "grantUriPermission: null target"); return; throw new IllegalArgumentException("null target"); } if (uri == null) { Slog.w(TAG, "grantUriPermission: null uri"); return; throw new IllegalArgumentException("null uri"); } grantUriPermissionLocked(r.info.uid, targetPkg, uri, modeFlags, Loading Loading @@ -4451,6 +4449,56 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } } @Override public IBinder newUriPermissionOwner(String name) { synchronized(this) { UriPermissionOwner owner = new UriPermissionOwner(this, name); return owner.getExternalTokenLocked(); } } @Override public void grantUriPermissionFromOwner(IBinder token, int fromUid, String targetPkg, Uri uri, int modeFlags) { synchronized(this) { UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); if (owner == null) { throw new IllegalArgumentException("Unknown owner: " + token); } if (fromUid != Binder.getCallingUid()) { if (Binder.getCallingUid() != Process.myUid()) { // Only system code can grant URI permissions on behalf // of other users. throw new SecurityException("nice try"); } } if (targetPkg == null) { throw new IllegalArgumentException("null target"); } if (uri == null) { throw new IllegalArgumentException("null uri"); } grantUriPermissionLocked(fromUid, targetPkg, uri, modeFlags, owner); } } @Override public void revokeUriPermissionFromOwner(IBinder token, Uri uri, int mode) { synchronized(this) { UriPermissionOwner owner = UriPermissionOwner.fromExternalToken(token); if (owner == null) { throw new IllegalArgumentException("Unknown owner: " + token); } if (uri == null) { owner.removeUriPermissionsLocked(mode); } else { owner.removeUriPermissionLocked(uri, mode); } } } public void showWaitingForDebugger(IApplicationThread who, boolean waiting) { synchronized (this) { ProcessRecord app = Loading Loading @@ -8260,7 +8308,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen si.deliveryCount++; if (si.targetPermissionUid >= 0) { grantUriPermissionUncheckedFromIntentLocked(si.targetPermissionUid, r.packageName, si.intent, si); r.packageName, si.intent, si.getUriPermissionsLocked()); } if (DEBUG_SERVICE) Slog.v(TAG, ">>> EXECUTING start of " + r); bumpServiceExecutingLocked(r); Loading
services/java/com/android/server/am/ActivityRecord.java +22 −62 Original line number Diff line number Diff line Loading @@ -44,7 +44,7 @@ import java.util.HashSet; /** * An entry in the history stack, representing an activity. */ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwner { class ActivityRecord extends IApplicationToken.Stub { final ActivityManagerService service; // owner final ActivityStack stack; // owner final ActivityInfo info; // all about me Loading Loading @@ -78,8 +78,7 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne HashSet<WeakReference<PendingIntentRecord>> pendingResults; // all pending intents for this act ArrayList newIntents; // any pending new intents for single-top mode HashSet<ConnectionRecord> connections; // All ConnectionRecord we hold HashSet<UriPermission> readUriPermissions; // special access to reading uris. HashSet<UriPermission> writeUriPermissions; // special access to writing uris. UriPermissionOwner uriPermissions; // current special URI access perms. ProcessRecord app; // if non-null, hosting application Bitmap thumbnail; // icon representation of paused screen CharSequence description; // textual description of paused screen Loading Loading @@ -141,11 +140,15 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne if (pendingResults != null) { pw.print(prefix); pw.print("pendingResults="); pw.println(pendingResults); } if (readUriPermissions != null) { pw.print(prefix); pw.print("readUriPermissions="); pw.println(readUriPermissions); if (uriPermissions != null) { if (uriPermissions.readUriPermissions != null) { pw.print(prefix); pw.print("readUriPermissions="); pw.println(uriPermissions.readUriPermissions); } if (uriPermissions.writeUriPermissions != null) { pw.print(prefix); pw.print("writeUriPermissions="); pw.println(uriPermissions.writeUriPermissions); } if (writeUriPermissions != null) { pw.print(prefix); pw.print("writeUriPermissions="); pw.println(writeUriPermissions); } pw.print(prefix); pw.print("launchFailed="); pw.print(launchFailed); pw.print(" haveState="); pw.print(haveState); Loading Loading @@ -301,6 +304,13 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne } } UriPermissionOwner getUriPermissionsLocked() { if (uriPermissions == null) { uriPermissions = new UriPermissionOwner(service, this); } return uriPermissions; } void addResultLocked(ActivityRecord from, String resultWho, int requestCode, int resultCode, Intent resultData) { Loading Loading @@ -350,7 +360,7 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne intent = new Intent(intent); ar.add(intent); service.grantUriPermissionFromIntentLocked(callingUid, packageName, intent, this); intent, getUriPermissionsLocked()); app.thread.scheduleNewIntent(ar, this); sent = true; } catch (RemoteException e) { Loading @@ -367,27 +377,9 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne } void removeUriPermissionsLocked() { if (readUriPermissions != null) { for (UriPermission perm : readUriPermissions) { perm.readOwners.remove(this); if (perm.readOwners.size() == 0 && (perm.globalModeFlags &Intent.FLAG_GRANT_READ_URI_PERMISSION) == 0) { perm.modeFlags &= ~Intent.FLAG_GRANT_READ_URI_PERMISSION; service.removeUriPermissionIfNeededLocked(perm); } } readUriPermissions = null; } if (writeUriPermissions != null) { for (UriPermission perm : writeUriPermissions) { perm.writeOwners.remove(this); if (perm.writeOwners.size() == 0 && (perm.globalModeFlags &Intent.FLAG_GRANT_WRITE_URI_PERMISSION) == 0) { perm.modeFlags &= ~Intent.FLAG_GRANT_WRITE_URI_PERMISSION; service.removeUriPermissionIfNeededLocked(perm); } } writeUriPermissions = null; if (uriPermissions != null) { uriPermissions.removeUriPermissionsLocked(); uriPermissions = null; } } Loading Loading @@ -578,38 +570,6 @@ class ActivityRecord extends IApplicationToken.Stub implements UriPermissionOwne state == ActivityState.RESUMED; } @Override public void addReadPermission(UriPermission perm) { if (readUriPermissions == null) { readUriPermissions = new HashSet<UriPermission>(); } readUriPermissions.add(perm); } @Override public void addWritePermission(UriPermission perm) { if (writeUriPermissions == null) { writeUriPermissions = new HashSet<UriPermission>(); } writeUriPermissions.add(perm); } @Override public void removeReadPermission(UriPermission perm) { readUriPermissions.remove(perm); if (readUriPermissions.size() == 0) { readUriPermissions = null; } } @Override public void removeWritePermission(UriPermission perm) { writeUriPermissions.remove(perm); if (writeUriPermissions.size() == 0) { writeUriPermissions = null; } } public String toString() { if (stringName != null) { return stringName; Loading