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

Commit c73eaaa7 authored by Allen Su's avatar Allen Su
Browse files

Fix incorrect suggested language

System languages in the app's suggested regsion have to filter out
those not supported by the application.

Bug: 282192969
Test: atest AppLocaleCollectorTest
Change-Id: I8bbc6c8682d7e016baee2ab19396607b84062da8
parent 6b3ebf82
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -157,13 +157,13 @@ public class AppLocaleCollector implements LocalePickerWithRegion.LocaleCollecto
     * Get a list of system locale that removes all extensions except for the numbering system.
     */
    @VisibleForTesting
    public List<LocaleStore.LocaleInfo> getSystemCurrentLocales() {
        List<LocaleStore.LocaleInfo> sysLocales = LocaleStore.getSystemCurrentLocales();
    public Set<LocaleStore.LocaleInfo> getSystemCurrentLocales() {
        Set<LocaleStore.LocaleInfo> sysLocales = LocaleStore.getSystemCurrentLocales();
        return sysLocales.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.toList());
                Collectors.toSet());
    }

    @Override
@@ -225,7 +225,10 @@ public class AppLocaleCollector implements LocalePickerWithRegion.LocaleCollecto
        // Add current system language into suggestion list
        if (!isForCountryMode) {
            boolean isCurrentLocale, existsInApp, existsInIme;
            for (LocaleStore.LocaleInfo localeInfo : getSystemCurrentLocales()) {
            // filter out the system locases that are supported by the application.
            Set<LocaleStore.LocaleInfo> localeInfoSet =
                    filterSupportedLocales(getSystemCurrentLocales(), result.mAppSupportedLocales);
            for (LocaleStore.LocaleInfo localeInfo : localeInfoSet) {
                isCurrentLocale = mAppCurrentLocale != null
                        && localeInfo.getLocale().equals(mAppCurrentLocale.getLocale());
                // Add the system suggestion flag if the localeInfo exists in mAllAppActiveLocales
+2 −3
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import com.android.internal.annotations.VisibleForTesting;
import java.io.Serializable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -404,8 +403,8 @@ public class LocaleStore {
    /**
     * Returns a list of system locale that removes all extensions except for the numbering system.
     */
    public static List<LocaleInfo> getSystemCurrentLocales() {
        List<LocaleInfo> localeList = new ArrayList<>();
    public static Set<LocaleInfo> getSystemCurrentLocales() {
        Set<LocaleInfo> localeList = new HashSet<>();
        LocaleList systemLangList = LocaleList.getDefault();
        for(int i = 0; i < systemLangList.size(); i++) {
            Locale sysLocale = getLocaleWithOnlyNumberingSystem(systemLangList.get(i));
+84 −14
Original line number Diff line number Diff line
@@ -37,9 +37,9 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;

@@ -54,7 +54,7 @@ public class AppLocaleCollectorTest {
    private LocaleStore.LocaleInfo mAppCurrentLocale;
    private Set<LocaleInfo> mAllAppActiveLocales;
    private Set<LocaleInfo> mImeLocales;
    private List<LocaleInfo> mSystemCurrentLocales;
    private Set<LocaleInfo> mSystemCurrentLocales;
    private Set<LocaleInfo> mSystemSupportedLocales;
    private AppLocaleStore.AppLocaleResult mResult;
    private static final String PKG1 = "pkg1";
@@ -73,14 +73,6 @@ public class AppLocaleCollectorTest {
    public void setUp() throws Exception {
        mAppLocaleCollector = spy(
                new AppLocaleCollector(InstrumentationRegistry.getContext(), PKG1));

        mAppCurrentLocale = createLocaleInfo("en-US", CURRENT);
        mAllAppActiveLocales = initAllAppActivatedLocales();
        mImeLocales = initImeLocales();
        mSystemSupportedLocales = initSystemSupportedLocales();
        mSystemCurrentLocales = initSystemCurrentLocales();
        mResult = new AppLocaleStore.AppLocaleResult(GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG,
                initAppSupportedLocale());
    }

    @Test
@@ -88,7 +80,7 @@ public class AppLocaleCollectorTest {
        LocaleList.setDefault(
                LocaleList.forLanguageTags("en-US-u-mu-fahrenhe,ar-JO-u-mu-fahrenhe-nu-latn"));

        List<LocaleStore.LocaleInfo> list =
        Set<LocaleStore.LocaleInfo> list =
                mAppLocaleCollector.getSystemCurrentLocales();

        LocaleList expected = LocaleList.forLanguageTags("en-US,ar-JO-u-nu-latn");
@@ -99,7 +91,69 @@ public class AppLocaleCollectorTest {
    }

    @Test
    public void testGetSupportedLocaleList() {
    public void testGetSupportedLocaleList_filterNonAppsupportedSystemLanguage() {
        mAppCurrentLocale = createLocaleInfo("en-US", CURRENT);

        // App supports five locales
        HashSet<Locale> appSupported =
                getAppSupportedLocales(new String[] {
                        "en-US",
                        "fr",
                        "ar",
                        "es",
                        "bn"
                });
        // There are six locales in system current locales.
        mSystemCurrentLocales = getSystemCurrentLocales(new String[] {
                "en-US",
                "fr-FR",
                "ar-JO",
                "ca-AD",
                "da-DK",
                "es-US"
        });
        mAllAppActiveLocales = Collections.emptySet();
        mImeLocales = Collections.emptySet();
        mSystemSupportedLocales = Collections.emptySet();
        mResult = new AppLocaleStore.AppLocaleResult(GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG,
                appSupported);

        doReturn(mAppCurrentLocale).when(mAppLocaleCollector).getAppCurrentLocale();
        doReturn(mResult).when(mAppLocaleCollector).getAppSupportedLocales();
        doReturn(mAllAppActiveLocales).when(mAppLocaleCollector).getAllAppActiveLocales();
        doReturn(mImeLocales).when(mAppLocaleCollector).getActiveImeLocales();
        doReturn(mSystemSupportedLocales).when(mAppLocaleCollector).getSystemSupportedLocale(
                anyObject(), eq(null), eq(true));
        doReturn(mSystemCurrentLocales).when(
                mAppLocaleCollector).getSystemCurrentLocales();

        Set<LocaleInfo> result = mAppLocaleCollector.getSupportedLocaleList(null, true, false);

        // The result would show four rather than six locales in the suggested region.
        HashMap<String, Integer> expectedResult = new HashMap<>();
        expectedResult.put("en-US", CURRENT); // The locale current App activates.
        expectedResult.put("ar-JO", SYSTEM_AVAILABLE);
        expectedResult.put("fr-FR", SYSTEM_AVAILABLE);
        expectedResult.put("es-US", SYSTEM_AVAILABLE);
        expectedResult.put(createLocaleInfo("", SYSTEM).getId(), SYSTEM); // System language title

        assertEquals(result.size(), expectedResult.size());
        for (LocaleStore.LocaleInfo info: result) {
            int suggestionFlags = expectedResult.getOrDefault(info.getId(), -1);
            assertEquals(info.mSuggestionFlags, suggestionFlags);
        }
    }

    @Test
    public void testGetSupportedLocaleList_withActiveLocalesFromOtherAppAndIme() {
        mAppCurrentLocale = createLocaleInfo("en-US", CURRENT);
        mAllAppActiveLocales = initAllAppActivatedLocales();
        mImeLocales = initImeLocales();
        mSystemSupportedLocales = initSystemSupportedLocales();
        mSystemCurrentLocales = initSystemCurrentLocales();
        mResult = new AppLocaleStore.AppLocaleResult(GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG,
                initAppSupportedLocale());

        doReturn(mAppCurrentLocale).when(mAppLocaleCollector).getAppCurrentLocale();
        doReturn(mResult).when(mAppLocaleCollector).getAppSupportedLocales();
        doReturn(mAllAppActiveLocales).when(mAppLocaleCollector).getAllAppActiveLocales();
@@ -147,8 +201,8 @@ public class AppLocaleCollectorTest {
        );
    }

    private List<LocaleInfo> initSystemCurrentLocales() {
        return List.of(createLocaleInfo("zh-Hant-TW", SYSTEM_AVAILABLE),
    private Set<LocaleInfo> initSystemCurrentLocales() {
        return Set.of(createLocaleInfo("zh-Hant-TW", SYSTEM_AVAILABLE),
                createLocaleInfo("ja-JP", SYSTEM_AVAILABLE),
                // will be filtered because current App activates this locale.
                createLocaleInfo("en-US", SYSTEM_AVAILABLE));
@@ -188,6 +242,22 @@ public class AppLocaleCollectorTest {
        return hs;
    }

    private Set<LocaleStore.LocaleInfo> getSystemCurrentLocales(String []languageTags) {
        HashSet<LocaleStore.LocaleInfo> hs = new HashSet<>(languageTags.length);
        for (String tag:languageTags) {
            hs.add(createLocaleInfo(tag, SYSTEM_AVAILABLE));
        }
        return hs;
    }

    private HashSet<Locale> getAppSupportedLocales(String []languageTags) {
        HashSet<Locale> hs = new HashSet<>(languageTags.length);
        for (String language:languageTags) {
            hs.add(Locale.forLanguageTag(language));
        }
        return hs;
    }

    private LocaleInfo createLocaleInfo(String languageTag, int suggestionFlag) {
        LocaleInfo localeInfo = LocaleStore.fromLocale(Locale.forLanguageTag(languageTag));
        localeInfo.mSuggestionFlags = suggestionFlag;