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

Commit 044c63b3 authored by Felipe Leme's avatar Felipe Leme
Browse files

Changes on the ContentCaptureContext APIs.

- Replaced URI by a generic ID
  (which is a new class LocusId, and required)
- Createad a new Intent.ACTION_VIEW_LOCUS action
  (and Intent.EXTRA_LOCUS_ID extra)
- Removed ContentCaptureContext.getAction()
  (so the only "supported" action is ACTION_VIEW_LOCUS)
- Made the ContentCaptureContext getters public
  (getId(), getExtras())

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

Bug: 123577059
Fixes: 124266664

Change-Id: Id4c28f056eb7a24dd083303ffdea7cf662cefac2
parent 5112156b
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -10302,6 +10302,7 @@ package android.content {
    field public static final String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
    field public static final String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED";
    field public static final String ACTION_VIEW = "android.intent.action.VIEW";
    field public static final String ACTION_VIEW_LOCUS = "android.intent.action.VIEW_LOCUS";
    field public static final String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
    field @Deprecated public static final String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
    field public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
@@ -10386,6 +10387,7 @@ package android.content {
    field public static final String EXTRA_INTENT = "android.intent.extra.INTENT";
    field public static final String EXTRA_KEY_EVENT = "android.intent.extra.KEY_EVENT";
    field public static final String EXTRA_LOCAL_ONLY = "android.intent.extra.LOCAL_ONLY";
    field public static final String EXTRA_LOCUS_ID = "android.intent.extra.LOCUS_ID";
    field public static final String EXTRA_MIME_TYPES = "android.intent.extra.MIME_TYPES";
    field public static final String EXTRA_NOT_UNKNOWN_SOURCE = "android.intent.extra.NOT_UNKNOWN_SOURCE";
    field public static final String EXTRA_ORIGINATING_URI = "android.intent.extra.ORIGINATING_URI";
@@ -10638,6 +10640,14 @@ package android.content {
    method @Deprecated public void onLoadComplete(android.content.Loader<D>, D);
  }
  public final class LocusId implements android.os.Parcelable {
    ctor public LocusId(@NonNull android.net.Uri);
    method public int describeContents();
    method @NonNull public android.net.Uri getUri();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.content.LocusId> CREATOR;
  }
  public class MutableContextWrapper extends android.content.ContextWrapper {
    ctor public MutableContextWrapper(android.content.Context);
    method public void setBaseContext(android.content.Context);
@@ -53500,16 +53510,17 @@ package android.view.contentcapture {
  public final class ContentCaptureContext implements android.os.Parcelable {
    method public int describeContents();
    method public static android.view.contentcapture.ContentCaptureContext forLocusId(@NonNull android.net.Uri);
    method @Nullable public android.os.Bundle getExtras();
    method @NonNull public android.content.LocusId getLocusId();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.contentcapture.ContentCaptureContext> CREATOR;
  }
  public static final class ContentCaptureContext.Builder {
    ctor public ContentCaptureContext.Builder();
    ctor public ContentCaptureContext.Builder(@NonNull android.content.LocusId);
    method public android.view.contentcapture.ContentCaptureContext build();
    method @NonNull public android.view.contentcapture.ContentCaptureContext.Builder setAction(@NonNull String);
    method @NonNull public android.view.contentcapture.ContentCaptureContext.Builder setExtras(@NonNull android.os.Bundle);
    method @NonNull public android.view.contentcapture.ContentCaptureContext.Builder setUri(@NonNull android.net.Uri);
  }
  public final class ContentCaptureManager {
@@ -53542,8 +53553,8 @@ package android.view.contentcapture {
  public final class UserDataRemovalRequest implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.LocusIdRequest> getLocusIdRequests();
    method @NonNull public String getPackageName();
    method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.UriRequest> getUriRequests();
    method public boolean isForEverything();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.contentcapture.UserDataRemovalRequest> CREATOR;
@@ -53551,13 +53562,13 @@ package android.view.contentcapture {
  public static final class UserDataRemovalRequest.Builder {
    ctor public UserDataRemovalRequest.Builder();
    method public android.view.contentcapture.UserDataRemovalRequest.Builder addUri(@NonNull android.net.Uri, boolean);
    method public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, boolean);
    method @NonNull public android.view.contentcapture.UserDataRemovalRequest build();
    method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
  }
  public final class UserDataRemovalRequest.UriRequest {
    method @NonNull public android.net.Uri getUri();
  public final class UserDataRemovalRequest.LocusIdRequest {
    method @NonNull public android.content.LocusId getLocusId();
    method @NonNull public boolean isRecursive();
  }
+0 −3
Original line number Diff line number Diff line
@@ -9326,14 +9326,11 @@ package android.view.autofill {
package android.view.contentcapture {
  public final class ContentCaptureContext implements android.os.Parcelable {
    method @Nullable public String getAction();
    method @Nullable public android.content.ComponentName getActivityComponent();
    method public int getDisplayId();
    method @Nullable public android.os.Bundle getExtras();
    method public int getFlags();
    method @Nullable public android.view.contentcapture.ContentCaptureSessionId getParentSessionId();
    method public int getTaskId();
    method @Nullable public android.net.Uri getUri();
    field public static final int FLAG_DISABLED_BY_APP = 1; // 0x1
    field public static final int FLAG_DISABLED_BY_FLAG_SECURE = 2; // 0x2
  }
+0 −3
Original line number Diff line number Diff line
@@ -2714,14 +2714,11 @@ package android.view.autofill {
package android.view.contentcapture {

  public final class ContentCaptureContext implements android.os.Parcelable {
    method @Nullable public String getAction();
    method @Nullable public android.content.ComponentName getActivityComponent();
    method public int getDisplayId();
    method @Nullable public android.os.Bundle getExtras();
    method public int getFlags();
    method @Nullable public android.view.contentcapture.ContentCaptureSessionId getParentSessionId();
    method public int getTaskId();
    method @Nullable public android.net.Uri getUri();
    field public static final int FLAG_DISABLED_BY_APP = 1; // 0x1
    field public static final int FLAG_DISABLED_BY_FLAG_SECURE = 2; // 0x2
  }
+21 −0
Original line number Diff line number Diff line
@@ -4336,6 +4336,18 @@ public class Intent implements Parcelable, Cloneable {
            "android.intent.action.DEVICE_CUSTOMIZATION_READY";


    /**
     * Activity Action: Display an activity state associated with an unique {@link LocusId}.
     *
     * <p>For example, a chat app could use the context to resume a conversation between 2 users.
     *
     * <p>Input: {@link #EXTRA_LOCUS_ID} specifies the unique identifier of the locus in the
     * app domain. Should be stable across reboots and backup / restore.
     * <p>Output: nothing.
     */
    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
    public static final String ACTION_VIEW_LOCUS = "android.intent.action.VIEW_LOCUS";

    // ---------------------------------------------------------------------
    // ---------------------------------------------------------------------
    // Standard intent categories (see addCategory()).
@@ -5534,6 +5546,15 @@ public class Intent implements Parcelable, Cloneable {
     */
    public static final int EXTRA_MEDIA_RESOURCE_TYPE_AUDIO_CODEC = 1;

    /**
     * Intent extra: ID of the context used on {@link #ACTION_VIEW_LOCUS}.
     *
     * <p>
     * Type: {@link LocusId}
     * </p>
     */
    public static final String EXTRA_LOCUS_ID = "android.intent.extra.LOCUS_ID";

    // ---------------------------------------------------------------------
    // ---------------------------------------------------------------------
    // Intent flags (see mFlags variable).
+115 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package android.content;

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

import com.android.internal.util.Preconditions;

import java.io.PrintWriter;

/**
 * Identifier for an unique state in the application.
 *
 * <p>Should be stable across reboots and backup / restore.
 *
 * <p>For example, a chat app could use the context to resume a conversation between 2 users.
 */
// TODO(b/123577059): make sure this is well documented and understandable
public final class LocusId implements Parcelable {

    private final Uri mUri;

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

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

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        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;
        } else {
            if (!mUri.equals(other.mUri)) return false;
        }
        return true;
    }

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

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

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

    @Override
    public int describeContents() {
        return 0;
    }

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

    public static final Parcelable.Creator<LocusId> CREATOR =
            new Parcelable.Creator<LocusId>() {

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

        @Override
        public LocusId[] newArray(int size) {
            return new LocusId[size];
        }
    };
}
Loading