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

Commit c9d31e27 authored by Tony Mak's avatar Tony Mak
Browse files

Introduce TextClassifier.suggestConversationActions

Example usage:
// App side
ConversationAction.TypeConfig typeConfig =
            new ConversationAction.TypeConfig.Builder().setIncludedTypes(
                    Collections.singletonList(ConversationAction.TYPE_TEXT_REPLY)).build();
ConversationAction.Message message =
        ConversationAction.Message.Builder().setText("How are you?").build();
ConversationAction.Request request =
        new ConversationAction.Request.Builder(
                Collections.singletonList(message), HINT_FOR_IN_APP)
                .setTypeConfig(typeConfig)
                .build();
List<ConversationAction> conversationActions =
        textClassifier.suggestConversationActions(request).getConversationActions();
for (ConversationAction conversationAction : conversationActions) {
    // 1. Use the RemoteAction directly (if available)
    RemoteAction actions= conversationAction.getActions();

    // 2. Use the parsed action types and entities.
    String type = conversationAction.getType();
    ConversationAction.Entities entities = conversationAction.getEntities();
}

// In the TextClassificationService side:
ConversationAction.Entities entities = new ConversationAction.Entities.Builder().setReplies(Arrays.asList("I am good.", ":(", ":)")).build();

ConversationAction conversationAction = new ConversationAction.Builder(
        ConversationAction.TYPE_TEXT_REPLY).setEntities(entities).build();

BUG: 111437455
BUG: 111406942

