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

Commit d5cea9f5 authored by Jeremy Meyer's avatar Jeremy Meyer
Browse files

Use LocaleConfig to determine an app's locale

Bug: 117306409
Test: Manual using test app
Change-Id: Ie5c8eefffd23d678153f26d79e019489db6a920a
parent a925f58b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -3478,6 +3478,9 @@ class ContextImpl extends Context {
            ((CompatResources) r).setContext(this);
        }
        mResources = r;

        LocaleConfig lc = LocaleConfig.fromContextIgnoringOverride(this);
        mResourcesManager.setLocaleList(lc != null ? lc.getSupportedLocales() : null);
    }

    void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
+22 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.content.res.ResourcesKey;
import android.content.res.loader.ResourcesLoader;
import android.hardware.display.DisplayManagerGlobal;
import android.os.IBinder;
import android.os.LocaleList;
import android.os.Process;
import android.os.Trace;
import android.util.ArrayMap;
@@ -118,6 +119,11 @@ public class ResourcesManager {
    private final ArrayList<WeakReference<Resources>> mResourceReferences = new ArrayList<>();
    private final ReferenceQueue<Resources> mResourcesReferencesQueue = new ReferenceQueue<>();

    /**
     * The list of locales the app declares it supports.
     */
    private LocaleList mLocaleList = LocaleList.getEmptyLocaleList();

    private static class ApkKey {
        public final String path;
        public final boolean sharedLib;
@@ -1605,6 +1611,22 @@ public class ResourcesManager {
        }
    }

    /**
     * Returns the LocaleList current set
     */
    public LocaleList getLocaleList() {
        return mLocaleList;
    }

    /**
     * Sets the LocaleList of app's supported locales
     */
    public void setLocaleList(LocaleList localeList) {
        if ((localeList != null) && !localeList.isEmpty()) {
            mLocaleList = localeList;
        }
    }

    private class UpdateHandler implements Resources.UpdateCallbacks {

        /**
+16 −8
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.annotation.PluralsRes;
import android.annotation.RawRes;
import android.annotation.StyleRes;
import android.annotation.StyleableRes;
import android.app.ResourcesManager;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo.Config;
@@ -408,9 +409,16 @@ public class ResourcesImpl {

                if ((configChanges & ActivityInfo.CONFIG_LOCALE) != 0) {
                    if (locales.size() > 1) {
                        // The LocaleList has changed. We must query the AssetManager's available
                        // Locales and figure out the best matching Locale in the new LocaleList.
                        String[] availableLocales = mAssets.getNonSystemLocales();
                        String[] availableLocales;

                        LocaleList localeList = ResourcesManager.getInstance().getLocaleList();
                        if (!localeList.isEmpty()) {
                            availableLocales = localeList.toLanguageTags().split(",");
                        } else {
                            // The LocaleList has changed. We must query the AssetManager's
                            // available Locales and figure out the best matching Locale in the new
                            // LocaleList.
                            availableLocales = mAssets.getNonSystemLocales();
                            if (LocaleList.isPseudoLocalesOnly(availableLocales)) {
                                // No app defined locales, so grab the system locales.
                                availableLocales = mAssets.getLocales();
@@ -418,7 +426,7 @@ public class ResourcesImpl {
                                    availableLocales = null;
                                }
                            }

                        }
                        if (availableLocales != null) {
                            final Locale bestLocale = locales.getFirstMatchWithEnglishSupported(
                                    availableLocales);