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

Commit 8fc5fc57 authored by Jeremy Meyer's avatar Jeremy Meyer
Browse files

Revert "Revert "Revert "Revert "Use LocaleConfig to determine an app's locale""""

This reverts commit 2e974408.

Reason for revert: roll forward with a fix

Test: running failing test on abtd
Change-Id: I4b6ea81bc9ab54dee6ab32a437ed6661d551be02
parent 8cc5b8a4
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -3478,6 +3478,16 @@ class ContextImpl extends Context {
            ((CompatResources) r).setContext(this);
        }
        mResources = r;

        // only do this if the user already has more than one preferred locale
        if (r.getConfiguration().getLocales().size() > 1) {
            LocaleConfig lc = LocaleConfig.fromContextIgnoringOverride(this);
            mResourcesManager.setLocaleList(lc != null
                    && lc.getSupportedLocales() != null
                    && !lc.getSupportedLocales().isEmpty()
                    ? lc.getSupportedLocales()
                    : null);
        }
    }

    void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
+4 −0
Original line number Diff line number Diff line
@@ -138,6 +138,10 @@ public class LocaleConfig implements Parcelable {
        try {
            //Get the resource id
            resId = new ApplicationInfo(context.getApplicationInfo()).getLocaleConfigRes();
            if (resId == 0) {
                mStatus = STATUS_NOT_SPECIFIED;
                return;
            }
            //Get the parser to read XML data
            XmlResourceParser parser = res.getXml(resId);
            parseLocaleConfig(parser, res);
+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);