summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt3
-rw-r--r--core/api/test-current.txt2
-rw-r--r--core/api/test-lint-baseline.txt2
-rw-r--r--core/java/android/view/inputmethod/InputMethodInfo.java94
-rw-r--r--core/java/android/view/inputmethod/flags.aconfig8
-rw-r--r--core/res/res/values/attrs.xml4
-rw-r--r--core/res/res/values/public-staging.xml2
-rw-r--r--core/tests/InputMethodCoreTests/src/android/view/inputmethod/InputMethodInfoTest.java3
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