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

Commit 0043c906 authored by Taran Singh's avatar Taran Singh
Browse files

Writing tools: API for EditorInfo 2/n

Introduces support for writing tools in EditorInfo. by default its
enabled on all editors and app/toolkit can opt-out if needed.

Bug: 373788889
Flag: android.view.inputmethod.writing_tools
Test: atest CtsInputMethodTestCases
API-Coverage-Bug: 378735851
Change-Id: I3c1d2be02a578a8c8633418c982df1c78553b936
parent 2eb11788
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -56902,6 +56902,7 @@ package android.view.inputmethod {
    method @NonNull public java.util.Set<java.lang.Class<? extends android.view.inputmethod.PreviewableHandwritingGesture>> getSupportedHandwritingGesturePreviews();
    method @NonNull public java.util.List<java.lang.Class<? extends android.view.inputmethod.HandwritingGesture>> getSupportedHandwritingGestures();
    method @FlaggedApi("android.view.inputmethod.editorinfo_handwriting_enabled") public boolean isStylusHandwritingEnabled();
    method @FlaggedApi("android.view.inputmethod.writing_tools") public boolean isWritingToolsEnabled();
    method public final void makeCompatible(int);
    method public void setInitialSurroundingSubText(@NonNull CharSequence, int);
    method public void setInitialSurroundingText(@NonNull CharSequence);
@@ -56909,6 +56910,7 @@ package android.view.inputmethod {
    method @FlaggedApi("android.view.inputmethod.editorinfo_handwriting_enabled") public void setStylusHandwritingEnabled(boolean);
    method public void setSupportedHandwritingGesturePreviews(@NonNull java.util.Set<java.lang.Class<? extends android.view.inputmethod.PreviewableHandwritingGesture>>);
    method public void setSupportedHandwritingGestures(@NonNull java.util.List<java.lang.Class<? extends android.view.inputmethod.HandwritingGesture>>);
    method @FlaggedApi("android.view.inputmethod.writing_tools") public void setWritingToolsEnabled(boolean);
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.view.inputmethod.EditorInfo> CREATOR;
    field public static final int IME_ACTION_DONE = 6; // 0x6
+27 −1
Original line number Diff line number Diff line
@@ -524,7 +524,6 @@ public class EditorInfo implements InputType, Parcelable {
    @Nullable
    public LocaleList hintLocales = null;


    /**
     * List of acceptable MIME types for
     * {@link InputConnection#commitContent(InputContentInfo, int, Bundle)}.
@@ -759,6 +758,30 @@ public class EditorInfo implements InputType, Parcelable {
        return mIsStylusHandwritingEnabled;
    }

    private boolean mWritingToolsEnabled = true;

    /**
     * Returns {@code true} when an {@code Editor} has writing tools enabled.
     * {@code true} by default for all editors. Toolkits can optionally disable them where not
     * relevant e.g. passwords, number input, etc.
     * @see #setWritingToolsEnabled(boolean)
     */
    @FlaggedApi(Flags.FLAG_WRITING_TOOLS)
    public boolean isWritingToolsEnabled() {
        return mWritingToolsEnabled;
    }

    /**
     * Set {@code false} if {@code Editor} opts-out of writing tools, that enable IMEs to replace
     * text with generative AI text.
     * @param enabled set {@code true} to enabled or {@code false to disable} support.
     * @see #isWritingToolsEnabled()
     */
    @FlaggedApi(Flags.FLAG_WRITING_TOOLS)
    public void setWritingToolsEnabled(boolean enabled) {
        mWritingToolsEnabled = enabled;
    }

    /**
     * If not {@code null}, this editor needs to talk to IMEs that run for the specified user, no
     * matter what user ID the calling process has.
@@ -1255,6 +1278,7 @@ public class EditorInfo implements InputType, Parcelable {
                + InputMethodDebug.handwritingGestureTypeFlagsToString(
                        mSupportedHandwritingGesturePreviewTypes));
        pw.println(prefix + "isStylusHandwritingEnabled=" + mIsStylusHandwritingEnabled);
        pw.println(prefix + "writingToolsEnabled=" + mWritingToolsEnabled);
        pw.println(prefix + "contentMimeTypes=" + Arrays.toString(contentMimeTypes));
        if (targetInputMethodUser != null) {
            pw.println(prefix + "targetInputMethodUserId=" + targetInputMethodUser.getIdentifier());
@@ -1335,6 +1359,7 @@ public class EditorInfo implements InputType, Parcelable {
        }
        dest.writeStringArray(contentMimeTypes);
        UserHandle.writeToParcel(targetInputMethodUser, dest);
        dest.writeBoolean(mWritingToolsEnabled);
    }

    /**
@@ -1375,6 +1400,7 @@ public class EditorInfo implements InputType, Parcelable {
                    res.hintLocales = hintLocales.isEmpty() ? null : hintLocales;
                    res.contentMimeTypes = source.readStringArray();
                    res.targetInputMethodUser = UserHandle.readFromParcel(source);
                    res.mWritingToolsEnabled = source.readBoolean();
                    return res;
                }

+12 −3
Original line number Diff line number Diff line
@@ -507,7 +507,8 @@ public class EditorInfoTest {
                + "prefix: supportedHandwritingGestureTypes=(none)\n"
                + "prefix: supportedHandwritingGesturePreviewTypes=(none)\n"
                + "prefix: isStylusHandwritingEnabled=false\n"
                + "prefix: contentMimeTypes=null\n");
                + "prefix: contentMimeTypes=null\n"
                + "prefix: writingToolsEnabled=true\n");
    }

    @Test
@@ -539,6 +540,7 @@ public class EditorInfoTest {
        info.hintLocales = LocaleList.forLanguageTags("en,es,zh");
        info.contentMimeTypes = new String[] {"image/png"};
        info.targetInputMethodUser = UserHandle.of(10);
        info.setWritingToolsEnabled(false);
        final StringBuilder sb = new StringBuilder();
        info.dump(new StringBuilderPrinter(sb), "prefix2: ");
        assertThat(sb.toString()).isEqualTo(
@@ -555,7 +557,8 @@ public class EditorInfoTest {
                        + "prefix2: supportedHandwritingGesturePreviewTypes=SELECT\n"
                        + "prefix2: isStylusHandwritingEnabled=" + isStylusHandwritingEnabled + "\n"
                        + "prefix2: contentMimeTypes=[image/png]\n"
                        + "prefix2: targetInputMethodUserId=10\n");
                        + "prefix2: targetInputMethodUserId=10\n"
                        + "prefix2: writingToolsEnabled=false\n");
    }

    @Test
@@ -576,7 +579,8 @@ public class EditorInfoTest {
                        + "prefix: supportedHandwritingGestureTypes=(none)\n"
                        + "prefix: supportedHandwritingGesturePreviewTypes=(none)\n"
                        + "prefix: isStylusHandwritingEnabled=false\n"
                        + "prefix: contentMimeTypes=null\n");
                        + "prefix: contentMimeTypes=null\n"
                        + "prefix: writingToolsEnabled=true\n");
    }

    @Test
@@ -621,4 +625,9 @@ public class EditorInfoTest {
        infoCopy.extras.putString("testKey2", "testValue");
        assertFalse(TEST_EDITOR_INFO.kindofEquals(infoCopy));
    }

    @Test
    public void testWritingToolsEnabledbyDefault() {
        assertTrue(TEST_EDITOR_INFO.isWritingToolsEnabled());
    }
}