Loading core/java/android/app/ActivityManager.java +42 −0 Original line number Diff line number Diff line Loading @@ -36,10 +36,12 @@ import com.android.internal.util.FastPrintWriter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.UriPermission; import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.IPackageDataObserver; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.UserInfo; import android.content.res.Resources; import android.graphics.Bitmap; Loading @@ -59,6 +61,7 @@ import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Size; import android.util.Slog; import org.xmlpull.v1.XmlSerializer; import java.io.FileDescriptor; Loading Loading @@ -2256,6 +2259,45 @@ public class ActivityManager { return clearApplicationUserData(mContext.getPackageName(), null); } /** * Permits an application to get the persistent URI permissions granted to another. * * <p>Typically called by Settings. * * @param packageName application to look for the granted permissions * @return list of granted URI permissions * * @hide */ public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName) { try { return ActivityManagerNative.getDefault().getGrantedUriPermissions(packageName, UserHandle.myUserId()); } catch (RemoteException e) { Log.e(TAG, "Couldn't get granted URI permissions for :" + packageName, e); return ParceledListSlice.emptyList(); } } /** * Permits an application to clear the persistent URI permissions granted to another. * * <p>Typically called by Settings. * * @param packageName application to clear its granted permissions * * @hide */ public void clearGrantedUriPermissions(String packageName) { try { ActivityManagerNative.getDefault().clearGrantedUriPermissions(packageName, UserHandle.myUserId()); } catch (RemoteException e) { Log.e(TAG, "Couldn't clear granted URI permissions for :" + packageName, e); } } /** * Information you can retrieve about any processes that are in an error condition. */ Loading core/java/android/app/ActivityManagerNative.java +52 −0 Original line number Diff line number Diff line Loading @@ -1408,6 +1408,26 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case GET_GRANTED_URI_PERMISSIONS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final String packageName = data.readString(); final int userId = data.readInt(); final ParceledListSlice<UriPermission> perms = getGrantedUriPermissions(packageName, userId); reply.writeNoException(); perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); return true; } case CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final String packageName = data.readString(); final int userId = data.readInt(); clearGrantedUriPermissions(packageName, userId); reply.writeNoException(); return true; } case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder b = data.readStrongBinder(); Loading Loading @@ -4611,6 +4631,7 @@ class ActivityManagerProxy implements IActivityManager data.writeInt(incoming ? 1 : 0); mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); @SuppressWarnings("unchecked") final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel( reply); data.recycle(); Loading @@ -4618,6 +4639,37 @@ class ActivityManagerProxy implements IActivityManager return perms; } @Override public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName, int userId) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(packageName); data.writeInt(userId); mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); @SuppressWarnings("unchecked") final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel( reply); data.recycle(); reply.recycle(); return perms; } @Override public void clearGrantedUriPermissions(String packageName, int userId) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(packageName); data.writeInt(userId); mRemote.transact(CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); } public void showWaitingForDebugger(IApplicationThread who, boolean waiting) throws RemoteException { Parcel data = Parcel.obtain(); Loading core/java/android/app/IActivityManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -276,6 +276,15 @@ public interface IActivityManager extends IInterface { public ParceledListSlice<UriPermission> getPersistedUriPermissions( String packageName, boolean incoming) throws RemoteException; // Gets the URI permissions granted to an arbitrary package. // NOTE: this is different from getPersistedUriPermissions(), which returns the URIs the package // granted to another packages (instead of those granted to it). public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName, int userId) throws RemoteException; // Clears the URI permissions granted to an arbitrary package. public void clearGrantedUriPermissions(String packageName, int userId) throws RemoteException; public void showWaitingForDebugger(IApplicationThread who, boolean waiting) throws RemoteException; Loading Loading @@ -949,4 +958,6 @@ public interface IActivityManager extends IInterface { int GET_URI_PERMISSION_OWNER_FOR_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 357; int RESIZE_DOCKED_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 358; int SET_VR_MODE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 359; int GET_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 360; int CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 361; } core/res/AndroidManifest.xml +18 −0 Original line number Diff line number Diff line Loading @@ -391,6 +391,9 @@ <protected-broadcast android:name="android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED" /> <protected-broadcast android:name="android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED" /> <protected-broadcast android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" /> <protected-broadcast android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS" /> <!-- ====================================================================== --> <!-- RUNTIME PERMISSIONS --> <!-- ====================================================================== --> Loading Loading @@ -2192,6 +2195,21 @@ <permission android:name="android.permission.CLEAR_APP_USER_DATA" android:protectionLevel="signature|installer" /> <!-- @hide Allows an application to get the URI permissions granted to another application. <p>Not for use by third-party applications --> <permission android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" android:protectionLevel="signature" /> <!-- @hide Allows an application to clear the URI permissions granted to another application. <p>Not for use by third-party applications --> <permission android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS" android:protectionLevel="signature" /> <!-- @SystemApi Allows an application to delete cache files. <p>Not for use by third-party applications. --> <permission android:name="android.permission.DELETE_CACHE_FILES" Loading services/core/java/com/android/server/am/ActivityManagerService.java +29 −0 Original line number Diff line number Diff line Loading @@ -8637,6 +8637,35 @@ public final class ActivityManagerService extends ActivityManagerNative return new ParceledListSlice<android.content.UriPermission>(result); } @Override public ParceledListSlice<android.content.UriPermission> getGrantedUriPermissions( String packageName, int userId) { enforceCallingPermission(android.Manifest.permission.GET_APP_GRANTED_URI_PERMISSIONS, "getGrantedUriPermissions"); final ArrayList<android.content.UriPermission> result = Lists.newArrayList(); synchronized (this) { final int size = mGrantedUriPermissions.size(); for (int i = 0; i < size; i++) { final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.valueAt(i); for (UriPermission perm : perms.values()) { if (packageName.equals(perm.targetPkg) && perm.targetUserId == userId && perm.persistedModeFlags != 0) { result.add(perm.buildPersistedPublicApiObject()); } } } } return new ParceledListSlice<android.content.UriPermission>(result); } @Override public void clearGrantedUriPermissions(String packageName, int userId) { enforceCallingPermission(android.Manifest.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS, "clearGrantedUriPermissions"); removeUriPermissionsForPackageLocked(packageName, userId, true); } @Override public void showWaitingForDebugger(IApplicationThread who, boolean waiting) { synchronized (this) { Loading Loading
core/java/android/app/ActivityManager.java +42 −0 Original line number Diff line number Diff line Loading @@ -36,10 +36,12 @@ import com.android.internal.util.FastPrintWriter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.UriPermission; import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.IPackageDataObserver; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.UserInfo; import android.content.res.Resources; import android.graphics.Bitmap; Loading @@ -59,6 +61,7 @@ import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Size; import android.util.Slog; import org.xmlpull.v1.XmlSerializer; import java.io.FileDescriptor; Loading Loading @@ -2256,6 +2259,45 @@ public class ActivityManager { return clearApplicationUserData(mContext.getPackageName(), null); } /** * Permits an application to get the persistent URI permissions granted to another. * * <p>Typically called by Settings. * * @param packageName application to look for the granted permissions * @return list of granted URI permissions * * @hide */ public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName) { try { return ActivityManagerNative.getDefault().getGrantedUriPermissions(packageName, UserHandle.myUserId()); } catch (RemoteException e) { Log.e(TAG, "Couldn't get granted URI permissions for :" + packageName, e); return ParceledListSlice.emptyList(); } } /** * Permits an application to clear the persistent URI permissions granted to another. * * <p>Typically called by Settings. * * @param packageName application to clear its granted permissions * * @hide */ public void clearGrantedUriPermissions(String packageName) { try { ActivityManagerNative.getDefault().clearGrantedUriPermissions(packageName, UserHandle.myUserId()); } catch (RemoteException e) { Log.e(TAG, "Couldn't clear granted URI permissions for :" + packageName, e); } } /** * Information you can retrieve about any processes that are in an error condition. */ Loading
core/java/android/app/ActivityManagerNative.java +52 −0 Original line number Diff line number Diff line Loading @@ -1408,6 +1408,26 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case GET_GRANTED_URI_PERMISSIONS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final String packageName = data.readString(); final int userId = data.readInt(); final ParceledListSlice<UriPermission> perms = getGrantedUriPermissions(packageName, userId); reply.writeNoException(); perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); return true; } case CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); final String packageName = data.readString(); final int userId = data.readInt(); clearGrantedUriPermissions(packageName, userId); reply.writeNoException(); return true; } case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder b = data.readStrongBinder(); Loading Loading @@ -4611,6 +4631,7 @@ class ActivityManagerProxy implements IActivityManager data.writeInt(incoming ? 1 : 0); mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); @SuppressWarnings("unchecked") final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel( reply); data.recycle(); Loading @@ -4618,6 +4639,37 @@ class ActivityManagerProxy implements IActivityManager return perms; } @Override public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName, int userId) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(packageName); data.writeInt(userId); mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); @SuppressWarnings("unchecked") final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel( reply); data.recycle(); reply.recycle(); return perms; } @Override public void clearGrantedUriPermissions(String packageName, int userId) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(packageName); data.writeInt(userId); mRemote.transact(CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); } public void showWaitingForDebugger(IApplicationThread who, boolean waiting) throws RemoteException { Parcel data = Parcel.obtain(); Loading
core/java/android/app/IActivityManager.java +11 −0 Original line number Diff line number Diff line Loading @@ -276,6 +276,15 @@ public interface IActivityManager extends IInterface { public ParceledListSlice<UriPermission> getPersistedUriPermissions( String packageName, boolean incoming) throws RemoteException; // Gets the URI permissions granted to an arbitrary package. // NOTE: this is different from getPersistedUriPermissions(), which returns the URIs the package // granted to another packages (instead of those granted to it). public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName, int userId) throws RemoteException; // Clears the URI permissions granted to an arbitrary package. public void clearGrantedUriPermissions(String packageName, int userId) throws RemoteException; public void showWaitingForDebugger(IApplicationThread who, boolean waiting) throws RemoteException; Loading Loading @@ -949,4 +958,6 @@ public interface IActivityManager extends IInterface { int GET_URI_PERMISSION_OWNER_FOR_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 357; int RESIZE_DOCKED_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 358; int SET_VR_MODE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 359; int GET_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 360; int CLEAR_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 361; }
core/res/AndroidManifest.xml +18 −0 Original line number Diff line number Diff line Loading @@ -391,6 +391,9 @@ <protected-broadcast android:name="android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED" /> <protected-broadcast android:name="android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED" /> <protected-broadcast android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" /> <protected-broadcast android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS" /> <!-- ====================================================================== --> <!-- RUNTIME PERMISSIONS --> <!-- ====================================================================== --> Loading Loading @@ -2192,6 +2195,21 @@ <permission android:name="android.permission.CLEAR_APP_USER_DATA" android:protectionLevel="signature|installer" /> <!-- @hide Allows an application to get the URI permissions granted to another application. <p>Not for use by third-party applications --> <permission android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" android:protectionLevel="signature" /> <!-- @hide Allows an application to clear the URI permissions granted to another application. <p>Not for use by third-party applications --> <permission android:name="android.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS" android:protectionLevel="signature" /> <!-- @SystemApi Allows an application to delete cache files. <p>Not for use by third-party applications. --> <permission android:name="android.permission.DELETE_CACHE_FILES" Loading
services/core/java/com/android/server/am/ActivityManagerService.java +29 −0 Original line number Diff line number Diff line Loading @@ -8637,6 +8637,35 @@ public final class ActivityManagerService extends ActivityManagerNative return new ParceledListSlice<android.content.UriPermission>(result); } @Override public ParceledListSlice<android.content.UriPermission> getGrantedUriPermissions( String packageName, int userId) { enforceCallingPermission(android.Manifest.permission.GET_APP_GRANTED_URI_PERMISSIONS, "getGrantedUriPermissions"); final ArrayList<android.content.UriPermission> result = Lists.newArrayList(); synchronized (this) { final int size = mGrantedUriPermissions.size(); for (int i = 0; i < size; i++) { final ArrayMap<GrantUri, UriPermission> perms = mGrantedUriPermissions.valueAt(i); for (UriPermission perm : perms.values()) { if (packageName.equals(perm.targetPkg) && perm.targetUserId == userId && perm.persistedModeFlags != 0) { result.add(perm.buildPersistedPublicApiObject()); } } } } return new ParceledListSlice<android.content.UriPermission>(result); } @Override public void clearGrantedUriPermissions(String packageName, int userId) { enforceCallingPermission(android.Manifest.permission.CLEAR_APP_GRANTED_URI_PERMISSIONS, "clearGrantedUriPermissions"); removeUriPermissionsForPackageLocked(packageName, userId, true); } @Override public void showWaitingForDebugger(IApplicationThread who, boolean waiting) { synchronized (this) { Loading