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

Commit 816cb52a authored by Allen Su's avatar Allen Su Committed by Android (Google) Code Review
Browse files

Merge "Fix missing app suggested language" into main

parents aa5af41c 5a9e0661
Loading
Loading
Loading
Loading
+39 −11
Original line number Diff line number Diff line
@@ -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;

@@ -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) {
+0 −26
Original line number Diff line number Diff line
@@ -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;

@@ -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;

@@ -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.
     */
+0 −38
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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() {