From 8d6eeb01df72891acd3aa75e64aa1595a41cc96e Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Thu, 3 Dec 2015 11:27:32 -0800 Subject: [PATCH] Introduce EditorInfo#locales. The primary goal of this CL is to enable application developers to provide more context-based language (locale) information for IME developers so that users can be benefited by more natural text input experience. As of API Level 23, there are several APIs that allow IMEs to retrieve locale/country related information. - Locale#getDefault() - Configuration#locale - LocaleSpan#getLocale() - SubscriptionInfo#getCountryIso() However, only LocaleSpan#getLocale() can be used to pass application specific languge (locale) context from applications to IMEs. Also LocaleSpan is not designed to be used per input-context. We want to have something in EditorInfo and LocaleList would be the right thing. Although default implementation of TextView#onCreateInputConnection() starts filling EditorInfo#localeList with TextView#getTextLocales() by this CL, application developers are encouraged to provide its own LocaleList when they are confident that the user want to use a certain (set) of language(s). For instance, a chat application may be able to guess what language will be used in the conversation before the user start typing. At least it should be able to remember the last used language for each conversation. Another instance would be "From" and "To" EditText fields in a translation app. Those fields should have different LocaleList based on the languages that the user want to translate from and to. Bug: 22859862 Change-Id: I77db5b99a7cf745d800db75baf135bb60ad04820 --- api/current.txt | 1 + api/system-current.txt | 1 + api/test-current.txt | 1 + .../android/view/inputmethod/EditorInfo.java | 20 +++++++++++++++++++ core/java/android/widget/TextView.java | 3 +++ 5 files changed, 26 insertions(+) diff --git a/api/current.txt b/api/current.txt index f1e1e3c27490f..34a0d46a4ef99 100644 --- a/api/current.txt +++ b/api/current.txt @@ -42909,6 +42909,7 @@ package android.view.inputmethod { field public int initialSelStart; field public int inputType; field public java.lang.CharSequence label; + field public android.util.LocaleList locales; field public java.lang.String packageName; field public java.lang.String privateImeOptions; } diff --git a/api/system-current.txt b/api/system-current.txt index dfd56b41703ba..f509b0571a0ca 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -45237,6 +45237,7 @@ package android.view.inputmethod { field public int initialSelStart; field public int inputType; field public java.lang.CharSequence label; + field public android.util.LocaleList locales; field public java.lang.String packageName; field public java.lang.String privateImeOptions; } diff --git a/api/test-current.txt b/api/test-current.txt index b64928a0c17a0..299b38a5c1814 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -42911,6 +42911,7 @@ package android.view.inputmethod { field public int initialSelStart; field public int inputType; field public java.lang.CharSequence label; + field public android.util.LocaleList locales; field public java.lang.String packageName; field public java.lang.String privateImeOptions; } diff --git a/core/java/android/view/inputmethod/EditorInfo.java b/core/java/android/view/inputmethod/EditorInfo.java index 6130fd58ac9ad..3ff95228f15e9 100644 --- a/core/java/android/view/inputmethod/EditorInfo.java +++ b/core/java/android/view/inputmethod/EditorInfo.java @@ -21,6 +21,7 @@ import android.os.Parcelable; import android.text.InputType; import android.text.TextUtils; +import android.util.LocaleList; import android.util.Printer; /** @@ -339,6 +340,22 @@ public class EditorInfo implements InputType, Parcelable { */ public Bundle extras; + /** + * Additional context information that tells what languages are expected by the user. + * + *

IME authors: Possible use cases for IME developers would be:

+ * + * + *

Editor authors: Providing this context information can help IMEs to + * improve text input experience. For example, chat applications can remember what language is + * used in the last conversation for each chat session, and put the last used language at the + * top of {@link #locales}.

+ */ + public LocaleList locales = LocaleList.getEmptyLocaleList(); + /** * Ensure that the data in this EditorInfo is compatible with an application * that was developed against the given target API version. This can @@ -393,6 +410,7 @@ public void dump(Printer pw, String prefix) { + " fieldId=" + fieldId + " fieldName=" + fieldName); pw.println(prefix + "extras=" + extras); + pw.println(prefix + "locales=" + locales); } /** @@ -416,6 +434,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(fieldId); dest.writeString(fieldName); dest.writeBundle(extras); + locales.writeToParcel(dest, flags); } /** @@ -439,6 +458,7 @@ public EditorInfo createFromParcel(Parcel source) { res.fieldId = source.readInt(); res.fieldName = source.readString(); res.extras = source.readBundle(); + res.locales = LocaleList.CREATOR.createFromParcel(source); return res; } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index d666939ba5a04..cca84ee707d55 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6439,6 +6439,9 @@ public InputConnection onCreateInputConnection(EditorInfo outAttrs) { outAttrs.initialCapsMode = ic.getCursorCapsMode(getInputType()); return ic; } + // LocaleList is designed to be immutable. This is theoretically equivalent to copy + // the snapshot of the current text locales. + outAttrs.locales = getTextLocales(); } return null; }