diff --git a/core/api/current.txt b/core/api/current.txt index eb2ba0e247b78..efe04abe2823f 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -1489,6 +1489,7 @@ package android { field public static final int strokeLineJoin = 16843788; // 0x101040c field public static final int strokeMiterLimit = 16843789; // 0x101040d field public static final int strokeWidth = 16843783; // 0x1010407 + field public static final int stylusHandwritingSettingsActivity; field public static final int subMenuArrow = 16844019; // 0x10104f3 field public static final int submitBackground = 16843912; // 0x1010488 field public static final int subtitle = 16843473; // 0x10102d1 @@ -54805,6 +54806,7 @@ package android.view.inputmethod { public final class InputMethodInfo implements android.os.Parcelable { ctor public InputMethodInfo(android.content.Context, android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; ctor public InputMethodInfo(String, String, CharSequence, String); + method @Nullable public android.content.Intent createStylusHandwritingSettingsActivityIntent(); method public int describeContents(); method public void dump(android.util.Printer, String); method public android.content.ComponentName getComponent(); @@ -54823,6 +54825,7 @@ package android.view.inputmethod { method public boolean supportsStylusHandwriting(); method public boolean suppressesSpellChecker(); method public void writeToParcel(android.os.Parcel, int); + field public static final String ACTION_STYLUS_HANDWRITING_SETTINGS = "android.view.inputmethod.action.STYLUS_HANDWRITING_SETTINGS"; field @NonNull public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 0b4a70848b7ba..d6ce1589d8a63 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3352,6 +3352,7 @@ package android.view.inputmethod { } public final class InputMethodInfo implements android.os.Parcelable { + ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, boolean, @NonNull String); ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int); } diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java index b7da73247efd5..6a31818df3510 100644 --- a/core/java/android/view/inputmethod/InputMethodInfo.java +++ b/core/java/android/view/inputmethod/InputMethodInfo.java @@ -22,6 +22,7 @@ import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -38,6 +39,7 @@ import android.icu.util.ULocale; import android.inputmethodservice.InputMethodService; import android.os.Parcel; import android.os.Parcelable; +import android.text.TextUtils; import android.util.AttributeSet; import android.util.Printer; import android.util.Slog; @@ -71,6 +73,10 @@ import java.util.List; * @attr ref android.R.styleable#InputMethod_configChanges */ public final class InputMethodInfo implements Parcelable { + + public static final String ACTION_STYLUS_HANDWRITING_SETTINGS = + "android.view.inputmethod.action.STYLUS_HANDWRITING_SETTINGS"; + static final String TAG = "InputMethodInfo"; /** @@ -152,6 +158,11 @@ public final class InputMethodInfo implements Parcelable { */ private final boolean mSupportsStylusHandwriting; + /** + * The stylus handwriting setting activity's name, used by the system settings to + * launch the stylus handwriting specific setting activity of this input method. + */ + private final String mStylusHandwritingSettingsActivityAttr; /** * @param service the {@link ResolveInfo} corresponds in which the IME is implemented. @@ -203,6 +214,7 @@ public final class InputMethodInfo implements Parcelable { PackageManager pm = context.getPackageManager(); String settingsActivityComponent = null; + String stylusHandwritingSettingsActivity = null; boolean isVrOnly; int isDefaultResId = 0; @@ -253,6 +265,9 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod_configChanges, 0); mSupportsStylusHandwriting = sa.getBoolean( com.android.internal.R.styleable.InputMethod_supportsStylusHandwriting, false); + stylusHandwritingSettingsActivity = sa.getString( + com.android.internal.R.styleable + .InputMethod_stylusHandwritingSettingsActivity); sa.recycle(); final int depth = parser.getDepth(); @@ -328,6 +343,7 @@ public final class InputMethodInfo implements Parcelable { } mSubtypes = new InputMethodSubtypeArray(subtypes); mSettingsActivityName = settingsActivityComponent; + mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivity; mIsDefaultResId = isDefaultResId; mIsAuxIme = isAuxIme; mSupportsSwitchingToNextInputMethod = supportsSwitchingToNextInputMethod; @@ -354,6 +370,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes = new InputMethodSubtypeArray(source); mHandledConfigChanges = source.readInt(); mSupportsStylusHandwriting = source.readBoolean(); + mStylusHandwritingSettingsActivityAttr = source.readString8(); mForceDefault = false; } @@ -367,9 +384,27 @@ public final class InputMethodInfo implements Parcelable { false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, + null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); } + /** + * Test API for creating a built-in input method to verify stylus handwriting. + * @hide + */ + @TestApi + public InputMethodInfo(@NonNull String packageName, @NonNull String className, + @NonNull CharSequence label, @NonNull String settingsActivity, + boolean supportStylusHandwriting, + @NonNull String stylusHandwritingSettingsActivityAttr) { + this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, + settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, + false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, + false /* inlineSuggestionsEnabled */, false /* isVrOnly */, + 0 /* handledConfigChanges */, supportStylusHandwriting, + stylusHandwritingSettingsActivityAttr, false /* inlineSuggestionsEnabled */); + } + /** * Temporary API for creating a built-in input method for test. * @hide @@ -383,6 +418,7 @@ public final class InputMethodInfo implements Parcelable { false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, handledConfigChanges, false /* supportsStylusHandwriting */, + null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); } @@ -397,6 +433,7 @@ public final class InputMethodInfo implements Parcelable { true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, 0 /* handledconfigChanges */, false /* supportsStylusHandwriting */, + null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); } @@ -410,6 +447,7 @@ public final class InputMethodInfo implements Parcelable { this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault, supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, + null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); } @@ -421,6 +459,7 @@ public final class InputMethodInfo implements Parcelable { List subtypes, int isDefaultResId, boolean forceDefault, boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled, boolean isVrOnly, int handledConfigChanges, boolean supportsStylusHandwriting, + String stylusHandwritingSettingsActivityAttr, boolean supportsInlineSuggestionsWithTouchExploration) { final ServiceInfo si = ri.serviceInfo; mService = ri; @@ -439,6 +478,7 @@ public final class InputMethodInfo implements Parcelable { mIsVrOnly = isVrOnly; mHandledConfigChanges = handledConfigChanges; mSupportsStylusHandwriting = supportsStylusHandwriting; + mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivityAttr; } private static ResolveInfo buildFakeResolveInfo(String packageName, String className, @@ -528,6 +568,7 @@ public final class InputMethodInfo implements Parcelable { * *

A null will be returned if there is no settings activity associated * with the input method.

+ * @see #createStylusHandwritingSettingsActivityIntent() */ public String getSettingsActivity() { return mSettingsActivityName; @@ -600,11 +641,40 @@ public final class InputMethodInfo implements Parcelable { /** * Returns if IME supports handwriting using stylus input. * @attr ref android.R.styleable#InputMethod_supportsStylusHandwriting + * @see #createStylusHandwritingSettingsActivityIntent() */ public boolean supportsStylusHandwriting() { return mSupportsStylusHandwriting; } + /** + * Returns {@link Intent} for stylus handwriting settings activity with + * {@link Intent#getAction() Intent action} {@link #ACTION_STYLUS_HANDWRITING_SETTINGS} + * if IME {@link #supportsStylusHandwriting() supports stylus handwriting} or else + * null if there are no associated settings for stylus handwriting / handwriting + * is not supported. + * + *

To launch stylus settings, use this method to get the {@link android.content.Intent} to + * launch the stylus handwriting settings activity.

+ *

e.g.

startActivity(createStylusHandwritingSettingsActivityIntent());
+     * 

+ * + * @attr ref R.styleable#InputMethod_stylusHandwritingSettingsActivity + * @see #getSettingsActivity() + * @see #supportsStylusHandwriting() + */ + @Nullable + public Intent createStylusHandwritingSettingsActivityIntent() { + if (TextUtils.isEmpty(mStylusHandwritingSettingsActivityAttr) + || !mSupportsStylusHandwriting) { + return null; + } + // TODO(b/210039666): consider returning null if component is not enabled. + return new Intent(ACTION_STYLUS_HANDWRITING_SETTINGS).setComponent( + new ComponentName(getServiceInfo().packageName, + mStylusHandwritingSettingsActivityAttr)); + } + public void dump(Printer pw, String prefix) { pw.println(prefix + "mId=" + mId + " mSettingsActivityName=" + mSettingsActivityName @@ -615,7 +685,9 @@ public final class InputMethodInfo implements Parcelable { + mSupportsInlineSuggestionsWithTouchExploration + " mSuppressesSpellChecker=" + mSuppressesSpellChecker + " mShowInInputMethodPicker=" + mShowInInputMethodPicker - + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting); + + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting + + " mStylusHandwritingSettingsActivityAttr=" + + mStylusHandwritingSettingsActivityAttr); pw.println(prefix + "mIsDefaultResId=0x" + Integer.toHexString(mIsDefaultResId)); pw.println(prefix + "Service:"); @@ -730,6 +802,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes.writeToParcel(dest); dest.writeInt(mHandledConfigChanges); dest.writeBoolean(mSupportsStylusHandwriting); + dest.writeString8(mStylusHandwritingSettingsActivityAttr); } /** diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 1b6f88f3feee8..5851c4eb2fe78 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3763,6 +3763,9 @@ {@link android.inputmethodservice.InputMethodService#onFinishInput()}. --> + + diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml index f4b49e6ce38ef..58b8601e234fd 100644 --- a/core/res/res/values/public-staging.xml +++ b/core/res/res/values/public-staging.xml @@ -128,6 +128,7 @@ + diff --git a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java index e7d7d640324d0..7bef55e23919f 100644 --- a/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java +++ b/core/tests/coretests/src/android/view/inputmethod/InputMethodInfoTest.java @@ -62,6 +62,8 @@ public class InputMethodInfoTest { assertThat(clone.supportsSwitchingToNextInputMethod(), is(false)); assertThat(imi.isInlineSuggestionsEnabled(), is(false)); assertThat(imi.supportsInlineSuggestionsWithTouchExploration(), is(false)); + assertThat(imi.supportsStylusHandwriting(), is(false)); + assertThat(imi.createStylusHandwritingSettingsActivityIntent(), equalTo(null)); } @Test