Merge "Convert subtypes whose locale is "tl" to "fil"." into mnc-dev
diff --git a/core/java/android/view/inputmethod/InputMethodSubtype.java b/core/java/android/view/inputmethod/InputMethodSubtype.java
index c2f3777..4ee155c 100644
--- a/core/java/android/view/inputmethod/InputMethodSubtype.java
+++ b/core/java/android/view/inputmethod/InputMethodSubtype.java
@@ -16,6 +16,7 @@
 
 package android.view.inputmethod;
 
+import android.annotation.Nullable;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.os.Parcel;
@@ -323,6 +324,19 @@
     }
 
     /**
+     * @return The normalized {@link Locale} object of the subtype. The returned locale may or may
+     * not equal to "locale" string parameter passed to the constructor.
+     *
+     * <p>TODO: Consider to make this a public API.</p>
+     * @hide
+     */
+    @Nullable
+    public Locale getLocaleObject() {
+        // TODO: Move the following method from InputMethodUtils to InputMethodSubtype.
+        return InputMethodUtils.constructLocaleFromString(mSubtypeLocale);
+    }
+
+    /**
      * @return The mode of the subtype.
      */
     public String getMode() {
@@ -381,7 +395,7 @@
      */
     public CharSequence getDisplayName(
             Context context, String packageName, ApplicationInfo appInfo) {
-        final Locale locale = InputMethodUtils.constructLocaleFromString(mSubtypeLocale);
+        final Locale locale = getLocaleObject();
         final String localeStr = locale != null ? locale.getDisplayName() : mSubtypeLocale;
         if (mSubtypeNameResId == 0) {
             return localeStr;
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index 06bdb24..042db71 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -379,6 +379,14 @@
         // The length of localeStr is guaranteed to always return a 1 <= value <= 3
         // because localeStr is not empty.
         if (localeParams.length == 1) {
+            if (localeParams.length >= 1 && "tl".equals(localeParams[0])) {
+                // Convert a locale whose language is "tl" to one whose language is "fil".
+                // For example, "tl_PH" will get converted to "fil_PH".
+                // Versions of Android earlier than Lollipop did not support three letter language
+                // codes, and used "tl" (Tagalog) as the language string for "fil" (Filipino).
+                // On Lollipop and above, the current three letter version must be used.
+                localeParams[0] = "fil";
+            }
             return new Locale(localeParams[0]);
         } else if (localeParams.length == 2) {
             return new Locale(localeParams[0], localeParams[1]);
@@ -397,7 +405,7 @@
         for (int i = 0; i < N; ++i) {
             final InputMethodSubtype subtype = imi.getSubtypeAt(i);
             if (checkCountry) {
-                final Locale subtypeLocale = constructLocaleFromString(subtype.getLocale());
+                final Locale subtypeLocale = subtype.getLocaleObject();
                 if (subtypeLocale == null ||
                         !TextUtils.equals(subtypeLocale.getLanguage(), locale.getLanguage()) ||
                         !TextUtils.equals(subtypeLocale.getCountry(), locale.getCountry())) {
diff --git a/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeTest.java b/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeTest.java
index 323a360..8feac9b 100644
--- a/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeTest.java
+++ b/core/tests/inputmethodtests/src/android/os/InputMethodSubtypeTest.java
@@ -56,6 +56,10 @@
         verifyLocale("zz");
         verifyLocale("iw");
         verifyLocale("he");
+        verifyLocale("tl");
+        verifyLocale("tl_PH");
+        verifyLocale("fil");
+        verifyLocale("fil_PH");
     }
 
     @SmallTest