Loading core/java/com/android/internal/app/AppLocaleCollector.java +39 −11 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.provider.Settings; import android.util.Log; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -95,24 +96,51 @@ public class AppLocaleCollector implements LocaleCollectorBase { */ @VisibleForTesting public Set<LocaleStore.LocaleInfo> getActiveImeLocales() { Set<LocaleStore.LocaleInfo> activeImeLocales = null; InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); if (imm != null) { InputMethodInfo activeIme = getActiveIme(imm); if (activeIme != null) { activeImeLocales = LocaleStore.transformImeLanguageTagToLocaleInfo( imm.getEnabledInputMethodSubtypeList(activeIme, true)); List<InputMethodSubtype> list = imm.getEnabledInputMethodSubtypeList(activeIme, true); Set<Locale> localeSet = new HashSet<>(); for (InputMethodSubtype subtype : list) { Locale locale = Locale.forLanguageTag(subtype.getLanguageTag()); if (locale.getCountry().length() > 0) { localeSet.add(locale); } } return addScript(localeSet); } } if (activeImeLocales == null) { return Set.of(); } else { return activeImeLocales.stream().filter( // For the locale to be added into the suggestion area, its country could not be // empty. info -> info.getLocale().getCountry().length() > 0).collect( Collectors.toSet()); } private Set<LocaleStore.LocaleInfo> addScript(Set<Locale> localeSet) { HashSet<LocaleStore.LocaleInfo> result = new HashSet<>(); String[] localeArr = LocalePicker.getSupportedLocales(mContext); Locale systemLocale; for (String localeId : localeArr) { systemLocale = Locale.forLanguageTag(localeId); for (Locale locale : localeSet) { if (locale.equals(systemLocale) || shouldAddScript(systemLocale, locale)) { LocaleStore.LocaleInfo infoWithImeExtension = LocaleStore.getLocaleInfo( systemLocale); infoWithImeExtension.extendSuggestionOfType( LocaleStore.LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE); result.add(infoWithImeExtension); break; } } } return result; } private boolean shouldAddScript(Locale supported, Locale desired) { return supported.getLanguage().equals(desired.getLanguage()) && supported.getCountry().equals(desired.getCountry()) && !supported.getScript().isEmpty() && desired.getScript().isEmpty(); } private InputMethodInfo getActiveIme(InputMethodManager imm) { Loading core/java/com/android/internal/app/LocaleStore.java +0 −26 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.view.inputmethod.InputMethodSubtype; import com.android.internal.annotations.VisibleForTesting; Loading @@ -36,7 +35,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.IllformedLocaleException; import java.util.List; import java.util.Locale; import java.util.Set; Loading Loading @@ -395,30 +393,6 @@ public class LocaleStore { return null; } /** * Transform IME's language tag to LocaleInfo. * * @param list A list which includes IME's subtype. * @return A LocaleInfo set which includes IME's language tags. */ public static Set<LocaleInfo> transformImeLanguageTagToLocaleInfo( List<InputMethodSubtype> list) { Set<LocaleInfo> imeLocales = new HashSet<>(); Set<String> languageTagSet = new HashSet<>(); for (InputMethodSubtype subtype : list) { String languageTag = subtype.getLanguageTag(); if (!languageTagSet.contains(languageTag)) { languageTagSet.add(languageTag); Locale locale = Locale.forLanguageTag(languageTag); LocaleInfo cacheInfo = getLocaleInfo(locale, sLocaleCache); LocaleInfo localeInfo = new LocaleInfo(cacheInfo); localeInfo.mSuggestionFlags |= LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE; imeLocales.add(localeInfo); } } return imeLocales; } /** * Returns a list of system locale that removes all extensions except for the numbering system. */ Loading tests/Internal/src/com/android/internal/app/LocaleStoreTest.java +0 −38 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.os.LocaleList; import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; Loading @@ -37,7 +35,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.IllformedLocaleException; import java.util.List; import java.util.Locale; import java.util.Set; Loading @@ -45,41 +42,6 @@ import java.util.Set; @SmallTest @RunWith(AndroidJUnit4.class) public class LocaleStoreTest { @Test public void testTransformImeLanguageTagToLocaleInfo() { List<InputMethodSubtype> list = List.of( new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("zh-TW").build(), new InputMethodSubtypeBuilder().setLanguageTag("ja-JP").build()); Set<LocaleInfo> localeSet = LocaleStore.transformImeLanguageTagToLocaleInfo(list); Set<String> expectedLanguageTag = Set.of("en-US", "zh-TW", "ja-JP"); assertEquals(localeSet.size(), expectedLanguageTag.size()); for (LocaleInfo info : localeSet) { assertEquals(info.mSuggestionFlags, LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE); assertTrue(expectedLanguageTag.contains(info.getId())); } } @Test public void testTransformImeLanguageTagToLocaleInfo_duplicateTagFilter() { List<InputMethodSubtype> list = List.of( new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("zh-TW").build(), new InputMethodSubtypeBuilder().setLanguageTag("ja-JP").build()); Set<LocaleInfo> localeSet = LocaleStore.transformImeLanguageTagToLocaleInfo(list); Set<String> expectedLanguageTag = Set.of("en-US", "zh-TW", "ja-JP"); assertEquals(localeSet.size(), expectedLanguageTag.size()); for (LocaleInfo info : localeSet) { assertEquals(info.mSuggestionFlags, LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE); assertTrue(expectedLanguageTag.contains(info.getId())); } } @Test public void convertExplicitLocales_noExplicitLcoales_returnEmptyHashMap() { Loading Loading
core/java/com/android/internal/app/AppLocaleCollector.java +39 −11 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.provider.Settings; import android.util.Log; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -95,24 +96,51 @@ public class AppLocaleCollector implements LocaleCollectorBase { */ @VisibleForTesting public Set<LocaleStore.LocaleInfo> getActiveImeLocales() { Set<LocaleStore.LocaleInfo> activeImeLocales = null; InputMethodManager imm = mContext.getSystemService(InputMethodManager.class); if (imm != null) { InputMethodInfo activeIme = getActiveIme(imm); if (activeIme != null) { activeImeLocales = LocaleStore.transformImeLanguageTagToLocaleInfo( imm.getEnabledInputMethodSubtypeList(activeIme, true)); List<InputMethodSubtype> list = imm.getEnabledInputMethodSubtypeList(activeIme, true); Set<Locale> localeSet = new HashSet<>(); for (InputMethodSubtype subtype : list) { Locale locale = Locale.forLanguageTag(subtype.getLanguageTag()); if (locale.getCountry().length() > 0) { localeSet.add(locale); } } return addScript(localeSet); } } if (activeImeLocales == null) { return Set.of(); } else { return activeImeLocales.stream().filter( // For the locale to be added into the suggestion area, its country could not be // empty. info -> info.getLocale().getCountry().length() > 0).collect( Collectors.toSet()); } private Set<LocaleStore.LocaleInfo> addScript(Set<Locale> localeSet) { HashSet<LocaleStore.LocaleInfo> result = new HashSet<>(); String[] localeArr = LocalePicker.getSupportedLocales(mContext); Locale systemLocale; for (String localeId : localeArr) { systemLocale = Locale.forLanguageTag(localeId); for (Locale locale : localeSet) { if (locale.equals(systemLocale) || shouldAddScript(systemLocale, locale)) { LocaleStore.LocaleInfo infoWithImeExtension = LocaleStore.getLocaleInfo( systemLocale); infoWithImeExtension.extendSuggestionOfType( LocaleStore.LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE); result.add(infoWithImeExtension); break; } } } return result; } private boolean shouldAddScript(Locale supported, Locale desired) { return supported.getLanguage().equals(desired.getLanguage()) && supported.getCountry().equals(desired.getCountry()) && !supported.getScript().isEmpty() && desired.getScript().isEmpty(); } private InputMethodInfo getActiveIme(InputMethodManager imm) { Loading
core/java/com/android/internal/app/LocaleStore.java +0 −26 Original line number Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.view.inputmethod.InputMethodSubtype; import com.android.internal.annotations.VisibleForTesting; Loading @@ -36,7 +35,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.IllformedLocaleException; import java.util.List; import java.util.Locale; import java.util.Set; Loading Loading @@ -395,30 +393,6 @@ public class LocaleStore { return null; } /** * Transform IME's language tag to LocaleInfo. * * @param list A list which includes IME's subtype. * @return A LocaleInfo set which includes IME's language tags. */ public static Set<LocaleInfo> transformImeLanguageTagToLocaleInfo( List<InputMethodSubtype> list) { Set<LocaleInfo> imeLocales = new HashSet<>(); Set<String> languageTagSet = new HashSet<>(); for (InputMethodSubtype subtype : list) { String languageTag = subtype.getLanguageTag(); if (!languageTagSet.contains(languageTag)) { languageTagSet.add(languageTag); Locale locale = Locale.forLanguageTag(languageTag); LocaleInfo cacheInfo = getLocaleInfo(locale, sLocaleCache); LocaleInfo localeInfo = new LocaleInfo(cacheInfo); localeInfo.mSuggestionFlags |= LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE; imeLocales.add(localeInfo); } } return imeLocales; } /** * Returns a list of system locale that removes all extensions except for the numbering system. */ Loading
tests/Internal/src/com/android/internal/app/LocaleStoreTest.java +0 −38 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.os.LocaleList; import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype.InputMethodSubtypeBuilder; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; Loading @@ -37,7 +35,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.IllformedLocaleException; import java.util.List; import java.util.Locale; import java.util.Set; Loading @@ -45,41 +42,6 @@ import java.util.Set; @SmallTest @RunWith(AndroidJUnit4.class) public class LocaleStoreTest { @Test public void testTransformImeLanguageTagToLocaleInfo() { List<InputMethodSubtype> list = List.of( new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("zh-TW").build(), new InputMethodSubtypeBuilder().setLanguageTag("ja-JP").build()); Set<LocaleInfo> localeSet = LocaleStore.transformImeLanguageTagToLocaleInfo(list); Set<String> expectedLanguageTag = Set.of("en-US", "zh-TW", "ja-JP"); assertEquals(localeSet.size(), expectedLanguageTag.size()); for (LocaleInfo info : localeSet) { assertEquals(info.mSuggestionFlags, LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE); assertTrue(expectedLanguageTag.contains(info.getId())); } } @Test public void testTransformImeLanguageTagToLocaleInfo_duplicateTagFilter() { List<InputMethodSubtype> list = List.of( new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("en-US").build(), new InputMethodSubtypeBuilder().setLanguageTag("zh-TW").build(), new InputMethodSubtypeBuilder().setLanguageTag("ja-JP").build()); Set<LocaleInfo> localeSet = LocaleStore.transformImeLanguageTagToLocaleInfo(list); Set<String> expectedLanguageTag = Set.of("en-US", "zh-TW", "ja-JP"); assertEquals(localeSet.size(), expectedLanguageTag.size()); for (LocaleInfo info : localeSet) { assertEquals(info.mSuggestionFlags, LocaleInfo.SUGGESTION_TYPE_IME_LANGUAGE); assertTrue(expectedLanguageTag.contains(info.getId())); } } @Test public void convertExplicitLocales_noExplicitLcoales_returnEmptyHashMap() { Loading