Loading api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -7289,6 +7289,7 @@ package android.app.slice { method public final java.lang.String getType(android.net.Uri); method public final java.lang.String getType(android.net.Uri); method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues); method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues); method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>); method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>); method public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri); method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri); method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri); method public android.net.Uri onMapIntentToUri(android.content.Intent); method public android.net.Uri onMapIntentToUri(android.content.Intent); method public void onSlicePinned(android.net.Uri); method public void onSlicePinned(android.net.Uri); core/java/android/app/slice/SliceManager.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -32,9 +32,11 @@ import android.os.Binder; import android.os.Bundle; import android.os.Bundle; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.Process; import android.os.RemoteException; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; import android.os.ServiceManager.ServiceNotFoundException; import android.os.UserHandle; import android.util.Log; import android.util.Log; import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions; Loading Loading @@ -392,6 +394,9 @@ public class SliceManager { */ */ public void enforceSlicePermission(Uri uri, String pkg, int pid, int uid) { public void enforceSlicePermission(Uri uri, String pkg, int pid, int uid) { try { try { if (UserHandle.isSameApp(uid, Process.myUid())) { return; } if (pkg == null) { if (pkg == null) { throw new SecurityException("No pkg specified"); throw new SecurityException("No pkg specified"); } } Loading core/java/android/app/slice/SliceProvider.java +33 −33 Original line number Original line Diff line number Diff line Loading @@ -37,7 +37,6 @@ import android.os.Handler; import android.os.Process; import android.os.Process; import android.os.StrictMode; import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.os.StrictMode.ThreadPolicy; import android.os.UserHandle; import android.util.Log; import android.util.Log; import java.util.ArrayList; import java.util.ArrayList; Loading Loading @@ -146,18 +145,6 @@ public abstract class SliceProvider extends ContentProvider { * @hide * @hide */ */ public static final String EXTRA_PROVIDER_PKG = "provider_pkg"; public static final String EXTRA_PROVIDER_PKG = "provider_pkg"; /** * @hide */ public static final String EXTRA_OVERRIDE_PKG = "override_pkg"; /** * @hide */ public static final String EXTRA_OVERRIDE_UID = "override_uid"; /** * @hide */ public static final String EXTRA_OVERRIDE_PID = "override_pid"; private static final boolean DEBUG = false; private static final boolean DEBUG = false; Loading Loading @@ -257,6 +244,23 @@ public abstract class SliceProvider extends ContentProvider { "This provider has not implemented intent to uri mapping"); "This provider has not implemented intent to uri mapping"); } } /** * Called when an app requests a slice it does not have write permission * to the uri for. * <p> * The return value will be the action on a slice that prompts the user that * the calling app wants to show slices from this app. The default implementation * launches a dialog that allows the user to grant access to this slice. Apps * that do not want to allow this user grant, can override this and instead * launch their own dialog with different behavior. * * @param sliceUri the Uri of the slice attempting to be bound. * @see #getCallingPackage() */ public @NonNull PendingIntent onCreatePermissionRequest(Uri sliceUri) { return createPermissionIntent(getContext(), sliceUri, getCallingPackage()); } @Override @Override public final int update(Uri uri, ContentValues values, String selection, public final int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { String[] selectionArgs) { Loading Loading @@ -312,17 +316,7 @@ public abstract class SliceProvider extends ContentProvider { String callingPackage = getCallingPackage(); String callingPackage = getCallingPackage(); int callingUid = Binder.getCallingUid(); int callingUid = Binder.getCallingUid(); int callingPid = Binder.getCallingPid(); int callingPid = Binder.getCallingPid(); if (extras.containsKey(EXTRA_OVERRIDE_PKG)) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { throw new SecurityException("Only the system can override calling pkg"); } // This is safe because we would grant SYSTEM_UID access to all slices // and want to allow it to bind slices as if it were a less privileged app // to check their permission levels. callingPackage = extras.getString(EXTRA_OVERRIDE_PKG); callingUid = extras.getInt(EXTRA_OVERRIDE_UID); callingPid = extras.getInt(EXTRA_OVERRIDE_PID); } Slice s = handleBindSlice(uri, supportedSpecs, callingPackage, callingUid, callingPid); Slice s = handleBindSlice(uri, supportedSpecs, callingPackage, callingUid, callingPid); Bundle b = new Bundle(); Bundle b = new Bundle(); b.putParcelable(EXTRA_SLICE, s); b.putParcelable(EXTRA_SLICE, s); Loading Loading @@ -406,14 +400,12 @@ public abstract class SliceProvider extends ContentProvider { // SliceManager#bindSlice. // SliceManager#bindSlice. String pkg = callingPkg != null ? callingPkg String pkg = callingPkg != null ? callingPkg : getContext().getPackageManager().getNameForUid(callingUid); : getContext().getPackageManager().getNameForUid(callingUid); if (!UserHandle.isSameApp(callingUid, Process.myUid())) { try { try { mSliceManager.enforceSlicePermission(sliceUri, pkg, mSliceManager.enforceSlicePermission(sliceUri, pkg, callingPid, callingUid); callingPid, callingUid); } catch (SecurityException e) { } catch (SecurityException e) { return createPermissionSlice(getContext(), sliceUri, pkg); return createPermissionSlice(getContext(), sliceUri, pkg); } } } mCallback = "onBindSlice"; mCallback = "onBindSlice"; Handler.getMain().postDelayed(mAnr, SLICE_BIND_ANR); Handler.getMain().postDelayed(mAnr, SLICE_BIND_ANR); try { try { Loading @@ -426,10 +418,18 @@ public abstract class SliceProvider extends ContentProvider { /** /** * @hide * @hide */ */ public static Slice createPermissionSlice(Context context, Uri sliceUri, public Slice createPermissionSlice(Context context, Uri sliceUri, String callingPackage) { String callingPackage) { PendingIntent action; mCallback = "onCreatePermissionRequest"; Handler.getMain().postDelayed(mAnr, SLICE_BIND_ANR); try { action = onCreatePermissionRequest(sliceUri); } finally { Handler.getMain().removeCallbacks(mAnr); } return new Slice.Builder(sliceUri) return new Slice.Builder(sliceUri) .addAction(createPermissionIntent(context, sliceUri, callingPackage), .addAction(action, new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build()) new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build()) .addText(getPermissionString(context, callingPackage), null, .addText(getPermissionString(context, callingPackage), null, Collections.emptyList()) Collections.emptyList()) Loading Loading
api/current.txt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -7289,6 +7289,7 @@ package android.app.slice { method public final java.lang.String getType(android.net.Uri); method public final java.lang.String getType(android.net.Uri); method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues); method public final android.net.Uri insert(android.net.Uri, android.content.ContentValues); method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>); method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>); method public android.app.PendingIntent onCreatePermissionRequest(android.net.Uri); method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri); method public java.util.Collection<android.net.Uri> onGetSliceDescendants(android.net.Uri); method public android.net.Uri onMapIntentToUri(android.content.Intent); method public android.net.Uri onMapIntentToUri(android.content.Intent); method public void onSlicePinned(android.net.Uri); method public void onSlicePinned(android.net.Uri);
core/java/android/app/slice/SliceManager.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -32,9 +32,11 @@ import android.os.Binder; import android.os.Bundle; import android.os.Bundle; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.Process; import android.os.RemoteException; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; import android.os.ServiceManager.ServiceNotFoundException; import android.os.UserHandle; import android.util.Log; import android.util.Log; import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions; Loading Loading @@ -392,6 +394,9 @@ public class SliceManager { */ */ public void enforceSlicePermission(Uri uri, String pkg, int pid, int uid) { public void enforceSlicePermission(Uri uri, String pkg, int pid, int uid) { try { try { if (UserHandle.isSameApp(uid, Process.myUid())) { return; } if (pkg == null) { if (pkg == null) { throw new SecurityException("No pkg specified"); throw new SecurityException("No pkg specified"); } } Loading
core/java/android/app/slice/SliceProvider.java +33 −33 Original line number Original line Diff line number Diff line Loading @@ -37,7 +37,6 @@ import android.os.Handler; import android.os.Process; import android.os.Process; import android.os.StrictMode; import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.os.StrictMode.ThreadPolicy; import android.os.UserHandle; import android.util.Log; import android.util.Log; import java.util.ArrayList; import java.util.ArrayList; Loading Loading @@ -146,18 +145,6 @@ public abstract class SliceProvider extends ContentProvider { * @hide * @hide */ */ public static final String EXTRA_PROVIDER_PKG = "provider_pkg"; public static final String EXTRA_PROVIDER_PKG = "provider_pkg"; /** * @hide */ public static final String EXTRA_OVERRIDE_PKG = "override_pkg"; /** * @hide */ public static final String EXTRA_OVERRIDE_UID = "override_uid"; /** * @hide */ public static final String EXTRA_OVERRIDE_PID = "override_pid"; private static final boolean DEBUG = false; private static final boolean DEBUG = false; Loading Loading @@ -257,6 +244,23 @@ public abstract class SliceProvider extends ContentProvider { "This provider has not implemented intent to uri mapping"); "This provider has not implemented intent to uri mapping"); } } /** * Called when an app requests a slice it does not have write permission * to the uri for. * <p> * The return value will be the action on a slice that prompts the user that * the calling app wants to show slices from this app. The default implementation * launches a dialog that allows the user to grant access to this slice. Apps * that do not want to allow this user grant, can override this and instead * launch their own dialog with different behavior. * * @param sliceUri the Uri of the slice attempting to be bound. * @see #getCallingPackage() */ public @NonNull PendingIntent onCreatePermissionRequest(Uri sliceUri) { return createPermissionIntent(getContext(), sliceUri, getCallingPackage()); } @Override @Override public final int update(Uri uri, ContentValues values, String selection, public final int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { String[] selectionArgs) { Loading Loading @@ -312,17 +316,7 @@ public abstract class SliceProvider extends ContentProvider { String callingPackage = getCallingPackage(); String callingPackage = getCallingPackage(); int callingUid = Binder.getCallingUid(); int callingUid = Binder.getCallingUid(); int callingPid = Binder.getCallingPid(); int callingPid = Binder.getCallingPid(); if (extras.containsKey(EXTRA_OVERRIDE_PKG)) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { throw new SecurityException("Only the system can override calling pkg"); } // This is safe because we would grant SYSTEM_UID access to all slices // and want to allow it to bind slices as if it were a less privileged app // to check their permission levels. callingPackage = extras.getString(EXTRA_OVERRIDE_PKG); callingUid = extras.getInt(EXTRA_OVERRIDE_UID); callingPid = extras.getInt(EXTRA_OVERRIDE_PID); } Slice s = handleBindSlice(uri, supportedSpecs, callingPackage, callingUid, callingPid); Slice s = handleBindSlice(uri, supportedSpecs, callingPackage, callingUid, callingPid); Bundle b = new Bundle(); Bundle b = new Bundle(); b.putParcelable(EXTRA_SLICE, s); b.putParcelable(EXTRA_SLICE, s); Loading Loading @@ -406,14 +400,12 @@ public abstract class SliceProvider extends ContentProvider { // SliceManager#bindSlice. // SliceManager#bindSlice. String pkg = callingPkg != null ? callingPkg String pkg = callingPkg != null ? callingPkg : getContext().getPackageManager().getNameForUid(callingUid); : getContext().getPackageManager().getNameForUid(callingUid); if (!UserHandle.isSameApp(callingUid, Process.myUid())) { try { try { mSliceManager.enforceSlicePermission(sliceUri, pkg, mSliceManager.enforceSlicePermission(sliceUri, pkg, callingPid, callingUid); callingPid, callingUid); } catch (SecurityException e) { } catch (SecurityException e) { return createPermissionSlice(getContext(), sliceUri, pkg); return createPermissionSlice(getContext(), sliceUri, pkg); } } } mCallback = "onBindSlice"; mCallback = "onBindSlice"; Handler.getMain().postDelayed(mAnr, SLICE_BIND_ANR); Handler.getMain().postDelayed(mAnr, SLICE_BIND_ANR); try { try { Loading @@ -426,10 +418,18 @@ public abstract class SliceProvider extends ContentProvider { /** /** * @hide * @hide */ */ public static Slice createPermissionSlice(Context context, Uri sliceUri, public Slice createPermissionSlice(Context context, Uri sliceUri, String callingPackage) { String callingPackage) { PendingIntent action; mCallback = "onCreatePermissionRequest"; Handler.getMain().postDelayed(mAnr, SLICE_BIND_ANR); try { action = onCreatePermissionRequest(sliceUri); } finally { Handler.getMain().removeCallbacks(mAnr); } return new Slice.Builder(sliceUri) return new Slice.Builder(sliceUri) .addAction(createPermissionIntent(context, sliceUri, callingPackage), .addAction(action, new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build()) new Slice.Builder(sliceUri.buildUpon().appendPath("permission").build()) .addText(getPermissionString(context, callingPackage), null, .addText(getPermissionString(context, callingPackage), null, Collections.emptyList()) Collections.emptyList()) Loading