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

Commit 1e5ed56a authored by Calvin Pan's avatar Calvin Pan Committed by Android (Google) Code Review
Browse files

Merge "Adding empty locale-config case" into tm-dev

parents 8e814271 fdb896a9
Loading
Loading
Loading
Loading
+46 −26
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.app;

import static com.android.internal.app.AppLocaleStore.AppLocaleResult.LocaleStatus;

import android.app.LocaleConfig;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -25,41 +27,43 @@ import android.util.Log;
import java.util.ArrayList;
import java.util.Locale;

public class AppLocaleStore {
class AppLocaleStore {
    private static final String TAG = AppLocaleStore.class.getSimpleName();

    public static ArrayList<Locale> getAppSupportedLocales(Context context, String packageName) {
    public static AppLocaleResult getAppSupportedLocales(
            Context context, String packageName) {
        LocaleConfig localeConfig = null;
        AppLocaleResult.LocaleStatus localeStatus = LocaleStatus.UNKNOWN_FAILURE;
        ArrayList<Locale> appSupportedLocales = new ArrayList<>();
        LocaleList packageLocaleList = getPackageLocales(context, packageName);

        if (packageLocaleList != null && packageLocaleList.size() > 0) {
        try {
            localeConfig = new LocaleConfig(context.createPackageContext(packageName, 0));
        } catch (PackageManager.NameNotFoundException e) {
            Log.w(TAG, "Can not found the package name : " + packageName + " / " + e);
        }

        if (localeConfig != null) {
            if (localeConfig.getStatus() == LocaleConfig.STATUS_SUCCESS) {
                LocaleList packageLocaleList = localeConfig.getSupportedLocales();
                if (packageLocaleList.size() > 0) {
                    localeStatus = LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG;
                    for (int i = 0; i < packageLocaleList.size(); i++) {
                        appSupportedLocales.add(packageLocaleList.get(i));
                    }
            Log.d(TAG, "getAppSupportedLocales from LocaleConfig. Size: "
                    + appSupportedLocales.size());
                } else {
                    localeStatus = LocaleStatus.NO_SUPPORTED_LANGUAGE;
                }
            } else if (localeConfig.getStatus() == LocaleConfig.STATUS_NOT_SPECIFIED) {
                localeStatus = LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_ASSET;
                String[] languages = getAssetLocales(context, packageName);
                for (String language : languages) {
                    appSupportedLocales.add(Locale.forLanguageTag(language));
                }
            Log.d(TAG, "getAppSupportedLocales from asset. Size: "
                    + appSupportedLocales.size());
        }
        return appSupportedLocales;
    }

    private static LocaleList getPackageLocales(Context context, String packageName) {
        try {
            LocaleConfig localeConfig =
                    new LocaleConfig(context.createPackageContext(packageName, 0));
            if (localeConfig.getStatus() == LocaleConfig.STATUS_SUCCESS) {
                return localeConfig.getSupportedLocales();
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.w(TAG, "Can not found the package name : " + packageName + " / " + e);
        }
        return null;
        Log.d(TAG, "getAppSupportedLocales(). status: " + localeStatus
                + ", appSupportedLocales:" + appSupportedLocales.size());
        return new AppLocaleResult(localeStatus, appSupportedLocales);
    }

    private static String[] getAssetLocales(Context context, String packageName) {
@@ -82,4 +86,20 @@ public class AppLocaleStore {
        return new String[0];
    }

    static class AppLocaleResult {
        enum LocaleStatus {
            UNKNOWN_FAILURE,
            NO_SUPPORTED_LANGUAGE,
            GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG,
            GET_SUPPORTED_LANGUAGE_FROM_ASSET,
        }

        LocaleStatus mLocaleStatus;
        ArrayList<Locale> mAppSupportedLocales;

        public AppLocaleResult(LocaleStatus localeStatus, ArrayList<Locale> appSupportedLocales) {
            this.mLocaleStatus = localeStatus;
            this.mAppSupportedLocales = appSupportedLocales;
        }
    }
}
+21 −11
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.internal.app;

import static com.android.internal.app.AppLocaleStore.AppLocaleResult.LocaleStatus;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.ListFragment;
@@ -158,9 +160,18 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
            if (appCurrentLocale != null && !isForCountryMode) {
                mLocaleList.add(appCurrentLocale);
            }
            mLocaleList = filterTheLanguagesNotSupportedInApp(context, appPackageName);

            if (!isForCountryMode) {
            AppLocaleStore.AppLocaleResult result =
                    AppLocaleStore.getAppSupportedLocales(context, appPackageName);
            boolean shouldShowList =
                    result.mLocaleStatus == LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_LOCAL_CONFIG
                    || result.mLocaleStatus == LocaleStatus.GET_SUPPORTED_LANGUAGE_FROM_ASSET;

            mLocaleList = filterTheLanguagesNotSupportedInApp(
                    shouldShowList, result.mAppSupportedLocales);

            // Add "system language"
            if (!isForCountryMode && shouldShowList) {
                mLocaleList.add(LocaleStore.getSystemDefaultLocaleInfo(appCurrentLocale == null));
            }
        }
@@ -168,11 +179,9 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
    }

    private Set<LocaleStore.LocaleInfo> filterTheLanguagesNotSupportedInApp(
            Context context, String appPackageName) {
        ArrayList<Locale> supportedLocales =
                AppLocaleStore.getAppSupportedLocales(context, appPackageName);

            boolean shouldShowList, ArrayList<Locale> supportedLocales) {
        Set<LocaleStore.LocaleInfo> filteredList = new HashSet<>();
        if (shouldShowList) {
            for(LocaleStore.LocaleInfo li: mLocaleList) {
                for(Locale l: supportedLocales) {
                    if(LocaleList.matchesLanguageAndScript(li.getLocale(), l)) {
@@ -181,6 +190,7 @@ public class LocalePickerWithRegion extends ListFragment implements SearchView.O
                }
            }
            Log.d(TAG, "mLocaleList after app-supported filter:  " + filteredList.size());
        }

        return filteredList;
    }