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

Commit 7e735751 authored by Felipe Leme's avatar Felipe Leme
Browse files

Minor changes on LocusId APIs.

- Uses a String instead of URI for the main id.
- Uses FLAG_IS_PREFIX instead of isRecursive for UserDataRemovalRequest.

Test: m update-api
Test: atest CtsContentCaptureServiceTestCases CtsContentTestCases:LocusIdTest \
            FrameworksCoreTests:android.view.contentcapture.ContentCaptureEventTest
Bug: 126945732

Change-Id: I34ae42678aa4021ea53ed66279cad4049ac2dcb3
parent ac4eafc9
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -10638,9 +10638,9 @@ package android.content {
  }
  public final class LocusId implements android.os.Parcelable {
    ctor public LocusId(@NonNull android.net.Uri);
    ctor public LocusId(@NonNull String);
    method public int describeContents();
    method @NonNull public android.net.Uri getUri();
    method @NonNull public String getId();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.content.LocusId> CREATOR;
  }
@@ -53037,7 +53037,7 @@ package android.view.contentcapture {
  public final class ContentCaptureContext implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public static android.view.contentcapture.ContentCaptureContext forLocusId(@NonNull android.net.Uri);
    method @NonNull public static android.view.contentcapture.ContentCaptureContext forLocusId(@NonNull String);
    method @Nullable public android.os.Bundle getExtras();
    method @NonNull public android.content.LocusId getLocusId();
    method public void writeToParcel(android.os.Parcel, int);
@@ -53085,18 +53085,19 @@ package android.view.contentcapture {
    method public boolean isForEverything();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.view.contentcapture.UserDataRemovalRequest> CREATOR;
    field public static final int FLAG_IS_PREFIX = 1; // 0x1
  }
  public static final class UserDataRemovalRequest.Builder {
    ctor public UserDataRemovalRequest.Builder();
    method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, boolean);
    method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, int);
    method @NonNull public android.view.contentcapture.UserDataRemovalRequest build();
    method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
  }
  public final class UserDataRemovalRequest.LocusIdRequest {
    method @NonNull public int getFlags();
    method @NonNull public android.content.LocusId getLocusId();
    method @NonNull public boolean isRecursive();
  }
}
+19 −20
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@
package android.content;

import android.annotation.NonNull;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;

@@ -34,28 +33,28 @@ import java.io.PrintWriter;
// TODO(b/123577059): make sure this is well documented and understandable
public final class LocusId implements Parcelable {

    private final Uri mUri;
    private final String mId;

