From 8457cc2b438a8322f951461cbf16dae04d30e7d9 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Wed, 19 Oct 2022 15:35:45 +0800 Subject: [PATCH] Adds the new API - InputMethodSubtypeBuilder#setSubtypeNameOverride. So the IME can use it to provide display names for additional subtypes. Bug: 253531463 Test: Locally verified with Gboard. Change-Id: Ia8c5654f92519ad39b54086b093fd97cc242e0cd --- core/api/current.txt | 2 + .../view/inputmethod/InputMethodSubtype.java | 69 ++++++++++++++----- .../inputmethod/AdditionalSubtypeUtils.java | 5 ++ 3 files changed, 57 insertions(+), 19 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 74ff6726cad22..7f1d3f2a5b2ed 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -53731,6 +53731,7 @@ package android.view.inputmethod { method @NonNull public String getLanguageTag(); method @Deprecated @NonNull public String getLocale(); method public String getMode(); + method @NonNull public CharSequence getNameOverride(); method public int getNameResId(); method public boolean isAsciiCapable(); method public boolean isAuxiliary(); @@ -53751,6 +53752,7 @@ package android.view.inputmethod { method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeId(int); method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeLocale(String); method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeMode(String); + method @NonNull public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeNameOverride(@NonNull CharSequence); method public android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder setSubtypeNameResId(int); } diff --git a/core/java/android/view/inputmethod/InputMethodSubtype.java b/core/java/android/view/inputmethod/InputMethodSubtype.java index 121839bc9ea64..0b4eb403e770a 100644 --- a/core/java/android/view/inputmethod/InputMethodSubtype.java +++ b/core/java/android/view/inputmethod/InputMethodSubtype.java @@ -80,6 +80,7 @@ public final class InputMethodSubtype implements Parcelable { private final int mSubtypeHashCode; private final int mSubtypeIconResId; private final int mSubtypeNameResId; + private final CharSequence mSubtypeNameOverride; private final int mSubtypeId; private final String mSubtypeLocale; private final String mSubtypeLanguageTag; @@ -159,6 +160,21 @@ public final class InputMethodSubtype implements Parcelable { } private int mSubtypeNameResId = 0; + /** + * Sets the untranslatable name of the subtype. + * + * This string is used as the subtype's display name if subtype's name res Id is 0. + * + * @param nameOverride is the name to set. + */ + @NonNull + public InputMethodSubtypeBuilder setSubtypeNameOverride( + @NonNull CharSequence nameOverride) { + mSubtypeNameOverride = nameOverride; + return this; + } + private CharSequence mSubtypeNameOverride = ""; + /** * @param subtypeId is the unique ID for this subtype. The input method framework keeps * track of enabled subtypes by ID. When the IME package gets upgraded, enabled IDs will @@ -215,23 +231,23 @@ public final class InputMethodSubtype implements Parcelable { public InputMethodSubtype build() { return new InputMethodSubtype(this); } - } + } - private static InputMethodSubtypeBuilder getBuilder(int nameId, int iconId, String locale, - String mode, String extraValue, boolean isAuxiliary, - boolean overridesImplicitlyEnabledSubtype, int id, boolean isAsciiCapable) { - final InputMethodSubtypeBuilder builder = new InputMethodSubtypeBuilder(); - builder.mSubtypeNameResId = nameId; - builder.mSubtypeIconResId = iconId; - builder.mSubtypeLocale = locale; - builder.mSubtypeMode = mode; - builder.mSubtypeExtraValue = extraValue; - builder.mIsAuxiliary = isAuxiliary; - builder.mOverridesImplicitlyEnabledSubtype = overridesImplicitlyEnabledSubtype; - builder.mSubtypeId = id; - builder.mIsAsciiCapable = isAsciiCapable; - return builder; - } + private static InputMethodSubtypeBuilder getBuilder(int nameId, int iconId, + String locale, String mode, String extraValue, boolean isAuxiliary, + boolean overridesImplicitlyEnabledSubtype, int id, boolean isAsciiCapable) { + final InputMethodSubtypeBuilder builder = new InputMethodSubtypeBuilder(); + builder.mSubtypeNameResId = nameId; + builder.mSubtypeIconResId = iconId; + builder.mSubtypeLocale = locale; + builder.mSubtypeMode = mode; + builder.mSubtypeExtraValue = extraValue; + builder.mIsAuxiliary = isAuxiliary; + builder.mOverridesImplicitlyEnabledSubtype = overridesImplicitlyEnabledSubtype; + builder.mSubtypeId = id; + builder.mIsAsciiCapable = isAsciiCapable; + return builder; + } /** * Constructor with no subtype ID specified. @@ -291,6 +307,7 @@ public final class InputMethodSubtype implements Parcelable { */ private InputMethodSubtype(InputMethodSubtypeBuilder builder) { mSubtypeNameResId = builder.mSubtypeNameResId; + mSubtypeNameOverride = builder.mSubtypeNameOverride; mSubtypeIconResId = builder.mSubtypeIconResId; mSubtypeLocale = builder.mSubtypeLocale; mSubtypeLanguageTag = builder.mSubtypeLanguageTag; @@ -313,6 +330,8 @@ public final class InputMethodSubtype implements Parcelable { InputMethodSubtype(Parcel source) { String s; mSubtypeNameResId = source.readInt(); + CharSequence cs = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); + mSubtypeNameOverride = cs != null ? cs : ""; mSubtypeIconResId = source.readInt(); s = source.readString(); mSubtypeLocale = s != null ? s : ""; @@ -336,6 +355,14 @@ public final class InputMethodSubtype implements Parcelable { return mSubtypeNameResId; } + /** + * @return The subtype's untranslatable name string. + */ + @NonNull + public CharSequence getNameOverride() { + return mSubtypeNameOverride; + } + /** * @return Resource ID of the subtype icon drawable. */ @@ -459,8 +486,11 @@ public final class InputMethodSubtype implements Parcelable { public CharSequence getDisplayName( Context context, String packageName, ApplicationInfo appInfo) { if (mSubtypeNameResId == 0) { - return getLocaleDisplayName(getLocaleFromContext(context), getLocaleObject(), - DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU); + return TextUtils.isEmpty(mSubtypeNameOverride) + ? getLocaleDisplayName( + getLocaleFromContext(context), getLocaleObject(), + DisplayContext.CAPITALIZATION_FOR_UI_LIST_OR_MENU) + : mSubtypeNameOverride; } final CharSequence subtypeName = context.getPackageManager().getText( @@ -625,6 +655,7 @@ public final class InputMethodSubtype implements Parcelable { @Override public void writeToParcel(Parcel dest, int parcelableFlags) { dest.writeInt(mSubtypeNameResId); + TextUtils.writeToParcel(mSubtypeNameOverride, dest, parcelableFlags); dest.writeInt(mSubtypeIconResId); dest.writeString(mSubtypeLocale); dest.writeString(mSubtypeLanguageTag); @@ -692,4 +723,4 @@ public final class InputMethodSubtype implements Parcelable { } return sortedList; } -} \ No newline at end of file +} diff --git a/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java b/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java index 816d08af28142..03da83dec01ae 100644 --- a/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java +++ b/services/core/java/com/android/server/inputmethod/AdditionalSubtypeUtils.java @@ -57,6 +57,7 @@ final class AdditionalSubtypeUtils { private static final String NODE_IMI = "imi"; private static final String ATTR_ID = "id"; private static final String ATTR_LABEL = "label"; + private static final String ATTR_NAME_OVERRIDE = "nameOverride"; private static final String ATTR_ICON = "icon"; private static final String ATTR_IME_SUBTYPE_ID = "subtypeId"; private static final String ATTR_IME_SUBTYPE_LOCALE = "imeSubtypeLocale"; @@ -160,6 +161,7 @@ final class AdditionalSubtypeUtils { } out.attributeInt(null, ATTR_ICON, subtype.getIconResId()); out.attributeInt(null, ATTR_LABEL, subtype.getNameResId()); + out.attribute(null, ATTR_NAME_OVERRIDE, subtype.getNameOverride().toString()); out.attribute(null, ATTR_IME_SUBTYPE_LOCALE, subtype.getLocale()); out.attribute(null, ATTR_IME_SUBTYPE_LANGUAGE_TAG, subtype.getLanguageTag()); @@ -242,6 +244,8 @@ final class AdditionalSubtypeUtils { } final int icon = parser.getAttributeInt(null, ATTR_ICON); final int label = parser.getAttributeInt(null, ATTR_LABEL); + final String untranslatableName = parser.getAttributeValue(null, + ATTR_NAME_OVERRIDE); final String imeSubtypeLocale = parser.getAttributeValue(null, ATTR_IME_SUBTYPE_LOCALE); final String languageTag = @@ -257,6 +261,7 @@ final class AdditionalSubtypeUtils { final InputMethodSubtype.InputMethodSubtypeBuilder builder = new InputMethodSubtype.InputMethodSubtypeBuilder() .setSubtypeNameResId(label) + .setSubtypeNameOverride(untranslatableName) .setSubtypeIconResId(icon) .setSubtypeLocale(imeSubtypeLocale) .setLanguageTag(languageTag)