diff options
| -rw-r--r-- | core/api/current.txt | 3 | ||||
| -rw-r--r-- | core/api/test-current.txt | 2 | ||||
| -rw-r--r-- | core/api/test-lint-baseline.txt | 2 | ||||
| -rw-r--r-- | core/java/android/view/inputmethod/InputMethodInfo.java | 94 | ||||
| -rw-r--r-- | core/java/android/view/inputmethod/flags.aconfig | 8 | ||||
| -rw-r--r-- | core/res/res/values/attrs.xml | 4 | ||||
| -rw-r--r-- | core/res/res/values/public-staging.xml | 2 | ||||
| -rw-r--r-- | core/tests/InputMethodCoreTests/src/android/view/inputmethod/InputMethodInfoTest.java | 3 |
8 files changed, 101 insertions, 17 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index bfa486b4eda4..00316291efea 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -1052,6 +1052,7 @@ package android { field public static final int label = 16842753; // 0x1010001 field public static final int labelFor = 16843718; // 0x10103c6 field @Deprecated public static final int labelTextSize = 16843317; // 0x1010235 + field @FlaggedApi("android.view.inputmethod.ime_switcher_revamp") public static final int languageSettingsActivity; field public static final int languageTag = 16844040; // 0x1010508 field public static final int largeHeap = 16843610; // 0x101035a field public static final int largeScreens = 16843398; // 0x1010286 @@ -55841,6 +55842,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 @FlaggedApi("android.view.inputmethod.ime_switcher_revamp") @Nullable public android.content.Intent createImeLanguageSettingsActivityIntent(); method @Nullable public android.content.Intent createStylusHandwritingSettingsActivityIntent(); method public int describeContents(); method public void dump(android.util.Printer, String); @@ -55860,6 +55862,7 @@ package android.view.inputmethod { method public boolean supportsStylusHandwriting(); method public boolean suppressesSpellChecker(); method public void writeToParcel(android.os.Parcel, int); + field @FlaggedApi("android.view.inputmethod.ime_switcher_revamp") public static final String ACTION_IME_LANGUAGE_SETTINGS = "android.view.inputmethod.action.IME_LANGUAGE_SETTINGS"; 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<android.view.inputmethod.InputMethodInfo> CREATOR; } diff --git a/core/api/test-current.txt b/core/api/test-current.txt index fc095d482450..288374d4cf49 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -3894,7 +3894,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, @NonNull String, boolean, @NonNull String); 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 MAX_IMES_PER_PACKAGE = 20; // 0x14 diff --git a/core/api/test-lint-baseline.txt b/core/api/test-lint-baseline.txt index b938f0ffef76..c1181f5b8233 100644 --- a/core/api/test-lint-baseline.txt +++ b/core/api/test-lint-baseline.txt @@ -2189,6 +2189,8 @@ UnflaggedApi: android.view.accessibility.AccessibilityWindowInfo#UNDEFINED_WINDO New API must be flagged with @FlaggedApi: field android.view.accessibility.AccessibilityWindowInfo.UNDEFINED_WINDOW_ID UnflaggedApi: android.view.animation.AnimationUtils#lockAnimationClock(long, long): New API must be flagged with @FlaggedApi: method android.view.animation.AnimationUtils.lockAnimationClock(long,long) +UnflaggedApi: android.view.inputmethod.InputMethodInfo#InputMethodInfo(String, String, CharSequence, String, String, boolean, String): + New API must be flagged with @FlaggedApi: constructor android.view.inputmethod.InputMethodInfo(String,String,CharSequence,String,String,boolean,String) UnflaggedApi: android.view.inputmethod.InputMethodManager#getEnabledInputMethodListAsUser(android.os.UserHandle): New API must be flagged with @FlaggedApi: method android.view.inputmethod.InputMethodManager.getEnabledInputMethodListAsUser(android.os.UserHandle) UnflaggedApi: android.view.inputmethod.InputMethodManager#getEnabledInputMethodSubtypeListAsUser(String, boolean, android.os.UserHandle): diff --git a/core/java/android/view/inputmethod/InputMethodInfo.java b/core/java/android/view/inputmethod/InputMethodInfo.java index d38a95e713b3..b60efc1ee508 100644 --- a/core/java/android/view/inputmethod/InputMethodInfo.java +++ b/core/java/android/view/inputmethod/InputMethodInfo.java @@ -81,12 +81,21 @@ public final class InputMethodInfo implements Parcelable { * {@link Intent#getAction() Intent action} for IME that * {@link #supportsStylusHandwriting() supports stylus handwriting}. * - * @see #createStylusHandwritingSettingsActivityIntent(). + * @see #createStylusHandwritingSettingsActivityIntent() */ public static final String ACTION_STYLUS_HANDWRITING_SETTINGS = "android.view.inputmethod.action.STYLUS_HANDWRITING_SETTINGS"; /** + * {@link Intent#getAction() Intent action} for the IME language settings. + * + * @see #createImeLanguageSettingsActivityIntent() + */ + @FlaggedApi(android.view.inputmethod.Flags.FLAG_IME_SWITCHER_REVAMP) + public static final String ACTION_IME_LANGUAGE_SETTINGS = + "android.view.inputmethod.action.IME_LANGUAGE_SETTINGS"; + + /** * Maximal length of a component name * @hide */ @@ -132,6 +141,13 @@ public final class InputMethodInfo implements Parcelable { final String mSettingsActivityName; /** + * The input method language settings activity's name, used to + * launch the language settings activity of this input method. + */ + @Nullable + private final String mLanguageSettingsActivityName; + + /** * The resource in the input method's .apk that holds a boolean indicating * whether it should be considered the default input method for this * system. This is a resource ID instead of the final value so that it @@ -244,6 +260,7 @@ public final class InputMethodInfo implements Parcelable { PackageManager pm = context.getPackageManager(); String settingsActivityComponent = null; + String languageSettingsActivityComponent = null; String stylusHandwritingSettingsActivity = null; boolean isVrOnly; boolean isVirtualDeviceOnly; @@ -277,9 +294,17 @@ public final class InputMethodInfo implements Parcelable { com.android.internal.R.styleable.InputMethod); settingsActivityComponent = sa.getString( com.android.internal.R.styleable.InputMethod_settingsActivity); - if ((si.name != null && si.name.length() > COMPONENT_NAME_MAX_LENGTH) || ( - settingsActivityComponent != null - && settingsActivityComponent.length() > COMPONENT_NAME_MAX_LENGTH)) { + if (Flags.imeSwitcherRevamp()) { + languageSettingsActivityComponent = sa.getString( + com.android.internal.R.styleable.InputMethod_languageSettingsActivity); + } + if ((si.name != null && si.name.length() > COMPONENT_NAME_MAX_LENGTH) + || (settingsActivityComponent != null + && settingsActivityComponent.length() + > COMPONENT_NAME_MAX_LENGTH) + || (languageSettingsActivityComponent != null + && languageSettingsActivityComponent.length() + > COMPONENT_NAME_MAX_LENGTH)) { throw new XmlPullParserException( "Activity name exceeds maximum of 1000 characters"); } @@ -382,6 +407,7 @@ public final class InputMethodInfo implements Parcelable { } mSubtypes = new InputMethodSubtypeArray(subtypes); mSettingsActivityName = settingsActivityComponent; + mLanguageSettingsActivityName = languageSettingsActivityComponent; mStylusHandwritingSettingsActivityAttr = stylusHandwritingSettingsActivity; mIsDefaultResId = isDefaultResId; mIsAuxIme = isAuxIme; @@ -401,6 +427,7 @@ public final class InputMethodInfo implements Parcelable { public InputMethodInfo(InputMethodInfo source) { mId = source.mId; mSettingsActivityName = source.mSettingsActivityName; + mLanguageSettingsActivityName = source.mLanguageSettingsActivityName; mIsDefaultResId = source.mIsDefaultResId; mIsAuxIme = source.mIsAuxIme; mSupportsSwitchingToNextInputMethod = source.mSupportsSwitchingToNextInputMethod; @@ -422,6 +449,7 @@ public final class InputMethodInfo implements Parcelable { InputMethodInfo(Parcel source) { mId = source.readString(); mSettingsActivityName = source.readString(); + mLanguageSettingsActivityName = source.readString8(); mIsDefaultResId = source.readInt(); mIsAuxIme = source.readInt() == 1; mSupportsSwitchingToNextInputMethod = source.readInt() == 1; @@ -445,8 +473,9 @@ public final class InputMethodInfo implements Parcelable { public InputMethodInfo(String packageName, String className, CharSequence label, String settingsActivity) { this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, - settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, - false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, + settingsActivity, null /* languageSettingsActivity */, null /* subtypes */, + 0 /* isDefaultResId */, false /* forceDefault */, + true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, @@ -461,11 +490,12 @@ public final class InputMethodInfo implements Parcelable { @TestApi public InputMethodInfo(@NonNull String packageName, @NonNull String className, @NonNull CharSequence label, @NonNull String settingsActivity, - boolean supportStylusHandwriting, + @NonNull String languageSettingsActivity, boolean supportStylusHandwriting, @NonNull String stylusHandwritingSettingsActivityAttr) { this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, - settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, - false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, + settingsActivity, languageSettingsActivity, null /* subtypes */, + 0 /* isDefaultResId */, false /* forceDefault */, + true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, supportStylusHandwriting, stylusHandwritingSettingsActivityAttr, @@ -481,8 +511,9 @@ public final class InputMethodInfo implements Parcelable { @NonNull CharSequence label, @NonNull String settingsActivity, int handledConfigChanges) { this(buildFakeResolveInfo(packageName, className, label), false /* isAuxIme */, - settingsActivity, null /* subtypes */, 0 /* isDefaultResId */, - false /* forceDefault */, true /* supportsSwitchingToNextInputMethod */, + settingsActivity, null /* languageSettingsActivity */, null /* subtypes */, + 0 /* isDefaultResId */, false /* forceDefault */, + true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, handledConfigChanges, false /* supportsStylusHandwriting */, @@ -497,7 +528,8 @@ public final class InputMethodInfo implements Parcelable { public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity, List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault) { - this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault, + this(ri, isAuxIme, settingsActivity, null /* languageSettingsActivity */, subtypes, + isDefaultResId, forceDefault, true /* supportsSwitchingToNextInputMethod */, false /* inlineSuggestionsEnabled */, false /* isVrOnly */, false /* isVirtualDeviceOnly */, 0 /* handledconfigChanges */, false /* supportsStylusHandwriting */, @@ -512,7 +544,8 @@ public final class InputMethodInfo implements Parcelable { public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity, List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault, boolean supportsSwitchingToNextInputMethod, boolean isVrOnly) { - this(ri, isAuxIme, settingsActivity, subtypes, isDefaultResId, forceDefault, + this(ri, isAuxIme, settingsActivity, null /* languageSettingsActivity */, subtypes, + isDefaultResId, forceDefault, supportsSwitchingToNextInputMethod, false /* inlineSuggestionsEnabled */, isVrOnly, false /* isVirtualDeviceOnly */, 0 /* handledConfigChanges */, false /* supportsStylusHandwriting */, @@ -525,7 +558,8 @@ public final class InputMethodInfo implements Parcelable { * @hide */ public InputMethodInfo(ResolveInfo ri, boolean isAuxIme, String settingsActivity, - List<InputMethodSubtype> subtypes, int isDefaultResId, boolean forceDefault, + @Nullable String languageSettingsActivity, List<InputMethodSubtype> subtypes, + int isDefaultResId, boolean forceDefault, boolean supportsSwitchingToNextInputMethod, boolean inlineSuggestionsEnabled, boolean isVrOnly, boolean isVirtualDeviceOnly, int handledConfigChanges, boolean supportsStylusHandwriting, String stylusHandwritingSettingsActivityAttr, @@ -534,6 +568,7 @@ public final class InputMethodInfo implements Parcelable { mService = ri; mId = new ComponentName(si.packageName, si.name).flattenToShortString(); mSettingsActivityName = settingsActivity; + mLanguageSettingsActivityName = languageSettingsActivity; mIsDefaultResId = isDefaultResId; mIsAuxIme = isAuxIme; mSubtypes = new InputMethodSubtypeArray(subtypes); @@ -756,9 +791,34 @@ public final class InputMethodInfo implements Parcelable { mStylusHandwritingSettingsActivityAttr)); } + /** + * Returns {@link Intent} for IME language settings activity with + * {@link Intent#getAction() Intent action} {@link #ACTION_IME_LANGUAGE_SETTINGS}, + * else <code>null</code> if + * {@link android.R.styleable#InputMethod_languageSettingsActivity} is not defined. + * + * <p>To launch IME language settings, use this method to get the {@link Intent} to launch + * the IME language settings activity.</p> + * <p>e.g.<pre><code>startActivity(createImeLanguageSettingsActivityIntent());</code></pre></p> + * + * @attr ref R.styleable#InputMethod_languageSettingsActivity + */ + @FlaggedApi(android.view.inputmethod.Flags.FLAG_IME_SWITCHER_REVAMP) + @Nullable + public Intent createImeLanguageSettingsActivityIntent() { + if (TextUtils.isEmpty(mLanguageSettingsActivityName)) { + return null; + } + return new Intent(ACTION_IME_LANGUAGE_SETTINGS).setComponent( + new ComponentName(getServiceInfo().packageName, + mLanguageSettingsActivityName) + ); + } + public void dump(Printer pw, String prefix) { pw.println(prefix + "mId=" + mId + " mSettingsActivityName=" + mSettingsActivityName + + " mLanguageSettingsActivityName=" + mLanguageSettingsActivityName + " mIsVrOnly=" + mIsVrOnly + " mIsVirtualDeviceOnly=" + mIsVirtualDeviceOnly + " mSupportsSwitchingToNextInputMethod=" + mSupportsSwitchingToNextInputMethod @@ -779,8 +839,9 @@ public final class InputMethodInfo implements Parcelable { @Override public String toString() { return "InputMethodInfo{" + mId - + ", settings: " - + mSettingsActivityName + "}"; + + ", settings: " + mSettingsActivityName + + ", languageSettings: " + mLanguageSettingsActivityName + + "}"; } /** @@ -872,6 +933,7 @@ public final class InputMethodInfo implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeString(mId); dest.writeString(mSettingsActivityName); + dest.writeString8(mLanguageSettingsActivityName); dest.writeInt(mIsDefaultResId); dest.writeInt(mIsAuxIme ? 1 : 0); dest.writeInt(mSupportsSwitchingToNextInputMethod ? 1 : 0); diff --git a/core/java/android/view/inputmethod/flags.aconfig b/core/java/android/view/inputmethod/flags.aconfig index ccc5dbb2f580..7f1cc8e46d3c 100644 --- a/core/java/android/view/inputmethod/flags.aconfig +++ b/core/java/android/view/inputmethod/flags.aconfig @@ -54,3 +54,11 @@ flag { bug: "293640003" is_fixed_read_only: true } + +flag { + name: "ime_switcher_revamp" + namespace: "input_method" + description: "Feature flag for revamping the Input Method Switcher menu" + bug: "311791923" + is_fixed_read_only: true +} diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 908eeeb9d7fd..45861a3e8893 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3893,6 +3893,10 @@ <!-- Component name of an activity that allows the user to modify the settings for this service. --> <attr name="settingsActivity" format="string" /> + <!-- Component name of an activity that allows the user to modify + on-screen keyboards variants (e.g. different language or layout) for this service. --> + <!-- @FlaggedApi("android.view.inputmethod.ime_switcher_revamp") --> + <attr name="languageSettingsActivity" format="string"/> <!-- Set to true in all of the configurations for which this input method should be considered an option as the default. --> <attr name="isDefault" format="boolean" /> diff --git a/core/res/res/values/public-staging.xml b/core/res/res/values/public-staging.xml index f9cf28c1cd04..0a6779a9bd8b 100644 --- a/core/res/res/values/public-staging.xml +++ b/core/res/res/values/public-staging.xml @@ -151,6 +151,8 @@ <public name="windowOptOutEdgeToEdgeEnforcement"/> <!-- @FlaggedApi("android.security.content_uri_permission_apis") --> <public name="requireContentUriPermissionFromCaller" /> + <!-- @FlaggedApi("android.view.inputmethod.ime_switcher_revamp") --> + <public name="languageSettingsActivity"/> </staging-public-group> <staging-public-group type="id" first-id="0x01bc0000"> diff --git a/core/tests/InputMethodCoreTests/src/android/view/inputmethod/InputMethodInfoTest.java b/core/tests/InputMethodCoreTests/src/android/view/inputmethod/InputMethodInfoTest.java index a3f537ef5f1c..36ab0d4b0868 100644 --- a/core/tests/InputMethodCoreTests/src/android/view/inputmethod/InputMethodInfoTest.java +++ b/core/tests/InputMethodCoreTests/src/android/view/inputmethod/InputMethodInfoTest.java @@ -70,6 +70,9 @@ public class InputMethodInfoTest { assertThat(imi.supportsInlineSuggestionsWithTouchExploration(), is(false)); assertThat(imi.supportsStylusHandwriting(), is(false)); assertThat(imi.createStylusHandwritingSettingsActivityIntent(), equalTo(null)); + if (Flags.imeSwitcherRevamp()) { + assertThat(imi.createImeLanguageSettingsActivityIntent(), equalTo(null)); + } } @Test |