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

Commit 0f138963 authored by Abodunrinwa Toki's avatar Abodunrinwa Toki
Browse files

Add calling package name to TC requests.

- This is only set by the SystemTextClassifier.
- The system verifies that the package name is correct before
  passing the request to the TCS. Note that the system is the
  only direct client of the TCS.
- Sets package name to context.getOpPackageName(). See b/119921159
- Also adds an extra to a TextLink object.

Bug: 118690735
Bug: 119921159
Test: atest frameworks/base/core/tests/coretests/src/android/view/textclassifier
Change-Id: I1ac0fa421cd0f26e580a8e0768c3819a731bb471
parent a068624d
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -52044,6 +52044,7 @@ package android.view.textclassifier {
  public static final class ConversationActions.Request implements android.os.Parcelable {
    method public int describeContents();
    method public java.lang.String getCallingPackageName();
    method public java.util.List<android.view.textclassifier.ConversationActions.Message> getConversation();
    method public java.util.List<java.lang.String> getHints();
    method public int getMaxSuggestions();
@@ -52157,6 +52158,7 @@ package android.view.textclassifier {
  public static final class TextClassification.Request implements android.os.Parcelable {
    method public int describeContents();
    method public java.lang.String getCallingPackageName();
    method public android.os.LocaleList getDefaultLocales();
    method public int getEndIndex();
    method public android.os.Bundle getExtras();
@@ -52274,6 +52276,7 @@ package android.view.textclassifier {
  public static final class TextLanguage.Request implements android.os.Parcelable {
    method public int describeContents();
    method public java.lang.String getCallingPackageName();
    method public android.os.Bundle getExtras();
    method public java.lang.CharSequence getText();
    method public void writeToParcel(android.os.Parcel, int);
@@ -52305,6 +52308,7 @@ package android.view.textclassifier {
  public static final class TextLinks.Builder {
    ctor public TextLinks.Builder(java.lang.String);
    method public android.view.textclassifier.TextLinks.Builder addLink(int, int, java.util.Map<java.lang.String, java.lang.Float>);
    method public android.view.textclassifier.TextLinks.Builder addLink(int, int, java.util.Map<java.lang.String, java.lang.Float>, android.os.Bundle);
    method public android.view.textclassifier.TextLinks build();
    method public android.view.textclassifier.TextLinks.Builder clearTextLinks();
    method public android.view.textclassifier.TextLinks.Builder setExtras(android.os.Bundle);
@@ -52312,6 +52316,7 @@ package android.view.textclassifier {
  public static final class TextLinks.Request implements android.os.Parcelable {
    method public int describeContents();
    method public java.lang.String getCallingPackageName();
    method public android.os.LocaleList getDefaultLocales();
    method public android.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
    method public android.os.Bundle getExtras();
@@ -52334,6 +52339,7 @@ package android.view.textclassifier {
    method public int getEnd();
    method public java.lang.String getEntity(int);
    method public int getEntityCount();
    method public android.os.Bundle getExtras();
    method public int getStart();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.TextLink> CREATOR;
@@ -52368,6 +52374,7 @@ package android.view.textclassifier {
  public static final class TextSelection.Request implements android.os.Parcelable {
    method public int describeContents();
    method public java.lang.String getCallingPackageName();
    method public android.os.LocaleList getDefaultLocales();
    method public int getEndIndex();
    method public android.os.Bundle getExtras();
+41 −6
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.Parcelable;
import android.text.SpannedString;
import android.util.ArraySet;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;

import java.lang.annotation.Retention;
@@ -654,6 +655,8 @@ public final class ConversationActions implements Parcelable {
        @NonNull
        @Hint
        private final List<String> mHints;
        @Nullable
        private String mCallingPackageName;

        private Request(
                @NonNull List<Message> conversation,
@@ -666,15 +669,26 @@ public final class ConversationActions implements Parcelable {
            mHints = hints;
        }

        private Request(Parcel in) {
        private static Request readFromParcel(Parcel in) {
            List<Message> conversation = new ArrayList<>();
            in.readParcelableList(conversation, null);
            mConversation = Collections.unmodifiableList(conversation);
            mTypeConfig = in.readParcelable(null);
            mMaxSuggestions = in.readInt();

            TypeConfig typeConfig = in.readParcelable(null);

            int maxSuggestions = in.readInt();

            List<String> hints = new ArrayList<>();
            in.readStringList(hints);
            mHints = Collections.unmodifiableList(hints);

            String callingPackageName = in.readString();

            Request request = new Request(
                    conversation,
                    typeConfig,
                    maxSuggestions,
                    hints);
            request.setCallingPackageName(callingPackageName);
            return request;
        }

        @Override
@@ -683,6 +697,7 @@ public final class ConversationActions implements Parcelable {
            parcel.writeParcelable(mTypeConfig, flags);
            parcel.writeInt(mMaxSuggestions);
            parcel.writeStringList(mHints);
            parcel.writeString(mCallingPackageName);
        }

        @Override
@@ -694,7 +709,7 @@ public final class ConversationActions implements Parcelable {
                new Creator<Request>() {
                    @Override
                    public Request createFromParcel(Parcel in) {
                        return new Request(in);
                        return readFromParcel(in);
                    }

                    @Override
@@ -730,6 +745,26 @@ public final class ConversationActions implements Parcelable {
            return mHints;
        }

        /**
         * Sets the name of the package that is sending this request.
         * <p>
         * Package-private for SystemTextClassifier's use.
         * @hide
         */
        @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
        public void setCallingPackageName(@Nullable String callingPackageName) {
            mCallingPackageName = callingPackageName;
        }

        /**
         * Returns the name of the package that sent this request.
         * This returns {@code null} if no calling package name is set.
         */
        @Nullable
        public String getCallingPackageName() {
            return mCallingPackageName;
        }

        /** Builder object to construct the {@link Request} object. */
        public static final class Builder {
            @NonNull
+5 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ public final class SystemTextClassifier implements TextClassifier {
        mSettings = Preconditions.checkNotNull(settings);
        mFallback = context.getSystemService(TextClassificationManager.class)
                .getTextClassifier(TextClassifier.LOCAL);
        mPackageName = Preconditions.checkNotNull(context.getPackageName());
        mPackageName = Preconditions.checkNotNull(context.getOpPackageName());
    }

    /**
@@ -72,6 +72,7 @@ public final class SystemTextClassifier implements TextClassifier {
        Preconditions.checkNotNull(request);
        Utils.checkMainThread();
        try {
            request.setCallingPackageName(mPackageName);
            final TextSelectionCallback callback = new TextSelectionCallback();
            mManagerService.onSuggestSelection(mSessionId, request, callback);
            final TextSelection selection = callback.mReceiver.get();
@@ -93,6 +94,7 @@ public final class SystemTextClassifier implements TextClassifier {
        Preconditions.checkNotNull(request);
        Utils.checkMainThread();
        try {
            request.setCallingPackageName(mPackageName);
            final TextClassificationCallback callback = new TextClassificationCallback();
            mManagerService.onClassifyText(mSessionId, request, callback);
            final TextClassification classification = callback.mReceiver.get();
@@ -150,6 +152,7 @@ public final class SystemTextClassifier implements TextClassifier {
        Utils.checkMainThread();

        try {
            request.setCallingPackageName(mPackageName);
            final TextLanguageCallback callback = new TextLanguageCallback();
            mManagerService.onDetectLanguage(mSessionId, request, callback);
            final TextLanguage textLanguage = callback.mReceiver.get();
@@ -168,6 +171,7 @@ public final class SystemTextClassifier implements TextClassifier {
        Utils.checkMainThread();

        try {
            request.setCallingPackageName(mPackageName);
            final ConversationActionsCallback callback = new ConversationActionsCallback();
            mManagerService.onSuggestConversationActions(mSessionId, request, callback);
            final ConversationActions conversationActions = callback.mReceiver.get();
+47 −20
Original line number Diff line number Diff line
@@ -37,11 +37,13 @@ import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.SpannedString;
import android.util.ArrayMap;
import android.view.View.OnClickListener;
import android.view.textclassifier.TextClassifier.EntityType;
import android.view.textclassifier.TextClassifier.Utils;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;

import java.lang.annotation.Retention;
@@ -518,6 +520,7 @@ public final class TextClassification implements Parcelable {
        @Nullable private final LocaleList mDefaultLocales;
        @Nullable private final ZonedDateTime mReferenceTime;
        @NonNull private final Bundle mExtras;
        @Nullable private String mCallingPackageName;

        private Request(
                CharSequence text,
@@ -577,6 +580,26 @@ public final class TextClassification implements Parcelable {
            return mReferenceTime;
        }

        /**
         * Sets the name of the package that is sending this request.
         * <p>
         * For SystemTextClassifier's use.
         * @hide
         */
        @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
        public void setCallingPackageName(@Nullable String callingPackageName) {
            mCallingPackageName = callingPackageName;
        }

        /**
         * Returns the name of the package that sent this request.
         * This returns {@code null} if no calling package name is set.
         */
        @Nullable
        public String getCallingPackageName() {
            return mCallingPackageName;
        }

        /**
         * Returns the extended data.
         *
@@ -660,7 +683,8 @@ public final class TextClassification implements Parcelable {
             */
            @NonNull
            public Request build() {
                return new Request(mText, mStartIndex, mEndIndex, mDefaultLocales, mReferenceTime,
                return new Request(new SpannedString(mText), mStartIndex, mEndIndex,
                        mDefaultLocales, mReferenceTime,
                        mExtras == null ? Bundle.EMPTY : mExtras.deepCopy());
            }
        }
@@ -672,25 +696,37 @@ public final class TextClassification implements Parcelable {

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(mText.toString());
            dest.writeCharSequence(mText);
            dest.writeInt(mStartIndex);
            dest.writeInt(mEndIndex);
            dest.writeInt(mDefaultLocales != null ? 1 : 0);
            if (mDefaultLocales != null) {
                mDefaultLocales.writeToParcel(dest, flags);
            }
            dest.writeInt(mReferenceTime != null ? 1 : 0);
            if (mReferenceTime != null) {
                dest.writeString(mReferenceTime.toString());
            }
            dest.writeParcelable(mDefaultLocales, flags);
            dest.writeString(mReferenceTime == null ? null : mReferenceTime.toString());
            dest.writeString(mCallingPackageName);
            dest.writeBundle(mExtras);
        }

        private static Request readFromParcel(Parcel in) {
            final CharSequence text = in.readCharSequence();
            final int startIndex = in.readInt();
            final int endIndex = in.readInt();
            final LocaleList defaultLocales = in.readParcelable(null);
            final String referenceTimeString = in.readString();
            final ZonedDateTime referenceTime = referenceTimeString == null
                    ? null : ZonedDateTime.parse(referenceTimeString);
            final String callingPackageName = in.readString();
            final Bundle extras = in.readBundle();

            final Request request = new Request(text, startIndex, endIndex,
                    defaultLocales, referenceTime, extras);
            request.setCallingPackageName(callingPackageName);
            return request;
        }

        public static final Parcelable.Creator<Request> CREATOR =
                new Parcelable.Creator<Request>() {
                    @Override
                    public Request createFromParcel(Parcel in) {
                        return new Request(in);
                        return readFromParcel(in);
                    }

                    @Override
@@ -698,15 +734,6 @@ public final class TextClassification implements Parcelable {
                        return new Request[size];
                    }
                };

        private Request(Parcel in) {
            mText = in.readString();
            mStartIndex = in.readInt();
            mEndIndex = in.readInt();
            mDefaultLocales = in.readInt() == 0 ? null : LocaleList.CREATOR.createFromParcel(in);
            mReferenceTime = in.readInt() == 0 ? null : ZonedDateTime.parse(in.readString());
            mExtras = in.readBundle();
        }
    }

    @Override
+34 −8
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;

import java.util.Locale;
@@ -90,7 +91,7 @@ public final class TextLanguage implements Parcelable {
     * confidence to low confidence.
     *
     * @throws IndexOutOfBoundsException if the specified index is out of range.
     * @see #getLocaleCount() for the number of locales available.
     * @see #getLocaleHypothesisCount() for the number of locales available.
     */
    @NonNull
    public ULocale getLocale(int index) {
@@ -222,11 +223,12 @@ public final class TextLanguage implements Parcelable {
        };

        private final CharSequence mText;
        private final Bundle mBundle;
        private final Bundle mExtra;
        @Nullable private String mCallingPackageName;

        private Request(CharSequence text, Bundle bundle) {
            mText = text;
            mBundle = bundle;
            mExtra = bundle;
        }

        /**
@@ -237,6 +239,25 @@ public final class TextLanguage implements Parcelable {
            return mText;
        }

        /**
         * Sets the name of the package that is sending this request.
         * Package-private for SystemTextClassifier's use.
         * @hide
         */
        @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
        public void setCallingPackageName(@Nullable String callingPackageName) {
            mCallingPackageName = callingPackageName;
        }

        /**
         * Returns the name of the package that sent this request.
         * This returns null if no calling package name is set.
         */
        @Nullable
        public String getCallingPackageName() {
            return mCallingPackageName;
        }

        /**
         * Returns a bundle containing non-structured extra information about this request.
         *
@@ -246,7 +267,7 @@ public final class TextLanguage implements Parcelable {
         */
        @NonNull
        public Bundle getExtras() {
            return mBundle.deepCopy();
            return mExtra.deepCopy();
        }

        @Override
@@ -257,13 +278,18 @@ public final class TextLanguage implements Parcelable {
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeCharSequence(mText);
            dest.writeBundle(mBundle);
            dest.writeString(mCallingPackageName);
            dest.writeBundle(mExtra);
        }

        private static Request readFromParcel(Parcel in) {
            return new Request(
                    in.readCharSequence(),
                    in.readBundle());
            final CharSequence text = in.readCharSequence();
            final String callingPackageName = in.readString();
            final Bundle extra = in.readBundle();

            final Request request = new Request(text, extra);
            request.setCallingPackageName(callingPackageName);
            return request;
        }

        /**
Loading