    /**
     * Default constructor.
     */
    public LocusId(@NonNull Uri uri) {
        mUri = Preconditions.checkNotNull(uri);
    public LocusId(@NonNull String id) {
        mId = Preconditions.checkNotNull(id);
    }

    /**
     * Gets the {@code uri} associated with the locus.
     * Gets the {@code id} associated with the locus.
     */
    @NonNull
    public Uri getUri() {
        return mUri;
    public String getId() {
        return mId;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((mUri == null) ? 0 : mUri.hashCode());
        result = prime * result + ((mId == null) ? 0 : mId.hashCode());
        return result;
    }

@@ -65,26 +64,27 @@ public final class LocusId implements Parcelable {
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        final LocusId other = (LocusId) obj;
        if (mUri == null) {
            if (other.mUri != null) return false;
        if (mId == null) {
            if (other.mId != null) return false;
        } else {
            if (!mUri.equals(other.mUri)) return false;
            if (!mId.equals(other.mId)) return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "LocusId[uri=" + getSanitizedUri() + "]";
        return "LocusId[" + getSanitizedId() + "]";
    }

    /** @hide */
    public void dump(@NonNull PrintWriter pw) {
        pw.print("uri:"); pw.println(getSanitizedUri());
        pw.print("id:"); pw.println(getSanitizedId());
    }

    private String getSanitizedUri() {
        final int size = mUri.toString().length();
    @NonNull
    private String getSanitizedId() {
        final int size = mId.length();
        return size + "_chars";
    }

@@ -94,8 +94,8 @@ public final class LocusId implements Parcelable {
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeParcelable(mUri, flags);
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeString(mId);
    }

    public static final @android.annotation.NonNull Parcelable.Creator<LocusId> CREATOR =
@@ -103,9 +103,8 @@ public final class LocusId implements Parcelable {

        @NonNull
        @Override
        public LocusId createFromParcel(Parcel source) {
            final Uri uri = source.readParcelable(null);
            return new LocusId(uri);
        public LocusId createFromParcel(Parcel parcel) {
            return new LocusId(parcel.readString());
        }

        @NonNull
+3 −4
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import android.app.TaskInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.LocusId;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -212,11 +211,11 @@ public final class ContentCaptureContext implements Parcelable {
    }

    /**
     * Helper that creates a {@link ContentCaptureContext} associated with the given {@code uri}.
     * Helper that creates a {@link ContentCaptureContext} associated with the given {@code id}.
     */
    @NonNull
    public static ContentCaptureContext forLocusId(@NonNull Uri uri) {
        return new Builder(new LocusId(uri)).build();
    public static ContentCaptureContext forLocusId(@NonNull String id) {
        return new Builder(new LocusId(id)).build();
    }

    /**
+35 −17
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package android.view.contentcapture;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.app.ActivityThread;
import android.content.LocusId;
@@ -24,6 +25,8 @@ import android.util.IntArray;

import com.android.internal.util.Preconditions;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;

@@ -33,6 +36,19 @@ import java.util.List;
 */
public final class UserDataRemovalRequest implements Parcelable {

    /**
     * When set, service should use the {@link LocusId#getId()} as prefix for the data to be
     * removed.
     */
    public static final int FLAG_IS_PREFIX = 0x1;

    /** @hide */
    @IntDef(prefix = { "FLAG" }, flag = true, value = {
            FLAG_IS_PREFIX
    })
    @Retention(RetentionPolicy.SOURCE)
    @interface Flags {}

    private final String mPackageName;

    private final boolean mForEverything;
@@ -46,7 +62,7 @@ public final class UserDataRemovalRequest implements Parcelable {
            mLocusIdRequests = new ArrayList<>(size);
            for (int i = 0; i < size; i++) {
                mLocusIdRequests.add(new LocusIdRequest(builder.mLocusIds.get(i),
                        builder.mRecursive.get(i) == 1));
                        builder.mFlags.get(i)));
            }
        }
    }
@@ -59,7 +75,7 @@ public final class UserDataRemovalRequest implements Parcelable {
            mLocusIdRequests = new ArrayList<>(size);
            for (int i = 0; i < size; i++) {
                mLocusIdRequests.add(new LocusIdRequest((LocusId) parcel.readValue(null),
                        parcel.readBoolean()));
                        parcel.readInt()));
            }
        }
    }
@@ -94,7 +110,7 @@ public final class UserDataRemovalRequest implements Parcelable {

        private boolean mForEverything;
        private ArrayList<LocusId> mLocusIds;
        private IntArray mRecursive;
        private IntArray mFlags;

        private boolean mDestroyed;

@@ -116,24 +132,24 @@ public final class UserDataRemovalRequest implements Parcelable {
         * Request service to remove data associated with a given {@link LocusId}.
         *
         * @param locusId the {@link LocusId} being requested to be removed.
         * @param recursive whether it should remove the data associated with just the
         * {@code LocusId} or its tree of descendants.
         * @param flags either {@link UserDataRemovalRequest#FLAG_IS_PREFIX} or {@code 0}
         *
         * @return this builder
         */
        @NonNull
        public Builder addLocusId(@NonNull LocusId locusId, boolean recursive) {
        public Builder addLocusId(@NonNull LocusId locusId, @Flags int flags) {
            throwIfDestroyed();
            Preconditions.checkState(!mForEverything, "Already is for everything");
            Preconditions.checkNotNull(locusId);
            // felipeal: check flags

            if (mLocusIds == null) {
                mLocusIds = new ArrayList<>();
                mRecursive = new IntArray();
                mFlags = new IntArray();
            }

            mLocusIds.add(locusId);
            mRecursive.add(recursive ? 1 : 0);
            mFlags.add(flags);
            return this;
        }

@@ -144,7 +160,8 @@ public final class UserDataRemovalRequest implements Parcelable {
        public UserDataRemovalRequest build() {
            throwIfDestroyed();

            Preconditions.checkState(mForEverything || mLocusIds != null);
            Preconditions.checkState(mForEverything || mLocusIds != null,
                    "must call either #forEverything() or add one #addLocusId()");

            mDestroyed = true;
            return new UserDataRemovalRequest(this);
@@ -170,7 +187,7 @@ public final class UserDataRemovalRequest implements Parcelable {
            for (int i = 0; i < size; i++) {
                final LocusIdRequest request = mLocusIdRequests.get(i);
                parcel.writeValue(request.getLocusId());
                parcel.writeBoolean(request.isRecursive());
                parcel.writeInt(request.getFlags());
            }
        }
    }
@@ -196,11 +213,11 @@ public final class UserDataRemovalRequest implements Parcelable {
     */
    public final class LocusIdRequest {
        private final @NonNull LocusId mLocusId;
        private final boolean mRecursive;
        private final @Flags int mFlags;

        private LocusIdRequest(@NonNull LocusId locusId, boolean recursive) {
        private LocusIdRequest(@NonNull LocusId locusId, @Flags int flags) {
            this.mLocusId = locusId;
            this.mRecursive = recursive;
            this.mFlags = flags;
        }

        /**
@@ -212,12 +229,13 @@ public final class UserDataRemovalRequest implements Parcelable {
        }

        /**
         * Checks whether the request is to remove just the data associated with the {@link LocusId}
         *  per se, or also its descendants.
         * Gets the flags associates with request.
         *
         * @return either {@link UserDataRemovalRequest#FLAG_IS_PREFIX} or {@code 0}.
         */
        @NonNull
        public boolean isRecursive() {
            return mRecursive;
        public @Flags int getFlags() {
            return mFlags;
        }
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import static com.google.common.truth.Truth.assertThat;
import static org.testng.Assert.assertThrows;

import android.content.LocusId;
import android.net.Uri;
import android.os.Parcel;
import android.os.SystemClock;
import android.view.autofill.AutofillId;
@@ -47,7 +46,7 @@ public class ContentCaptureEventTest {

    private static final long MY_EPOCH = SystemClock.uptimeMillis();

    private static final LocusId ID = new LocusId(Uri.parse("WHATEVER"));
    private static final LocusId ID = new LocusId("WHATEVER");

    // Not using @Mock because it's final - no need to be fancy here....
    private final ContentCaptureContext mClientContext =