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

Commit ed1d6e16 authored by Ameer Armaly's avatar Ameer Armaly Committed by Android (Google) Code Review
Browse files

Merge "Add AccessibilityEvent TYPE_SPEECH_STATE to receive assistant speaking / listening state"

parents 9770ab51 135a7610
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -51437,6 +51437,7 @@ package android.view.accessibility {
    method public CharSequence getPackageName();
    method public android.view.accessibility.AccessibilityRecord getRecord(int);
    method public int getRecordCount();
    method public int getSpeechStateChangeTypes();
    method public int getWindowChanges();
    method public void initFromParcel(android.os.Parcel);
    method @Deprecated public static android.view.accessibility.AccessibilityEvent obtain(int);
@@ -51448,6 +51449,7 @@ package android.view.accessibility {
    method public void setEventType(int);
    method public void setMovementGranularity(int);
    method public void setPackageName(CharSequence);
    method public void setSpeechStateChangeTypes(int);
    method public void writeToParcel(android.os.Parcel, int);
    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
    field public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 512; // 0x200
@@ -51463,12 +51465,17 @@ package android.view.accessibility {
    field @NonNull public static final android.os.Parcelable.Creator<android.view.accessibility.AccessibilityEvent> CREATOR;
    field public static final int INVALID_POSITION = -1; // 0xffffffff
    field @Deprecated public static final int MAX_TEXT_LENGTH = 500; // 0x1f4
    field public static final int SPEECH_STATE_LISTENING_END = 8; // 0x8
    field public static final int SPEECH_STATE_LISTENING_START = 4; // 0x4
    field public static final int SPEECH_STATE_SPEAKING_END = 2; // 0x2
    field public static final int SPEECH_STATE_SPEAKING_START = 1; // 0x1
    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
    field public static final int TYPE_NOTIFICATION_STATE_CHANGED = 64; // 0x40
    field public static final int TYPE_SPEECH_STATE_CHANGE = 33554432; // 0x2000000
    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+144 −41
Original line number Diff line number Diff line
@@ -553,8 +553,20 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
    public static final int TYPE_ASSIST_READING_CONTEXT = 0x01000000;

    /**
     * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event:
     * The type of change is not defined.
     * Represents a change in the speech state defined by the content-change types. A change in the
     * speech state occurs when another service is either speaking or listening for human speech.
     * This event helps avoid conflicts where two services want to speak or one listens
     * when another speaks.
     * @see #SPEECH_STATE_SPEAKING_START
     * @see #SPEECH_STATE_SPEAKING_END
     * @see #SPEECH_STATE_LISTENING_START
     * @see #SPEECH_STATE_LISTENING_END
     */
    public static final int TYPE_SPEECH_STATE_CHANGE = 0x02000000;

    /**
     * Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event: The type of change is not
     * defined.
     */
    public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0x00000000;

@@ -641,6 +653,27 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
     */
    public static final int CONTENT_CHANGE_TYPE_DRAG_CANCELLED = 0x0000200;

    /** Change type for {@link #TYPE_SPEECH_STATE_CHANGE} event: another service is speaking. */
    public static final int SPEECH_STATE_SPEAKING_START = 0x00000001;

    /**
     * Change type for {@link #TYPE_SPEECH_STATE_CHANGE} event: another service is no longer
     * speaking.
     */
    public static final int SPEECH_STATE_SPEAKING_END = 0x00000002;

    /**
     * Change type for {@link #TYPE_SPEECH_STATE_CHANGE} event: another service is listening to the
     * microphone.
     */
    public static final int SPEECH_STATE_LISTENING_START = 0x00000004;

    /**
     * Change type for {@link #TYPE_SPEECH_STATE_CHANGE} event: another service is no longer
     * listening to the microphone.
     */
    public static final int SPEECH_STATE_LISTENING_END = 0x00000008;

    /**
     * Change type for {@link #TYPE_WINDOWS_CHANGED} event:
     * The window was added.
@@ -730,7 +763,9 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par

    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(flag = true, prefix = { "CONTENT_CHANGE_TYPE_" },
    @IntDef(
            flag = true,
            prefix = {"CONTENT_CHANGE_TYPE_"},
            value = {
                CONTENT_CHANGE_TYPE_UNDEFINED,
                CONTENT_CHANGE_TYPE_SUBTREE,
@@ -742,12 +777,28 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
                CONTENT_CHANGE_TYPE_PANE_DISAPPEARED,
                CONTENT_CHANGE_TYPE_DRAG_STARTED,
                CONTENT_CHANGE_TYPE_DRAG_DROPPED,
                    CONTENT_CHANGE_TYPE_DRAG_CANCELLED
                CONTENT_CHANGE_TYPE_DRAG_CANCELLED,
            })
    public @interface ContentChangeTypes {}

    /** @hide */
    @IntDef(flag = true, prefix = { "TYPE_" }, value = {
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(
            flag = true,
            prefix = {"SPEECH_STATE_"},
            value = {
                SPEECH_STATE_SPEAKING_START,
                SPEECH_STATE_SPEAKING_END,
                SPEECH_STATE_LISTENING_START,
                SPEECH_STATE_LISTENING_END
            })
    public @interface SpeechStateChangeTypes {}

    /** @hide */
    @IntDef(
            flag = true,
            prefix = {"TYPE_"},
            value = {
                TYPE_VIEW_CLICKED,
                TYPE_VIEW_LONG_CLICKED,
                TYPE_VIEW_SELECTED,
@@ -772,7 +823,8 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
                TYPE_TOUCH_INTERACTION_END,
                TYPE_WINDOWS_CHANGED,
                TYPE_VIEW_CONTEXT_CLICKED,
            TYPE_ASSIST_READING_CONTEXT
                TYPE_ASSIST_READING_CONTEXT,
                TYPE_SPEECH_STATE_CHANGE
            })
    @Retention(RetentionPolicy.SOURCE)
    public @interface EventType {}
@@ -814,6 +866,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
    int mAction;
    int mContentChangeTypes;
    int mWindowChangeTypes;
    int mSpeechStateChangeTypes;

    /**
     * The stack trace describing where this event originated from on the app side.
@@ -867,6 +920,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
        mMovementGranularity = event.mMovementGranularity;
        mAction = event.mAction;
        mContentChangeTypes = event.mContentChangeTypes;
        mSpeechStateChangeTypes = event.mSpeechStateChangeTypes;
        mWindowChangeTypes = event.mWindowChangeTypes;
        mEventTime = event.mEventTime;
        mPackageName = event.mPackageName;
@@ -1007,6 +1061,51 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
        mContentChangeTypes = changeTypes;
    }

    /**
     * Gets the speech state signaled by a {@link #TYPE_SPEECH_STATE_CHANGE} event
     *
     * @see #SPEECH_STATE_SPEAKING_START
     * @see #SPEECH_STATE_SPEAKING_END
     * @see #SPEECH_STATE_LISTENING_START
     * @see #SPEECH_STATE_LISTENING_END
     */
    public int getSpeechStateChangeTypes() {
        return mSpeechStateChangeTypes;
    }

    private static String speechStateChangedTypesToString(int types) {
        return BitUtils.flagsToString(
                types, AccessibilityEvent::singleSpeechStateChangeTypeToString);
    }

    private static String singleSpeechStateChangeTypeToString(int type) {
        switch (type) {
            case SPEECH_STATE_SPEAKING_START:
                return "SPEECH_STATE_SPEAKING_START";
            case SPEECH_STATE_LISTENING_START:
                return "SPEECH_STATE_LISTENING_START";
            case SPEECH_STATE_SPEAKING_END:
                return "SPEECH_STATE_SPEAKING_END";
            case SPEECH_STATE_LISTENING_END:
                return "SPEECH_STATE_LISTENING_END";
            default:
                return Integer.toHexString(type);
        }
    }

    /**
     * Sets the speech state type signaled by a {@link #TYPE_SPEECH_STATE_CHANGE} event
     *
     * @see #SPEECH_STATE_SPEAKING_START
     * @see #SPEECH_STATE_SPEAKING_END
     * @see #SPEECH_STATE_LISTENING_START
     * @see #SPEECH_STATE_LISTENING_END
     */
    public void setSpeechStateChangeTypes(int state) {
        enforceNotSealed();
        mSpeechStateChangeTypes = state;
    }

    /**
     * Get the bit mask of change types signaled by a {@link #TYPE_WINDOWS_CHANGED} event. A
     * single event may represent multiple change types.
@@ -1239,6 +1338,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
        mAction = 0;
        mContentChangeTypes = 0;
        mWindowChangeTypes = 0;
        mSpeechStateChangeTypes = 0;
        mPackageName = null;
        mEventTime = 0;
        if (mRecords != null) {
@@ -1261,6 +1361,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
        mAction = parcel.readInt();
        mContentChangeTypes = parcel.readInt();
        mWindowChangeTypes = parcel.readInt();
        mSpeechStateChangeTypes = parcel.readInt();
        mPackageName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
        mEventTime = parcel.readLong();
        mConnectionId = parcel.readInt();
@@ -1332,6 +1433,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
        parcel.writeInt(mAction);
        parcel.writeInt(mContentChangeTypes);
        parcel.writeInt(mWindowChangeTypes);
        parcel.writeInt(mSpeechStateChangeTypes);
        TextUtils.writeToParcel(mPackageName, parcel, 0);
        parcel.writeLong(mEventTime);
        parcel.writeInt(mConnectionId);
@@ -1500,6 +1602,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
            case TYPE_WINDOWS_CHANGED: return "TYPE_WINDOWS_CHANGED";
            case TYPE_VIEW_CONTEXT_CLICKED: return "TYPE_VIEW_CONTEXT_CLICKED";
            case TYPE_ASSIST_READING_CONTEXT: return "TYPE_ASSIST_READING_CONTEXT";
            case TYPE_SPEECH_STATE_CHANGE: return "TYPE_SPEECH_STATE_CHANGE";
            default: return Integer.toHexString(eventType);
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ public class AccessibilityEventTest {
    // and assertAccessibilityEventCleared

    /** The number of properties of the {@link AccessibilityEvent} class. */
    private static final int A11Y_EVENT_NON_STATIC_FIELD_COUNT = 32;
    private static final int A11Y_EVENT_NON_STATIC_FIELD_COUNT = 33;

    // The number of fields tested in the corresponding CTS AccessibilityRecordTest:
    // assertAccessibilityRecordCleared, fullyPopulateAccessibilityRecord,