Loading core/api/current.txt +3 −0 Original line number Original line Diff line number Diff line Loading @@ -1603,6 +1603,7 @@ package android { field public static final int supportedTypes = 16844369; // 0x1010651 field public static final int supportedTypes = 16844369; // 0x1010651 field public static final int supportsAssist = 16844016; // 0x10104f0 field public static final int supportsAssist = 16844016; // 0x10104f0 field public static final int supportsBatteryGameMode = 16844374; // 0x1010656 field public static final int supportsBatteryGameMode = 16844374; // 0x1010656 field @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public static final int supportsConnectionlessStylusHandwriting; field public static final int supportsInlineSuggestions = 16844301; // 0x101060d field public static final int supportsInlineSuggestions = 16844301; // 0x101060d field public static final int supportsInlineSuggestionsWithTouchExploration = 16844397; // 0x101066d field public static final int supportsInlineSuggestionsWithTouchExploration = 16844397; // 0x101066d field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1 field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1 Loading Loading @@ -56105,6 +56106,7 @@ package android.view.inputmethod { method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); method public CharSequence loadLabel(android.content.pm.PackageManager); method public CharSequence loadLabel(android.content.pm.PackageManager); method public boolean shouldShowInInputMethodPicker(); method public boolean shouldShowInInputMethodPicker(); method @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public boolean supportsConnectionlessStylusHandwriting(); method public boolean supportsStylusHandwriting(); method public boolean supportsStylusHandwriting(); method public boolean suppressesSpellChecker(); method public boolean suppressesSpellChecker(); method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int); Loading Loading @@ -56134,6 +56136,7 @@ package android.view.inputmethod { method public boolean isAcceptingText(); method public boolean isAcceptingText(); method public boolean isActive(android.view.View); method public boolean isActive(android.view.View); method public boolean isActive(); method public boolean isActive(); method @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public boolean isConnectionlessStylusHandwritingAvailable(); method public boolean isFullscreenMode(); method public boolean isFullscreenMode(); method public boolean isInputMethodSuppressingSpellChecker(); method public boolean isInputMethodSuppressingSpellChecker(); method public boolean isStylusHandwritingAvailable(); method public boolean isStylusHandwritingAvailable(); core/api/test-current.txt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -3901,7 +3901,7 @@ package android.view.inputmethod { } } public final class InputMethodInfo implements android.os.Parcelable { public final class InputMethodInfo implements android.os.Parcelable { ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, @NonNull String, boolean, @NonNull String); ctor @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, @NonNull String, boolean, boolean, @NonNull String); ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int); ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int); field public static final int COMPONENT_NAME_MAX_LENGTH = 1000; // 0x3e8 field public static final int COMPONENT_NAME_MAX_LENGTH = 1000; // 0x3e8 field public static final int MAX_IMES_PER_PACKAGE = 20; // 0x14 field public static final int MAX_IMES_PER_PACKAGE = 20; // 0x14 Loading core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -530,13 +530,14 @@ final class IInputMethodManagerGlobalInvoker { @AnyThread @AnyThread @RequiresPermission(value = Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true) @RequiresPermission(value = Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true) static boolean isStylusHandwritingAvailableAsUser(@UserIdInt int userId) { static boolean isStylusHandwritingAvailableAsUser( @UserIdInt int userId, boolean connectionless) { final IInputMethodManager service = getService(); final IInputMethodManager service = getService(); if (service == null) { if (service == null) { return false; return false; } } try { try { return service.isStylusHandwritingAvailableAsUser(userId); return service.isStylusHandwritingAvailableAsUser(userId, connectionless); } catch (RemoteException e) { } catch (RemoteException e) { throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer(); } } Loading core/java/android/view/inputmethod/InputMethodInfo.java +32 −3 Original line number Original line Diff line number Diff line Loading @@ -204,6 +204,9 @@ public final class InputMethodInfo implements Parcelable { */ */ private final boolean mSupportsStylusHandwriting; private final boolean mSupportsStylusHandwriting; /** The flag whether this IME supports connectionless stylus handwriting sessions. */ private final boolean mSupportsConnectionlessStylusHandwriting; /** /** * The stylus handwriting setting activity's name, used by the system settings to * The stylus handwriting setting activity's name, used by the system settings to * launch the stylus handwriting specific setting activity of this input method. * launch the stylus handwriting specific setting activity of this input method. Loading Loading @@ -330,6 +333,9 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod_configChanges, 0); com.android.internal.R.styleable.InputMethod_configChanges, 0); mSupportsStylusHandwriting = sa.getBoolean( mSupportsStylusHandwriting = sa.getBoolean( com.android.internal.R.styleable.InputMethod_supportsStylusHandwriting, false); com.android.internal.R.styleable.InputMethod_supportsStylusHandwriting, false); mSupportsConnectionlessStylusHandwriting = sa.getBoolean( com.android.internal.R.styleable .InputMethod_supportsConnectionlessStylusHandwriting, false); stylusHandwritingSettingsActivity = sa.getString( stylusHandwritingSettingsActivity = sa.getString( com.android.internal.R.styleable.InputMethod_stylusHandwritingSettingsActivity); com.android.internal.R.styleable.InputMethod_stylusHandwritingSettingsActivity); sa.recycle(); sa.recycle(); Loading Loading @@ -442,6 +448,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes = source.mSubtypes; mSubtypes = source.mSubtypes; mHandledConfigChanges = source.mHandledConfigChanges; mHandledConfigChanges = source.mHandledConfigChanges; mSupportsStylusHandwriting = source.mSupportsStylusHandwriting; mSupportsStylusHandwriting = source.mSupportsStylusHandwriting; mSupportsConnectionlessStylusHandwriting = source.mSupportsConnectionlessStylusHandwriting; mForceDefault = source.mForceDefault; mForceDefault = source.mForceDefault; mStylusHandwritingSettingsActivityAttr = source.mStylusHandwritingSettingsActivityAttr; mStylusHandwritingSettingsActivityAttr = source.mStylusHandwritingSettingsActivityAttr; } } Loading @@ -463,6 +470,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes = new InputMethodSubtypeArray(source); mSubtypes = new InputMethodSubtypeArray(source); mHandledConfigChanges = source.readInt(); mHandledConfigChanges = source.readInt(); mSupportsStylusHandwriting = source.readBoolean(); mSupportsStylusHandwriting = source.readBoolean(); mSupportsConnectionlessStylusHandwriting = source.readBoolean(); mStylusHandwritingSettingsActivityAttr = source.readString8(); mStylusHandwritingSettingsActivityAttr = source.readString8(); mForceDefault = false; mForceDefault = false; } } Loading @@ -479,6 +487,7 @@ public final class InputMethodInfo implements Parcelable { false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -488,9 +497,11 @@ public final class InputMethodInfo implements Parcelable { * @hide * @hide */ */ @TestApi @TestApi @FlaggedApi(Flags.FLAG_CONNECTIONLESS_HANDWRITING) public InputMethodInfo(@NonNull String packageName, @NonNull String className, public InputMethodInfo(@NonNull String packageName, @NonNull String className, @NonNull CharSequence label, @NonNull String settingsActivity, @NonNull CharSequence label, @NonNull String settingsActivity, @NonNull String languageSettingsActivity, boolean supportStylusHandwriting, @NonNull String languageSettingsActivity, boolean supportStylusHandwriting, boolean supportConnectionlessStylusHandwriting, @NonNull String stylusHandwritingSettingsActivityAttr) { @NonNull String stylusHandwritingSettingsActivityAttr) { this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, settingsActivity, languageSettingsActivity, null /* subtypes */, settingsActivity, languageSettingsActivity, null /* subtypes */, Loading @@ -498,8 +509,8 @@ public final class InputMethodInfo implements Parcelable { true /* supportsSwitchingToNextInputMethod */, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, supportStylusHandwriting, stylusHandwritingSettingsActivityAttr, supportStylusHandwriting, supportConnectionlessStylusHandwriting, false /* inlineSuggestionsEnabled */); stylusHandwritingSettingsActivityAttr, false /* inlineSuggestionsEnabled */); } } /** /** Loading @@ -517,6 +528,7 @@ public final class InputMethodInfo implements Parcelable { false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, handledConfigChanges, false /* isVirtualDeviceOnly */, handledConfigChanges, false /* supportsStylusHandwriting */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -533,6 +545,7 @@ public final class InputMethodInfo implements Parcelable { true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledconfigChanges */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledconfigChanges */, false /* supportsStylusHandwriting */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -549,6 +562,7 @@ public final class InputMethodInfo implements Parcelable { supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly, supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly, false /* isVirtualDeviceOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -562,7 +576,8 @@ public final class InputMethodInfo implements Parcelable { int isDefaultResId, boolean forceDefault, int isDefaultResId, boolean forceDefault, boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled, boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled, boolean isVrOnly, boolean isVirtualDeviceOnly, int handledConfigChanges, boolean isVrOnly, boolean isVirtualDeviceOnly, int handledConfigChanges, boolean supportsStylusHandwriting, String stylusHandwritingSettingsActivityAttr, boolean supportsStylusHandwriting, boolean supportsConnectionlessStylusHandwriting, String stylusHandwritingSettingsActivityAttr, boolean supportsInlineSuggestionsWithTouchExploration) { boolean supportsInlineSuggestionsWithTouchExploration) { final ServiceInfo si = ri.serviceInfo; final ServiceInfo si = ri.serviceInfo; mService = ri; mService = ri; Loading @@ -583,6 +598,7 @@ public final class InputMethodInfo implements Parcelable { mIsVirtualDeviceOnly = isVirtualDeviceOnly; mIsVirtualDeviceOnly = isVirtualDeviceOnly; mHandledConfigChanges = handledConfigChanges; mHandledConfigChanges = handledConfigChanges; mSupportsStylusHandwriting = supportsStylusHandwriting; mSupportsStylusHandwriting = supportsStylusHandwriting; mSupportsConnectionlessStylusHandwriting = supportsConnectionlessStylusHandwriting; mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivityAttr; mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivityAttr; } } Loading Loading @@ -762,6 +778,16 @@ public final class InputMethodInfo implements Parcelable { return mSupportsStylusHandwriting; return mSupportsStylusHandwriting; } } /** * Returns whether the IME supports connectionless stylus handwriting sessions. * * @attr ref android.R.styleable#InputMethod_supportsConnectionlessStylusHandwriting */ @FlaggedApi(Flags.FLAG_CONNECTIONLESS_HANDWRITING) public boolean supportsConnectionlessStylusHandwriting() { return mSupportsConnectionlessStylusHandwriting; } /** /** * Returns {@link Intent} for stylus handwriting settings activity with * Returns {@link Intent} for stylus handwriting settings activity with * {@link Intent#getAction() Intent action} {@link #ACTION_STYLUS_HANDWRITING_SETTINGS} * {@link Intent#getAction() Intent action} {@link #ACTION_STYLUS_HANDWRITING_SETTINGS} Loading Loading @@ -828,6 +854,8 @@ public final class InputMethodInfo implements Parcelable { + " mSuppressesSpellChecker=" + mSuppressesSpellChecker + " mSuppressesSpellChecker=" + mSuppressesSpellChecker + " mShowInInputMethodPicker=" + mShowInInputMethodPicker + " mShowInInputMethodPicker=" + mShowInInputMethodPicker + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting + " mSupportsConnectionlessStylusHandwriting=" + mSupportsConnectionlessStylusHandwriting + " mStylusHandwritingSettingsActivityAttr=" + " mStylusHandwritingSettingsActivityAttr=" + mStylusHandwritingSettingsActivityAttr); + mStylusHandwritingSettingsActivityAttr); pw.println(prefix + "mIsDefaultResId=0x" pw.println(prefix + "mIsDefaultResId=0x" Loading Loading @@ -947,6 +975,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes.writeToParcel(dest); mSubtypes.writeToParcel(dest); dest.writeInt(mHandledConfigChanges); dest.writeInt(mHandledConfigChanges); dest.writeBoolean(mSupportsStylusHandwriting); dest.writeBoolean(mSupportsStylusHandwriting); dest.writeBoolean(mSupportsConnectionlessStylusHandwriting); dest.writeString8(mStylusHandwritingSettingsActivityAttr); dest.writeString8(mStylusHandwritingSettingsActivityAttr); } } Loading core/java/android/view/inputmethod/InputMethodManager.java +43 −1 Original line number Original line Diff line number Diff line Loading @@ -566,8 +566,15 @@ public final class InputMethodManager { @GuardedBy("mH") @GuardedBy("mH") private PropertyInvalidatedCache<Integer, Boolean> mStylusHandwritingAvailableCache; private PropertyInvalidatedCache<Integer, Boolean> mStylusHandwritingAvailableCache; /** Cached value for {@link #isConnectionlessStylusHandwritingAvailable} for userId. */ @GuardedBy("mH") private PropertyInvalidatedCache<Integer, Boolean> mConnectionlessStylusHandwritingAvailableCache; private static final String CACHE_KEY_STYLUS_HANDWRITING_PROPERTY = private static final String CACHE_KEY_STYLUS_HANDWRITING_PROPERTY = "cache_key.system_server.stylus_handwriting"; "cache_key.system_server.stylus_handwriting"; private static final String CACHE_KEY_CONNECTIONLESS_STYLUS_HANDWRITING_PROPERTY = "cache_key.system_server.connectionless_stylus_handwriting"; @GuardedBy("mH") @GuardedBy("mH") private int mCursorSelStart; private int mCursorSelStart; Loading Loading @@ -691,6 +698,17 @@ public final class InputMethodManager { PropertyInvalidatedCache.invalidateCache(CACHE_KEY_STYLUS_HANDWRITING_PROPERTY); PropertyInvalidatedCache.invalidateCache(CACHE_KEY_STYLUS_HANDWRITING_PROPERTY); } } /** * Calling this will invalidate the local connectionless stylus handwriting availability cache, * which forces the next query in any process to recompute the cache. * * @hide */ public static void invalidateLocalConnectionlessStylusHandwritingAvailabilityCaches() { PropertyInvalidatedCache.invalidateCache( CACHE_KEY_CONNECTIONLESS_STYLUS_HANDWRITING_PROPERTY); } private static boolean isAutofillUIShowing(View servedView) { private static boolean isAutofillUIShowing(View servedView) { AutofillManager afm = servedView.getContext().getSystemService(AutofillManager.class); AutofillManager afm = servedView.getContext().getSystemService(AutofillManager.class); return afm != null && afm.isAutofillUiShowing(); return afm != null && afm.isAutofillUiShowing(); Loading Loading @@ -1584,7 +1602,7 @@ public final class InputMethodManager { @Override @Override public Boolean recompute(Integer userId) { public Boolean recompute(Integer userId) { return IInputMethodManagerGlobalInvoker.isStylusHandwritingAvailableAsUser( return IInputMethodManagerGlobalInvoker.isStylusHandwritingAvailableAsUser( userId); userId, /* connectionless= */ false); } } }; }; } } Loading @@ -1593,6 +1611,30 @@ public final class InputMethodManager { return isAvailable; return isAvailable; } } /** * Returns {@code true} if the currently selected IME supports connectionless stylus handwriting * sessions and is enabled. */ @FlaggedApi(Flags.FLAG_CONNECTIONLESS_HANDWRITING) public boolean isConnectionlessStylusHandwritingAvailable() { if (ActivityThread.currentApplication() == null) { return false; } synchronized (mH) { if (mConnectionlessStylusHandwritingAvailableCache == null) { mConnectionlessStylusHandwritingAvailableCache = new PropertyInvalidatedCache<>( /* maxEntries= */ 4, CACHE_KEY_CONNECTIONLESS_STYLUS_HANDWRITING_PROPERTY) { @Override public Boolean recompute(@NonNull Integer userId) { return IInputMethodManagerGlobalInvoker.isStylusHandwritingAvailableAsUser( userId, /* connectionless= */ true); } }; } return mConnectionlessStylusHandwritingAvailableCache.query(UserHandle.myUserId()); } } /** /** * Returns the list of installed input methods for the specified user. * Returns the list of installed input methods for the specified user. * * Loading Loading
core/api/current.txt +3 −0 Original line number Original line Diff line number Diff line Loading @@ -1603,6 +1603,7 @@ package android { field public static final int supportedTypes = 16844369; // 0x1010651 field public static final int supportedTypes = 16844369; // 0x1010651 field public static final int supportsAssist = 16844016; // 0x10104f0 field public static final int supportsAssist = 16844016; // 0x10104f0 field public static final int supportsBatteryGameMode = 16844374; // 0x1010656 field public static final int supportsBatteryGameMode = 16844374; // 0x1010656 field @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public static final int supportsConnectionlessStylusHandwriting; field public static final int supportsInlineSuggestions = 16844301; // 0x101060d field public static final int supportsInlineSuggestions = 16844301; // 0x101060d field public static final int supportsInlineSuggestionsWithTouchExploration = 16844397; // 0x101066d field public static final int supportsInlineSuggestionsWithTouchExploration = 16844397; // 0x101066d field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1 field public static final int supportsLaunchVoiceAssistFromKeyguard = 16844017; // 0x10104f1 Loading Loading @@ -56105,6 +56106,7 @@ package android.view.inputmethod { method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); method public CharSequence loadLabel(android.content.pm.PackageManager); method public CharSequence loadLabel(android.content.pm.PackageManager); method public boolean shouldShowInInputMethodPicker(); method public boolean shouldShowInInputMethodPicker(); method @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public boolean supportsConnectionlessStylusHandwriting(); method public boolean supportsStylusHandwriting(); method public boolean supportsStylusHandwriting(); method public boolean suppressesSpellChecker(); method public boolean suppressesSpellChecker(); method public void writeToParcel(android.os.Parcel, int); method public void writeToParcel(android.os.Parcel, int); Loading Loading @@ -56134,6 +56136,7 @@ package android.view.inputmethod { method public boolean isAcceptingText(); method public boolean isAcceptingText(); method public boolean isActive(android.view.View); method public boolean isActive(android.view.View); method public boolean isActive(); method public boolean isActive(); method @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public boolean isConnectionlessStylusHandwritingAvailable(); method public boolean isFullscreenMode(); method public boolean isFullscreenMode(); method public boolean isInputMethodSuppressingSpellChecker(); method public boolean isInputMethodSuppressingSpellChecker(); method public boolean isStylusHandwritingAvailable(); method public boolean isStylusHandwritingAvailable();
core/api/test-current.txt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -3901,7 +3901,7 @@ package android.view.inputmethod { } } public final class InputMethodInfo implements android.os.Parcelable { public final class InputMethodInfo implements android.os.Parcelable { ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, @NonNull String, boolean, @NonNull String); ctor @FlaggedApi("android.view.inputmethod.connectionless_handwriting") public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, @NonNull String, boolean, boolean, @NonNull String); ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int); ctor public InputMethodInfo(@NonNull String, @NonNull String, @NonNull CharSequence, @NonNull String, int); field public static final int COMPONENT_NAME_MAX_LENGTH = 1000; // 0x3e8 field public static final int COMPONENT_NAME_MAX_LENGTH = 1000; // 0x3e8 field public static final int MAX_IMES_PER_PACKAGE = 20; // 0x14 field public static final int MAX_IMES_PER_PACKAGE = 20; // 0x14 Loading
core/java/android/view/inputmethod/IInputMethodManagerGlobalInvoker.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -530,13 +530,14 @@ final class IInputMethodManagerGlobalInvoker { @AnyThread @AnyThread @RequiresPermission(value = Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true) @RequiresPermission(value = Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true) static boolean isStylusHandwritingAvailableAsUser(@UserIdInt int userId) { static boolean isStylusHandwritingAvailableAsUser( @UserIdInt int userId, boolean connectionless) { final IInputMethodManager service = getService(); final IInputMethodManager service = getService(); if (service == null) { if (service == null) { return false; return false; } } try { try { return service.isStylusHandwritingAvailableAsUser(userId); return service.isStylusHandwritingAvailableAsUser(userId, connectionless); } catch (RemoteException e) { } catch (RemoteException e) { throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer(); } } Loading
core/java/android/view/inputmethod/InputMethodInfo.java +32 −3 Original line number Original line Diff line number Diff line Loading @@ -204,6 +204,9 @@ public final class InputMethodInfo implements Parcelable { */ */ private final boolean mSupportsStylusHandwriting; private final boolean mSupportsStylusHandwriting; /** The flag whether this IME supports connectionless stylus handwriting sessions. */ private final boolean mSupportsConnectionlessStylusHandwriting; /** /** * The stylus handwriting setting activity's name, used by the system settings to * The stylus handwriting setting activity's name, used by the system settings to * launch the stylus handwriting specific setting activity of this input method. * launch the stylus handwriting specific setting activity of this input method. Loading Loading @@ -330,6 +333,9 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod_configChanges, 0); com.android.internal.R.styleable.InputMethod_configChanges, 0); mSupportsStylusHandwriting = sa.getBoolean( mSupportsStylusHandwriting = sa.getBoolean( com.android.internal.R.styleable.InputMethod_supportsStylusHandwriting, false); com.android.internal.R.styleable.InputMethod_supportsStylusHandwriting, false); mSupportsConnectionlessStylusHandwriting = sa.getBoolean( com.android.internal.R.styleable .InputMethod_supportsConnectionlessStylusHandwriting, false); stylusHandwritingSettingsActivity = sa.getString( stylusHandwritingSettingsActivity = sa.getString( com.android.internal.R.styleable.InputMethod_stylusHandwritingSettingsActivity); com.android.internal.R.styleable.InputMethod_stylusHandwritingSettingsActivity); sa.recycle(); sa.recycle(); Loading Loading @@ -442,6 +448,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes = source.mSubtypes; mSubtypes = source.mSubtypes; mHandledConfigChanges = source.mHandledConfigChanges; mHandledConfigChanges = source.mHandledConfigChanges; mSupportsStylusHandwriting = source.mSupportsStylusHandwriting; mSupportsStylusHandwriting = source.mSupportsStylusHandwriting; mSupportsConnectionlessStylusHandwriting = source.mSupportsConnectionlessStylusHandwriting; mForceDefault = source.mForceDefault; mForceDefault = source.mForceDefault; mStylusHandwritingSettingsActivityAttr = source.mStylusHandwritingSettingsActivityAttr; mStylusHandwritingSettingsActivityAttr = source.mStylusHandwritingSettingsActivityAttr; } } Loading @@ -463,6 +470,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes = new InputMethodSubtypeArray(source); mSubtypes = new InputMethodSubtypeArray(source); mHandledConfigChanges = source.readInt(); mHandledConfigChanges = source.readInt(); mSupportsStylusHandwriting = source.readBoolean(); mSupportsStylusHandwriting = source.readBoolean(); mSupportsConnectionlessStylusHandwriting = source.readBoolean(); mStylusHandwritingSettingsActivityAttr = source.readString8(); mStylusHandwritingSettingsActivityAttr = source.readString8(); mForceDefault = false; mForceDefault = false; } } Loading @@ -479,6 +487,7 @@ public final class InputMethodInfo implements Parcelable { false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -488,9 +497,11 @@ public final class InputMethodInfo implements Parcelable { * @hide * @hide */ */ @TestApi @TestApi @FlaggedApi(Flags.FLAG_CONNECTIONLESS_HANDWRITING) public InputMethodInfo(@NonNull String packageName, @NonNull String className, public InputMethodInfo(@NonNull String packageName, @NonNull String className, @NonNull CharSequence label, @NonNull String settingsActivity, @NonNull CharSequence label, @NonNull String settingsActivity, @NonNull String languageSettingsActivity, boolean supportStylusHandwriting, @NonNull String languageSettingsActivity, boolean supportStylusHandwriting, boolean supportConnectionlessStylusHandwriting, @NonNull String stylusHandwritingSettingsActivityAttr) { @NonNull String stylusHandwritingSettingsActivityAttr) { this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, settingsActivity, languageSettingsActivity, null /* subtypes */, settingsActivity, languageSettingsActivity, null /* subtypes */, Loading @@ -498,8 +509,8 @@ public final class InputMethodInfo implements Parcelable { true /* supportsSwitchingToNextInputMethod */, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, supportStylusHandwriting, stylusHandwritingSettingsActivityAttr, supportStylusHandwriting, supportConnectionlessStylusHandwriting, false /* inlineSuggestionsEnabled */); stylusHandwritingSettingsActivityAttr, false /* inlineSuggestionsEnabled */); } } /** /** Loading @@ -517,6 +528,7 @@ public final class InputMethodInfo implements Parcelable { false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, handledConfigChanges, false /* isVirtualDeviceOnly */, handledConfigChanges, false /* supportsStylusHandwriting */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -533,6 +545,7 @@ public final class InputMethodInfo implements Parcelable { true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledconfigChanges */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledconfigChanges */, false /* supportsStylusHandwriting */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -549,6 +562,7 @@ public final class InputMethodInfo implements Parcelable { supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly, supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly, false /* isVirtualDeviceOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, false /* supportConnectionlessStylusHandwriting */, null /* stylusHandwritingSettingsActivityAttr */, null /* stylusHandwritingSettingsActivityAttr */, false /* inlineSuggestionsEnabled */); false /* inlineSuggestionsEnabled */); } } Loading @@ -562,7 +576,8 @@ public final class InputMethodInfo implements Parcelable { int isDefaultResId, boolean forceDefault, int isDefaultResId, boolean forceDefault, boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled, boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled, boolean isVrOnly, boolean isVirtualDeviceOnly, int handledConfigChanges, boolean isVrOnly, boolean isVirtualDeviceOnly, int handledConfigChanges, boolean supportsStylusHandwriting, String stylusHandwritingSettingsActivityAttr, boolean supportsStylusHandwriting, boolean supportsConnectionlessStylusHandwriting, String stylusHandwritingSettingsActivityAttr, boolean supportsInlineSuggestionsWithTouchExploration) { boolean supportsInlineSuggestionsWithTouchExploration) { final ServiceInfo si = ri.serviceInfo; final ServiceInfo si = ri.serviceInfo; mService = ri; mService = ri; Loading @@ -583,6 +598,7 @@ public final class InputMethodInfo implements Parcelable { mIsVirtualDeviceOnly = isVirtualDeviceOnly; mIsVirtualDeviceOnly = isVirtualDeviceOnly; mHandledConfigChanges = handledConfigChanges; mHandledConfigChanges = handledConfigChanges; mSupportsStylusHandwriting = supportsStylusHandwriting; mSupportsStylusHandwriting = supportsStylusHandwriting; mSupportsConnectionlessStylusHandwriting = supportsConnectionlessStylusHandwriting; mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivityAttr; mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivityAttr; } } Loading Loading @@ -762,6 +778,16 @@ public final class InputMethodInfo implements Parcelable { return mSupportsStylusHandwriting; return mSupportsStylusHandwriting; } } /** * Returns whether the IME supports connectionless stylus handwriting sessions. * * @attr ref android.R.styleable#InputMethod_supportsConnectionlessStylusHandwriting */ @FlaggedApi(Flags.FLAG_CONNECTIONLESS_HANDWRITING) public boolean supportsConnectionlessStylusHandwriting() { return mSupportsConnectionlessStylusHandwriting; } /** /** * Returns {@link Intent} for stylus handwriting settings activity with * Returns {@link Intent} for stylus handwriting settings activity with * {@link Intent#getAction() Intent action} {@link #ACTION_STYLUS_HANDWRITING_SETTINGS} * {@link Intent#getAction() Intent action} {@link #ACTION_STYLUS_HANDWRITING_SETTINGS} Loading Loading @@ -828,6 +854,8 @@ public final class InputMethodInfo implements Parcelable { + " mSuppressesSpellChecker=" + mSuppressesSpellChecker + " mSuppressesSpellChecker=" + mSuppressesSpellChecker + " mShowInInputMethodPicker=" + mShowInInputMethodPicker + " mShowInInputMethodPicker=" + mShowInInputMethodPicker + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting + " mSupportsStylusHandwriting=" + mSupportsStylusHandwriting + " mSupportsConnectionlessStylusHandwriting=" + mSupportsConnectionlessStylusHandwriting + " mStylusHandwritingSettingsActivityAttr=" + " mStylusHandwritingSettingsActivityAttr=" + mStylusHandwritingSettingsActivityAttr); + mStylusHandwritingSettingsActivityAttr); pw.println(prefix + "mIsDefaultResId=0x" pw.println(prefix + "mIsDefaultResId=0x" Loading Loading @@ -947,6 +975,7 @@ public final class InputMethodInfo implements Parcelable { mSubtypes.writeToParcel(dest); mSubtypes.writeToParcel(dest); dest.writeInt(mHandledConfigChanges); dest.writeInt(mHandledConfigChanges); dest.writeBoolean(mSupportsStylusHandwriting); dest.writeBoolean(mSupportsStylusHandwriting); dest.writeBoolean(mSupportsConnectionlessStylusHandwriting); dest.writeString8(mStylusHandwritingSettingsActivityAttr); dest.writeString8(mStylusHandwritingSettingsActivityAttr); } } Loading
core/java/android/view/inputmethod/InputMethodManager.java +43 −1 Original line number Original line Diff line number Diff line Loading @@ -566,8 +566,15 @@ public final class InputMethodManager { @GuardedBy("mH") @GuardedBy("mH") private PropertyInvalidatedCache<Integer, Boolean> mStylusHandwritingAvailableCache; private PropertyInvalidatedCache<Integer, Boolean> mStylusHandwritingAvailableCache; /** Cached value for {@link #isConnectionlessStylusHandwritingAvailable} for userId. */ @GuardedBy("mH") private PropertyInvalidatedCache<Integer, Boolean> mConnectionlessStylusHandwritingAvailableCache; private static final String CACHE_KEY_STYLUS_HANDWRITING_PROPERTY = private static final String CACHE_KEY_STYLUS_HANDWRITING_PROPERTY = "cache_key.system_server.stylus_handwriting"; "cache_key.system_server.stylus_handwriting"; private static final String CACHE_KEY_CONNECTIONLESS_STYLUS_HANDWRITING_PROPERTY = "cache_key.system_server.connectionless_stylus_handwriting"; @GuardedBy("mH") @GuardedBy("mH") private int mCursorSelStart; private int mCursorSelStart; Loading Loading @@ -691,6 +698,17 @@ public final class InputMethodManager { PropertyInvalidatedCache.invalidateCache(CACHE_KEY_STYLUS_HANDWRITING_PROPERTY); PropertyInvalidatedCache.invalidateCache(CACHE_KEY_STYLUS_HANDWRITING_PROPERTY); } } /** * Calling this will invalidate the local connectionless stylus handwriting availability cache, * which forces the next query in any process to recompute the cache. * * @hide */ public static void invalidateLocalConnectionlessStylusHandwritingAvailabilityCaches() { PropertyInvalidatedCache.invalidateCache( CACHE_KEY_CONNECTIONLESS_STYLUS_HANDWRITING_PROPERTY); } private static boolean isAutofillUIShowing(View servedView) { private static boolean isAutofillUIShowing(View servedView) { AutofillManager afm = servedView.getContext().getSystemService(AutofillManager.class); AutofillManager afm = servedView.getContext().getSystemService(AutofillManager.class); return afm != null && afm.isAutofillUiShowing(); return afm != null && afm.isAutofillUiShowing(); Loading Loading @@ -1584,7 +1602,7 @@ public final class InputMethodManager { @Override @Override public Boolean recompute(Integer userId) { public Boolean recompute(Integer userId) { return IInputMethodManagerGlobalInvoker.isStylusHandwritingAvailableAsUser( return IInputMethodManagerGlobalInvoker.isStylusHandwritingAvailableAsUser( userId); userId, /* connectionless= */ false); } } }; }; } } Loading @@ -1593,6 +1611,30 @@ public final class InputMethodManager { return isAvailable; return isAvailable; } } /** * Returns {@code true} if the currently selected IME supports connectionless stylus handwriting * sessions and is enabled. */ @FlaggedApi(Flags.FLAG_CONNECTIONLESS_HANDWRITING) public boolean isConnectionlessStylusHandwritingAvailable() { if (ActivityThread.currentApplication() == null) { return false; } synchronized (mH) { if (mConnectionlessStylusHandwritingAvailableCache == null) { mConnectionlessStylusHandwritingAvailableCache = new PropertyInvalidatedCache<>( /* maxEntries= */ 4, CACHE_KEY_CONNECTIONLESS_STYLUS_HANDWRITING_PROPERTY) { @Override public Boolean recompute(@NonNull Integer userId) { return IInputMethodManagerGlobalInvoker.isStylusHandwritingAvailableAsUser( userId, /* connectionless= */ true); } }; } return mConnectionlessStylusHandwritingAvailableCache.query(UserHandle.myUserId()); } } /** /** * Returns the list of installed input methods for the specified user. * Returns the list of installed input methods for the specified user. * * Loading