Test: atest cts/tests/tests/view/src/android/view/textclassifier/cts/*cts/tests/tests/view/src/android/view/textclassifier/cts/TextClassificationManagerTest.java
Test: cts/tests/tests/view/src/android/view/textclassifier/cts/ConversationActionsTest.java

Change-Id: Ie8639f93f88336ecdfda602ce14cd8ca578c092a
parent ac197316
Loading
Loading
Loading
Loading
+94 −0
Original line number Diff line number Diff line
@@ -51321,6 +51321,99 @@ package android.view.inputmethod {
package android.view.textclassifier {
  public final class ConversationActions implements android.os.Parcelable {
    ctor public ConversationActions(java.util.List<android.view.textclassifier.ConversationActions.ConversationAction>);
    method public int describeContents();
    method public java.util.List<android.view.textclassifier.ConversationActions.ConversationAction> getConversationActions();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions> CREATOR;
    field public static final java.lang.String HINT_FOR_IN_APP = "in_app";
    field public static final java.lang.String HINT_FOR_NOTIFICATION = "notification";
    field public static final java.lang.String TYPE_CALL_PHONE = "call_phone";
    field public static final java.lang.String TYPE_CREATE_REMINDER = "create_reminder";
    field public static final java.lang.String TYPE_OPEN_URL = "open_url";
    field public static final java.lang.String TYPE_SEND_EMAIL = "send_email";
    field public static final java.lang.String TYPE_SEND_SMS = "send_sms";
    field public static final java.lang.String TYPE_SHARE_LOCATION = "share_location";
    field public static final java.lang.String TYPE_TEXT_REPLY = "text_reply";
    field public static final java.lang.String TYPE_TRACK_FLIGHT = "track_flight";
    field public static final java.lang.String TYPE_VIEW_CALENDAR = "view_calendar";
    field public static final java.lang.String TYPE_VIEW_MAP = "view_map";
  }
  public static final class ConversationActions.ConversationAction implements android.os.Parcelable {
    method public int describeContents();
    method public android.app.RemoteAction getAction();
    method public float getConfidenceScore();
    method public android.os.Bundle getExtras();
    method public java.lang.CharSequence getTextReply();
    method public java.lang.String getType();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.ConversationAction> CREATOR;
  }
  public static final class ConversationActions.ConversationAction.Builder {
    ctor public ConversationActions.ConversationAction.Builder(java.lang.String);
    method public android.view.textclassifier.ConversationActions.ConversationAction build();
    method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setAction(android.app.RemoteAction);
    method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setConfidenceScore(float);
    method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setExtras(android.os.Bundle);
    method public android.view.textclassifier.ConversationActions.ConversationAction.Builder setTextReply(java.lang.CharSequence);
  }
  public static final class ConversationActions.Message implements android.os.Parcelable {
    method public int describeContents();
    method public android.app.Person getAuthor();
    method public android.os.Bundle getExtras();
    method public java.lang.CharSequence getText();
    method public java.time.ZonedDateTime getTime();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.Message> CREATOR;
  }
  public static final class ConversationActions.Message.Builder {
    ctor public ConversationActions.Message.Builder();
    method public android.view.textclassifier.ConversationActions.Message build();
    method public android.view.textclassifier.ConversationActions.Message.Builder setAuthor(android.app.Person);
    method public android.view.textclassifier.ConversationActions.Message.Builder setComposeTime(java.time.ZonedDateTime);
    method public android.view.textclassifier.ConversationActions.Message.Builder setExtras(android.os.Bundle);
    method public android.view.textclassifier.ConversationActions.Message.Builder setText(java.lang.CharSequence);
  }
  public static final class ConversationActions.Request implements android.os.Parcelable {
    method public int describeContents();
    method public java.util.List<android.view.textclassifier.ConversationActions.Message> getConversation();
    method public java.util.List<java.lang.String> getHints();
    method public int getMaxSuggestions();
    method public android.view.textclassifier.ConversationActions.TypeConfig getTypeConfig();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.Request> CREATOR;
  }
  public static final class ConversationActions.Request.Builder {
    ctor public ConversationActions.Request.Builder(java.util.List<android.view.textclassifier.ConversationActions.Message>);
    method public android.view.textclassifier.ConversationActions.Request build();
    method public android.view.textclassifier.ConversationActions.Request.Builder setHints(java.util.List<java.lang.String>);
    method public android.view.textclassifier.ConversationActions.Request.Builder setMaxSuggestions(int);
    method public android.view.textclassifier.ConversationActions.Request.Builder setTypeConfig(android.view.textclassifier.ConversationActions.TypeConfig);
  }
  public static final class ConversationActions.TypeConfig implements android.os.Parcelable {
    method public int describeContents();
    method public java.util.Collection<java.lang.String> resolveTypes(java.util.Collection<java.lang.String>);
    method public boolean shouldIncludeTypesFromTextClassifier();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator<android.view.textclassifier.ConversationActions.TypeConfig> CREATOR;
  }
  public static final class ConversationActions.TypeConfig.Builder {
    ctor public ConversationActions.TypeConfig.Builder();
    method public android.view.textclassifier.ConversationActions.TypeConfig build();
    method public android.view.textclassifier.ConversationActions.TypeConfig.Builder includeTypesFromTextClassifier(boolean);
    method public android.view.textclassifier.ConversationActions.TypeConfig.Builder setExcludedTypes(java.util.Collection<java.lang.String>);
    method public android.view.textclassifier.ConversationActions.TypeConfig.Builder setIncludedTypes(java.util.Collection<java.lang.String>);
  }
  public final class SelectionEvent implements android.os.Parcelable {
    method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int);
    method public static android.view.textclassifier.SelectionEvent createSelectionActionEvent(int, int, int, android.view.textclassifier.TextClassification);
@@ -51457,6 +51550,7 @@ package android.view.textclassifier {
    method public default int getMaxGenerateLinksTextLength();
    method public default boolean isDestroyed();
    method public default void onSelectionEvent(android.view.textclassifier.SelectionEvent);
    method public default android.view.textclassifier.ConversationActions suggestConversationActions(android.view.textclassifier.ConversationActions.Request);
    method public default android.view.textclassifier.TextSelection suggestSelection(android.view.textclassifier.TextSelection.Request);
    method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
    field public static final java.lang.String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
+779 −0

File added.

Preview size limit exceeded, changes collapsed.

+11 −0
Original line number Diff line number Diff line
@@ -324,6 +324,17 @@ public interface TextClassifier {
        return TextLanguage.EMPTY;
    }

    /**
     * Suggests and returns a list of actions according to the given conversation.
     */
    @WorkerThread
    default ConversationActions suggestConversationActions(
            @NonNull ConversationActions.Request request) {
        Preconditions.checkNotNull(request);
        Utils.checkMainThread();
        return new ConversationActions(Collections.emptyList());
    }

    /**
     * Reports a selection event.
     *