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

Commit 0d9fbb9b authored by Jan Althaus's avatar Jan Althaus
Browse files

Making TextClassifier helper objects parcelable

- EntityConfidence is no longer generic because it doesn't mix well with
  being Parcelable.
- Deprecated OnClick listeners in TextClassification as they can't be
  parceled. (Outright removed the secondary listeners that were not part
  of any release)
- Classes that were present in previous releases have their parceling
  factored out into ParcelableWrapper helper classes for backwards
  compatibility.

Bug: 67609167
Test: Added
Change-Id: I820ca4abc6b80f90007ab4424bc5df2a14f797b0
parent 200cd63f
Loading
Loading
Loading
Loading
+26 −9
Original line number Diff line number Diff line
@@ -49240,14 +49240,13 @@ package android.view.textclassifier {
    method public android.graphics.drawable.Drawable getSecondaryIcon(int);
    method public android.content.Intent getSecondaryIntent(int);
    method public java.lang.CharSequence getSecondaryLabel(int);
    method public android.view.View.OnClickListener getSecondaryOnClickListener(int);
    method public java.lang.String getSignature();
    method public java.lang.String getText();
  }
  public static final class TextClassification.Builder {
    ctor public TextClassification.Builder();
    method public android.view.textclassifier.TextClassification.Builder addSecondaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable, android.view.View.OnClickListener);
    method public android.view.textclassifier.TextClassification.Builder addSecondaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable);
    method public android.view.textclassifier.TextClassification build();
    method public android.view.textclassifier.TextClassification.Builder clearSecondaryActions();
    method public android.view.textclassifier.TextClassification.Builder setEntityType(java.lang.String, float);
