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

Commit 5a9e0661 authored by Allen Su's avatar Allen Su
Browse files

Fix missing app suggested language

Bug: 419223422
Test: atest AppLocaleCollectorTest
Flag: EXEMPT bug fix
Change-Id: I958c797b494b72a8460beff92fe5e84abfdedecd
parent 30596bb8
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() {