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

Commit 48a7a645 authored by Cosmin Băieș's avatar Cosmin Băieș
Browse files

API for IME language settings activity

Introduce a new attribute for InputMethodInfo to define an activity
for IME language settings. This activity allows users to modify the
languages (or keyboard layouts) of the IME.

Test: atest
  InputMethodInfoTest#testEquals
  InputMethodInfoTest#testInputMethodInfoProperties
  InputMethodInfoTest#testInputMethodInfoWriteToParcel
Bug: 311791923
Flag: android.view.inputmethod.ime_switcher_revamp
Change-Id: I18e7c5dc5271bee44e4540b3070b989df4e27c4c
parent f12aa38b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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;
  }
+1 −1
Original line number Diff line number Diff line
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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):
+78 −16
Original line number Diff line number Diff line
@@ -81,11 +81,20 @@ 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
@@ -131,6 +140,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
@@ -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);
+8 −0
Original line number Diff line number Diff line
@@ -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
}
Loading