Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5f64a36 authored by Jason Monk's avatar Jason Monk Committed by Android (Google) Code Review
Browse files

Merge "Add SliceSpec to Slice API"

parents d7e5d09a 2af1998e
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -6973,11 +6973,12 @@ package android.app.slice {
  public final class Slice implements android.os.Parcelable {
    ctor protected Slice(android.os.Parcel);
    method public static android.app.slice.Slice bindSlice(android.content.ContentResolver, android.net.Uri);
    method public static android.app.slice.Slice bindSlice(android.content.Context, android.content.Intent);
    method public static android.app.slice.Slice bindSlice(android.content.ContentResolver, android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
    method public static android.app.slice.Slice bindSlice(android.content.Context, android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
    method public int describeContents();
    method public java.util.List<java.lang.String> getHints();
    method public java.util.List<android.app.slice.SliceItem> getItems();
    method public android.app.slice.SliceSpec getSpec();
    method public android.net.Uri getUri();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
@@ -7012,6 +7013,7 @@ package android.app.slice {
    method public android.app.slice.Slice.Builder addTimestamp(long, java.lang.String...);
    method public android.app.slice.Slice.Builder addTimestamp(long, java.util.List<java.lang.String>);
    method public android.app.slice.Slice build();
    method public android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
  }
  public final class SliceItem implements android.os.Parcelable {
@@ -7042,7 +7044,8 @@ package android.app.slice {
    method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    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 abstract android.app.slice.Slice onBindSlice(android.net.Uri);
    method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
    method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri);
    method public android.net.Uri onMapIntentToUri(android.content.Intent);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
@@ -7051,6 +7054,16 @@ package android.app.slice {
    field public static final java.lang.String SLICE_TYPE = "vnd.android.slice";
  }
  public final class SliceSpec implements android.os.Parcelable {
    ctor public SliceSpec(java.lang.String, int);
    method public boolean canRender(android.app.slice.SliceSpec);
    method public int describeContents();
    method public int getRevision();
    method public java.lang.String getType();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.slice.SliceSpec> CREATOR;
  }
}
package android.app.usage {
+17 −4
Original line number Diff line number Diff line
@@ -7417,11 +7417,12 @@ package android.app.slice {
  public final class Slice implements android.os.Parcelable {
    ctor protected Slice(android.os.Parcel);
    method public static android.app.slice.Slice bindSlice(android.content.ContentResolver, android.net.Uri);
    method public static android.app.slice.Slice bindSlice(android.content.Context, android.content.Intent);
    method public static android.app.slice.Slice bindSlice(android.content.ContentResolver, android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
    method public static android.app.slice.Slice bindSlice(android.content.Context, android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
    method public int describeContents();
    method public java.util.List<java.lang.String> getHints();
    method public java.util.List<android.app.slice.SliceItem> getItems();
    method public android.app.slice.SliceSpec getSpec();
    method public android.net.Uri getUri();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
@@ -7456,6 +7457,7 @@ package android.app.slice {
    method public android.app.slice.Slice.Builder addTimestamp(long, java.lang.String...);
    method public android.app.slice.Slice.Builder addTimestamp(long, java.util.List<java.lang.String>);
    method public android.app.slice.Slice build();
    method public android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
  }
  public final class SliceItem implements android.os.Parcelable {
@@ -7486,7 +7488,8 @@ package android.app.slice {
    method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    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 abstract android.app.slice.Slice onBindSlice(android.net.Uri);
    method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
    method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri);
    method public android.net.Uri onMapIntentToUri(android.content.Intent);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
@@ -7495,6 +7498,16 @@ package android.app.slice {
    field public static final java.lang.String SLICE_TYPE = "vnd.android.slice";
  }
  public final class SliceSpec implements android.os.Parcelable {
    ctor public SliceSpec(java.lang.String, int);
    method public boolean canRender(android.app.slice.SliceSpec);
    method public int describeContents();
    method public int getRevision();
    method public java.lang.String getType();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.slice.SliceSpec> CREATOR;
  }
}
package android.app.usage {
@@ -48173,8 +48186,8 @@ package android.util {
  }
  public final class StatsManager {
    method public byte[] getData(java.lang.String);
    method public boolean addConfiguration(java.lang.String, byte[], java.lang.String, java.lang.String);
    method public byte[] getData(java.lang.String);
    method public boolean removeConfiguration(java.lang.String);
  }
+16 −3
Original line number Diff line number Diff line
@@ -7047,11 +7047,12 @@ package android.app.slice {
  public final class Slice implements android.os.Parcelable {
    ctor protected Slice(android.os.Parcel);
    method public static android.app.slice.Slice bindSlice(android.content.ContentResolver, android.net.Uri);
    method public static android.app.slice.Slice bindSlice(android.content.Context, android.content.Intent);
    method public static android.app.slice.Slice bindSlice(android.content.ContentResolver, android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
    method public static android.app.slice.Slice bindSlice(android.content.Context, android.content.Intent, java.util.List<android.app.slice.SliceSpec>);
    method public int describeContents();
    method public java.util.List<java.lang.String> getHints();
    method public java.util.List<android.app.slice.SliceItem> getItems();
    method public android.app.slice.SliceSpec getSpec();
    method public android.net.Uri getUri();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.slice.Slice> CREATOR;
@@ -7086,6 +7087,7 @@ package android.app.slice {
    method public android.app.slice.Slice.Builder addTimestamp(long, java.lang.String...);
    method public android.app.slice.Slice.Builder addTimestamp(long, java.util.List<java.lang.String>);
    method public android.app.slice.Slice build();
    method public android.app.slice.Slice.Builder setSpec(android.app.slice.SliceSpec);
  }
  public final class SliceItem implements android.os.Parcelable {
@@ -7116,7 +7118,8 @@ package android.app.slice {
    method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    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 abstract android.app.slice.Slice onBindSlice(android.net.Uri);
    method public android.app.slice.Slice onBindSlice(android.net.Uri, java.util.List<android.app.slice.SliceSpec>);
    method public deprecated android.app.slice.Slice onBindSlice(android.net.Uri);
    method public android.net.Uri onMapIntentToUri(android.content.Intent);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
@@ -7125,6 +7128,16 @@ package android.app.slice {
    field public static final java.lang.String SLICE_TYPE = "vnd.android.slice";
  }
  public final class SliceSpec implements android.os.Parcelable {
    ctor public SliceSpec(java.lang.String, int);
    method public boolean canRender(android.app.slice.SliceSpec);
    method public int describeContents();
    method public int getRevision();
    method public java.lang.String getType();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.app.slice.SliceSpec> CREATOR;
  }
}
package android.app.usage {
+41 −8
Original line number Diff line number Diff line
@@ -143,12 +143,14 @@ public final class Slice implements Parcelable {

    private final SliceItem[] mItems;
    private final @SliceHint String[] mHints;
    private SliceSpec mSpec;
    private Uri mUri;

    Slice(ArrayList<SliceItem> items, @SliceHint String[] hints, Uri uri) {
    Slice(ArrayList<SliceItem> items, @SliceHint String[] hints, Uri uri, SliceSpec spec) {
        mHints = hints;
        mItems = items.toArray(new SliceItem[items.size()]);
        mUri = uri;
        mSpec = spec;
    }

    protected Slice(Parcel in) {
@@ -159,6 +161,14 @@ public final class Slice implements Parcelable {
            mItems[i] = SliceItem.CREATOR.createFromParcel(in);
        }
        mUri = Uri.CREATOR.createFromParcel(in);
        mSpec = in.readTypedObject(SliceSpec.CREATOR);
    }

    /**
     * @return The spec for this slice
     */
    public @Nullable SliceSpec getSpec() {
        return mSpec;
    }

    /**
@@ -190,6 +200,7 @@ public final class Slice implements Parcelable {
            mItems[i].writeToParcel(dest, flags);
        }
        mUri.writeToParcel(dest, 0);
        dest.writeTypedObject(mSpec, flags);
    }

    @Override
@@ -212,6 +223,7 @@ public final class Slice implements Parcelable {
        private final Uri mUri;
        private ArrayList<SliceItem> mItems = new ArrayList<>();
        private @SliceHint ArrayList<String> mHints = new ArrayList<>();
        private SliceSpec mSpec;

        /**
         * Create a builder which will construct a {@link Slice} for the Given Uri.
@@ -246,12 +258,22 @@ public final class Slice implements Parcelable {
            return addHints(hints.toArray(new String[hints.size()]));
        }

        /**
         * Add the spec for this slice.
         */
        public Builder setSpec(SliceSpec spec) {
            mSpec = spec;
            return this;
        }

        /**
         * Add a sub-slice to the slice being constructed
         */
        public Builder addSubSlice(@NonNull Slice slice) {
            mItems.add(new SliceItem(slice, SliceItem.TYPE_SLICE, slice.getHints().toArray(
                    new String[slice.getHints().size()])));
            List<String> hints = slice.getHints();
            slice.mSpec = null;
            mItems.add(new SliceItem(slice, SliceItem.TYPE_SLICE, hints.toArray(
                    new String[hints.size()])));
            return this;
        }

@@ -259,7 +281,10 @@ public final class Slice implements Parcelable {
         * Add an action to the slice being constructed
         */
        public Slice.Builder addAction(@NonNull PendingIntent action, @NonNull Slice s) {
            mItems.add(new SliceItem(action, s, SliceItem.TYPE_ACTION, new String[0]));
            List<String> hints = s.getHints();
            s.mSpec = null;
            mItems.add(new SliceItem(action, s, SliceItem.TYPE_ACTION, hints.toArray(
                    new String[hints.size()])));
            return this;
        }

@@ -351,7 +376,7 @@ public final class Slice implements Parcelable {
         * Construct the slice.
         */
        public Slice build() {
            return new Slice(mItems, mHints.toArray(new String[mHints.size()]), mUri);
            return new Slice(mItems, mHints.toArray(new String[mHints.size()]), mUri, mSpec);
        }
    }

@@ -399,10 +424,12 @@ public final class Slice implements Parcelable {
     *
     * @param resolver ContentResolver to be used.
     * @param uri The URI to a slice provider
     * @param supportedSpecs List of supported specs.
     * @return The Slice provided by the app or null if none is given.
     * @see Slice
     */
    public static @Nullable Slice bindSlice(ContentResolver resolver, @NonNull Uri uri) {
    public static @Nullable Slice bindSlice(ContentResolver resolver, @NonNull Uri uri,
            List<SliceSpec> supportedSpecs) {
        Preconditions.checkNotNull(uri, "uri");
        IContentProvider provider = resolver.acquireProvider(uri);
        if (provider == null) {
@@ -411,6 +438,8 @@ public final class Slice implements Parcelable {
        try {
            Bundle extras = new Bundle();
            extras.putParcelable(SliceProvider.EXTRA_BIND_URI, uri);
            extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS,
                    new ArrayList<>(supportedSpecs));
            final Bundle res = provider.call(resolver.getPackageName(), SliceProvider.METHOD_SLICE,
                    null, extras);
            Bundle.setDefusable(res, true);
@@ -434,12 +463,14 @@ public final class Slice implements Parcelable {
     *
     * @param context The context to use.
     * @param intent The intent associated with a slice.
     * @param supportedSpecs List of supported specs.
     * @return The Slice provided by the app or null if none is given.
     * @see Slice
     * @see SliceProvider#onMapIntentToUri(Intent)
     * @see Intent
     */
    public static @Nullable Slice bindSlice(Context context, @NonNull Intent intent) {
    public static @Nullable Slice bindSlice(Context context, @NonNull Intent intent,
            List<SliceSpec> supportedSpecs) {
        Preconditions.checkNotNull(intent, "intent");
        Preconditions.checkArgument(intent.getComponent() != null || intent.getPackage() != null,
                "Slice intent must be explicit " + intent);
@@ -448,7 +479,7 @@ public final class Slice implements Parcelable {
        // Check if the intent has data for the slice uri on it and use that
        final Uri intentData = intent.getData();
        if (intentData != null && SliceProvider.SLICE_TYPE.equals(resolver.getType(intentData))) {
            return bindSlice(resolver, intentData);
            return bindSlice(resolver, intentData, supportedSpecs);
        }
        // Otherwise ask the app
        List<ResolveInfo> providers =
@@ -466,6 +497,8 @@ public final class Slice implements Parcelable {
        try {
            Bundle extras = new Bundle();
            extras.putParcelable(SliceProvider.EXTRA_INTENT, intent);
            extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS,
                    new ArrayList<>(supportedSpecs));
            final Bundle res = provider.call(resolver.getPackageName(),
                    SliceProvider.METHOD_MAP_INTENT, null, extras);
            if (res == null) {
+29 −9
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.os.StrictMode.ThreadPolicy;
import android.os.UserHandle;
import android.util.Log;

import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
@@ -89,6 +90,10 @@ public abstract class SliceProvider extends ContentProvider {
     * @hide
     */
    public static final String EXTRA_BIND_URI = "slice_uri";
    /**
     * @hide
     */
    public static final String EXTRA_SUPPORTED_SPECS = "supported_specs";
    /**
     * @hide
     */
@@ -117,12 +122,25 @@ public abstract class SliceProvider extends ContentProvider {
     * off the main thread with a call to {@link ContentResolver#notifyChange(Uri, ContentObserver)}
     * when the app is ready to provide the complete data in onBindSlice.
     * <p>
     * The slice returned should have a spec that is compatible with one of
     * the supported specs.
     *
     * @param sliceUri Uri to bind.
     * @param supportedSpecs List of supported specs.
     * @see {@link Slice}.
     * @see {@link Slice#HINT_PARTIAL}
     */
    // TODO: Provide alternate notifyChange that takes in the slice (i.e. notifyChange(Uri, Slice)).
    public abstract Slice onBindSlice(Uri sliceUri);
    public Slice onBindSlice(Uri sliceUri, List<SliceSpec> supportedSpecs) {
        return onBindSlice(sliceUri);
    }

    /**
     * @deprecated migrating to {@link #onBindSlice(Uri, List)}
     */
    @Deprecated
    public Slice onBindSlice(Uri sliceUri) {
        return null;
    }

    /**
     * This method must be overridden if an {@link IntentFilter} is specified on the SliceProvider.
@@ -193,8 +211,9 @@ public abstract class SliceProvider extends ContentProvider {
                        Intent.FLAG_GRANT_WRITE_URI_PERMISSION,
                        "Slice binding requires the permission BIND_SLICE");
            }
            List<SliceSpec> supportedSpecs = extras.getParcelableArrayList(EXTRA_SUPPORTED_SPECS);

            Slice s = handleBindSlice(uri);
            Slice s = handleBindSlice(uri, supportedSpecs);
            Bundle b = new Bundle();
            b.putParcelable(EXTRA_SLICE, s);
            return b;
@@ -203,9 +222,10 @@ public abstract class SliceProvider extends ContentProvider {
                    "Slice binding requires the permission BIND_SLICE");
            Intent intent = extras.getParcelable(EXTRA_INTENT);
            Uri uri = onMapIntentToUri(intent);
            List<SliceSpec> supportedSpecs = extras.getParcelableArrayList(EXTRA_SUPPORTED_SPECS);
            Bundle b = new Bundle();
            if (uri != null) {
                Slice s = handleBindSlice(uri);
                Slice s = handleBindSlice(uri, supportedSpecs);
                b.putParcelable(EXTRA_SLICE, s);
            } else {
                b.putParcelable(EXTRA_SLICE, null);
@@ -215,14 +235,14 @@ public abstract class SliceProvider extends ContentProvider {
        return super.call(method, arg, extras);
    }

    private Slice handleBindSlice(Uri sliceUri) {
    private Slice handleBindSlice(Uri sliceUri, List<SliceSpec> supportedSpecs) {
        if (Looper.myLooper() == Looper.getMainLooper()) {
            return onBindSliceStrict(sliceUri);
            return onBindSliceStrict(sliceUri, supportedSpecs);
        } else {
            CountDownLatch latch = new CountDownLatch(1);
            Slice[] output = new Slice[1];
            Handler.getMain().post(() -> {
                output[0] = onBindSliceStrict(sliceUri);
                output[0] = onBindSliceStrict(sliceUri, supportedSpecs);
                latch.countDown();
            });
            try {
@@ -234,14 +254,14 @@ public abstract class SliceProvider extends ContentProvider {
        }
    }

    private Slice onBindSliceStrict(Uri sliceUri) {
    private Slice onBindSliceStrict(Uri sliceUri, List<SliceSpec> supportedSpecs) {
        ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
        try {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                    .detectAll()
                    .penaltyDeath()
                    .build());
            return onBindSlice(sliceUri);
            return onBindSlice(sliceUri, supportedSpecs);
        } finally {
            StrictMode.setThreadPolicy(oldPolicy);
        }
Loading