@@ -49255,15 +49254,18 @@ package android.view.textclassifier {
    method public android.view.textclassifier.TextClassification.Builder setIntent(android.content.Intent);
    method public android.view.textclassifier.TextClassification.Builder setLabel(java.lang.String);
    method public android.view.textclassifier.TextClassification.Builder setOnClickListener(android.view.View.OnClickListener);
    method public android.view.textclassifier.TextClassification.Builder setPrimaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable, android.view.View.OnClickListener);
    method public android.view.textclassifier.TextClassification.Builder setPrimaryAction(android.content.Intent, java.lang.String, android.graphics.drawable.Drawable);
    method public android.view.textclassifier.TextClassification.Builder setSignature(java.lang.String);
    method public android.view.textclassifier.TextClassification.Builder setText(java.lang.String);
  }
  public static final class TextClassification.Options {
  public static final class TextClassification.Options implements android.os.Parcelable {
    ctor public TextClassification.Options();
    method public int describeContents();
    method public android.os.LocaleList getDefaultLocales();
    method public android.view.textclassifier.TextClassification.Options setDefaultLocales(android.os.LocaleList);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassification.Options> CREATOR;
  }
  public final class TextClassificationManager {
@@ -49293,16 +49295,22 @@ package android.view.textclassifier {
    field public static final java.lang.String TYPE_URL = "url";
  }
  public static final class TextClassifier.EntityConfig {
  public static final class TextClassifier.EntityConfig implements android.os.Parcelable {
    ctor public TextClassifier.EntityConfig(int);
    method public int describeContents();
    method public android.view.textclassifier.TextClassifier.EntityConfig excludeEntities(java.lang.String...);
    method public java.util.List<java.lang.String> getEntities(android.view.textclassifier.TextClassifier);
    method public android.view.textclassifier.TextClassifier.EntityConfig includeEntities(java.lang.String...);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassifier.EntityConfig> CREATOR;
  }
  public final class TextLinks {
  public final class TextLinks implements android.os.Parcelable {
    method public boolean apply(android.text.SpannableString, java.util.function.Function<android.view.textclassifier.TextLinks.TextLink, android.text.style.ClickableSpan>);
    method public int describeContents();
    method public java.util.Collection<android.view.textclassifier.TextLinks.TextLink> getLinks();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks> CREATOR;
  }
  public static final class TextLinks.Builder {
@@ -49311,21 +49319,27 @@ package android.view.textclassifier {
    method public android.view.textclassifier.TextLinks build();
  }
  public static final class TextLinks.Options {
  public static final class TextLinks.Options implements android.os.Parcelable {
    ctor public TextLinks.Options();
    method public int describeContents();
    method public android.os.LocaleList getDefaultLocales();
    method public android.view.textclassifier.TextClassifier.EntityConfig getEntityConfig();
    method public android.view.textclassifier.TextLinks.Options setDefaultLocales(android.os.LocaleList);
    method public android.view.textclassifier.TextLinks.Options setEntityConfig(android.view.textclassifier.TextClassifier.EntityConfig);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextLinks.Options> CREATOR;
  }
  public static final class TextLinks.TextLink {
  public static final class TextLinks.TextLink implements android.os.Parcelable {
    ctor public TextLinks.TextLink(java.lang.String, int, int, java.util.Map<java.lang.String, java.lang.Float>);
    method public int describeContents();
    method public float getConfidenceScore(java.lang.String);
    method public int getEnd();
    method public java.lang.String getEntity(int);
    method public int getEntityCount();
    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;
  }
  public final class TextSelection {
@@ -49344,10 +49358,13 @@ package android.view.textclassifier {
    method public android.view.textclassifier.TextSelection.Builder setSignature(java.lang.String);
  }
  public static final class TextSelection.Options {
  public static final class TextSelection.Options implements android.os.Parcelable {
    ctor public TextSelection.Options();
    method public int describeContents();
    method public android.os.LocaleList getDefaultLocales();
    method public android.view.textclassifier.TextSelection.Options setDefaultLocales(android.os.LocaleList);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextSelection.Options> CREATOR;
  }
}
+58 −18
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package android.view.textclassifier;

import android.annotation.FloatRange;
import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;

import com.android.internal.util.Preconditions;
@@ -30,17 +32,16 @@ import java.util.Map;
/**
 * Helper object for setting and getting entity scores for classified text.
 *
 * @param <T> the entity type.
 * @hide
 */
final class EntityConfidence<T> {
final class EntityConfidence implements Parcelable {

    private final ArrayMap<T, Float> mEntityConfidence = new ArrayMap<>();
    private final ArrayList<T> mSortedEntities = new ArrayList<>();
    private final ArrayMap<String, Float> mEntityConfidence = new ArrayMap<>();
    private final ArrayList<String> mSortedEntities = new ArrayList<>();

    EntityConfidence() {}

    EntityConfidence(@NonNull EntityConfidence<T> source) {
    EntityConfidence(@NonNull EntityConfidence source) {
        Preconditions.checkNotNull(source);
        mEntityConfidence.putAll(source.mEntityConfidence);
        mSortedEntities.addAll(source.mSortedEntities);
@@ -54,24 +55,16 @@ final class EntityConfidence<T> {
     * @param source a map from entity to a confidence value in the range 0 (low confidence) to
     *               1 (high confidence).
     */
    EntityConfidence(@NonNull Map<T, Float> source) {
    EntityConfidence(@NonNull Map<String, Float> source) {
        Preconditions.checkNotNull(source);

        // Prune non-existent entities and clamp to 1.
        mEntityConfidence.ensureCapacity(source.size());
        for (Map.Entry<T, Float> it : source.entrySet()) {
        for (Map.Entry<String, Float> it : source.entrySet()) {
            if (it.getValue() <= 0) continue;
            mEntityConfidence.put(it.getKey(), Math.min(1, it.getValue()));
        }

        // Create a list of entities sorted by decreasing confidence for getEntities().
        mSortedEntities.ensureCapacity(mEntityConfidence.size());
        mSortedEntities.addAll(mEntityConfidence.keySet());
        mSortedEntities.sort((e1, e2) -> {
            float score1 = mEntityConfidence.get(e1);
            float score2 = mEntityConfidence.get(e2);
            return Float.compare(score2, score1);
        });
        resetSortedEntitiesFromMap();
    }

    /**
@@ -79,7 +72,7 @@ final class EntityConfidence<T> {
     * high confidence to low confidence.
     */
    @NonNull
    public List<T> getEntities() {
    public List<String> getEntities() {
        return Collections.unmodifiableList(mSortedEntities);
    }

@@ -89,7 +82,7 @@ final class EntityConfidence<T> {
     * classified text.
     */
    @FloatRange(from = 0.0, to = 1.0)
    public float getConfidenceScore(T entity) {
    public float getConfidenceScore(String entity) {
        if (mEntityConfidence.containsKey(entity)) {
            return mEntityConfidence.get(entity);
        }
@@ -100,4 +93,51 @@ final class EntityConfidence<T> {
    public String toString() {
        return mEntityConfidence.toString();
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mEntityConfidence.size());
        for (Map.Entry<String, Float> entry : mEntityConfidence.entrySet()) {
            dest.writeString(entry.getKey());
            dest.writeFloat(entry.getValue());
        }
    }

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

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

    private EntityConfidence(Parcel in) {
        final int numEntities = in.readInt();
        mEntityConfidence.ensureCapacity(numEntities);
        for (int i = 0; i < numEntities; ++i) {
            mEntityConfidence.put(in.readString(), in.readFloat());
        }
        resetSortedEntitiesFromMap();
    }

    private void resetSortedEntitiesFromMap() {
        mSortedEntities.clear();
        mSortedEntities.ensureCapacity(mEntityConfidence.size());
        mSortedEntities.addAll(mEntityConfidence.keySet());
        mSortedEntities.sort((e1, e2) -> {
            float score1 = mEntityConfidence.get(e1);
            float score2 = mEntityConfidence.get(e2);
            return Float.compare(score2, score1);
        });
    }
}
+209 −69

File changed.

Preview size limit exceeded, changes collapsed.

+34 −1
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.annotation.Nullable;
import android.annotation.StringDef;
import android.annotation.WorkerThread;
import android.os.LocaleList;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArraySet;

import com.android.internal.util.Preconditions;
@@ -305,7 +307,7 @@ public interface TextClassifier {
     *
     * Configs are initially based on a predefined preset, and can be modified from there.
     */
    final class EntityConfig {
    final class EntityConfig implements Parcelable {
        private final @TextClassifier.EntityPreset int mEntityPreset;
        private final Collection<String> mExcludedEntityTypes;
        private final Collection<String> mIncludedEntityTypes;
@@ -355,6 +357,37 @@ public interface TextClassifier {
            }
            return Collections.unmodifiableList(entities);
        }

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

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(mEntityPreset);
            dest.writeStringList(new ArrayList<>(mExcludedEntityTypes));
            dest.writeStringList(new ArrayList<>(mIncludedEntityTypes));
        }

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

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

        private EntityConfig(Parcel in) {
            mEntityPreset = in.readInt();
            mExcludedEntityTypes = new ArraySet<>(in.createStringArrayList());
            mIncludedEntityTypes = new ArraySet<>(in.createStringArrayList());
        }
    }

    /**
+2 −5
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.provider.ContactsContract;
import android.provider.Settings;
import android.text.util.Linkify;
import android.util.Patterns;
import android.view.View.OnClickListener;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger;
@@ -457,12 +456,10 @@ final class TextClassifierImpl implements TextClassifier {
                    }
                }
                final String labelString = (label != null) ? label.toString() : null;
                final OnClickListener onClickListener =
                        TextClassification.createStartActivityOnClickListener(mContext, intent);
                if (i == 0) {
                    builder.setPrimaryAction(intent, labelString, icon, onClickListener);
                    builder.setPrimaryAction(intent, labelString, icon);
                } else {
                    builder.addSecondaryAction(intent, labelString, icon, onClickListener);
                    builder.addSecondaryAction(intent, labelString, icon);
                }
            }
        }
Loading