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

Commit d30dbb8a authored by Narayan Kamath's avatar Narayan Kamath
Browse files

Add support for persist.sys.locale.

AndroidRuntime has been changed to read "ro.product.locale" and
"persist.sys.locale" instead of "ro.product.locale.language" etc.
This is passed down as "-Duser.locale" to the runtime.

The system_server has been changed to write out persist.sys.locale
on locale changes.

bug: 17691569

Change-Id: I93360c8795c9620a133656dc491d13d7b6ed162e
parent f19176ff
Loading
Loading
Loading
Loading
+32 −20
Original line number Diff line number Diff line
@@ -357,22 +357,37 @@ static bool hasFile(const char* file) {
}

/*
 * Read the persistent locale.
 * Read the persistent locale. Attempts to read to persist.sys.locale
 * and falls back to the default locale (ro.product.locale) if
 * persist.sys.locale is empty.
 */
static void readLocale(char* language, char* region)
static void readLocale(char* locale)
{
    char propLang[PROPERTY_VALUE_MAX], propRegn[PROPERTY_VALUE_MAX];
    // Allocate 4 extra bytes because we might read a property into
    // this array at offset 4.
    char propLocale[PROPERTY_VALUE_MAX + 4];

    property_get("persist.sys.language", propLang, "");
    property_get("persist.sys.country", propRegn, "");
    if (*propLang == 0 && *propRegn == 0) {
        /* Set to ro properties, default is en_US */
        property_get("ro.product.locale.language", propLang, "en");
        property_get("ro.product.locale.region", propRegn, "US");
    property_get("persist.sys.locale", propLocale, "");
    if (propLocale[0] == 0) {
        property_get("ro.product.locale", propLocale, "");

        if (propLocale[0] == 0) {
            // If persist.sys.locale and ro.product.locale are missing,
            // construct a locale value from the individual locale components.
            property_get("ro.product.locale.language", propLocale, "en");

            // The language code is either two or three chars in length. If it
            // isn't 2 chars long, assume three. Anything else is an error
            // anyway.
            const int offset = (propLocale[2] == 0) ? 2 : 3;
            propLocale[offset] = '-';

            property_get("ro.product.locale.region", propLocale + offset + 1, "US");
        }
    strncat(language, propLang, 3);
    strncat(region, propRegn, 3);
    //ALOGD("language=%s region=%s\n", language, region);
    }

    strncat(locale, propLocale, PROPERTY_VALUE_MAX);
    // ALOGD("[DEBUG] locale=%s", locale);
}

void AndroidRuntime::addOption(const char* optionString, void* extraInfo)
@@ -559,8 +574,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
                                    PROPERTY_VALUE_MAX];
    char profileType[sizeof("-Xprofile-type:")-1 + PROPERTY_VALUE_MAX];
    char profileMaxStackDepth[sizeof("-Xprofile-max-stack-depth:")-1 + PROPERTY_VALUE_MAX];
    char langOption[sizeof("-Duser.language=") + 3];
    char regionOption[sizeof("-Duser.region=") + 3];
    char localeOption[sizeof("-Duser.locale=") + PROPERTY_VALUE_MAX];
    char lockProfThresholdBuf[sizeof("-Xlockprofthreshold:")-1 + PROPERTY_VALUE_MAX];
    char nativeBridgeLibrary[sizeof("-XX:NativeBridge=") + PROPERTY_VALUE_MAX];

@@ -717,11 +731,9 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)

    /* Set the properties for locale */
    {
        strcpy(langOption, "-Duser.language=");
        strcpy(regionOption, "-Duser.region=");
        readLocale(langOption, regionOption);
        addOption(langOption);
        addOption(regionOption);
        strcpy(localeOption, "-Duser.locale=");
        readLocale(localeOption);
        addOption(localeOption);
    }

    /*
+4 −0
Original line number Diff line number Diff line
@@ -859,6 +859,10 @@ class MountService extends IMountService.Stub

        // Temporary workaround for http://b/17945169.
        Slog.d(TAG, "Setting system properties to " + systemLocale + " from mount service");
        SystemProperties.set("persist.sys.locale", locale.toLanguageTag());

        // TODO: Stop setting these properties once we've removed all
        // references to them.
        SystemProperties.set("persist.sys.language", locale.getLanguage());
        SystemProperties.set("persist.sys.country", locale.getCountry());
    }
+16 −4
Original line number Diff line number Diff line
@@ -16403,12 +16403,24 @@ public final class ActivityManagerService extends ActivityManagerNative
     * Save the locale. You must be inside a synchronized (this) block.
     */
    private void saveLocaleLocked(Locale l, boolean isDiff, boolean isPersist) {
        final String languageTag = l.toLanguageTag();
        if (isDiff) {
            SystemProperties.set("user.locale", languageTag);
            // TODO: Who uses these ? There are no references to these system
            // properties in documents or code. Did the author intend to call
            // System.setProperty() instead ? Even that wouldn't have any effect.
            SystemProperties.set("user.language", l.getLanguage());
            SystemProperties.set("user.region", l.getCountry());
        }
        if (isPersist) {
            SystemProperties.set("persist.sys.locale", languageTag);
            // These values are *deprecated*, use persist.sys.locale instead.
            //
            // TODO: Stop setting these values once all code that references
            // them has been removed.
            SystemProperties.set("persist.sys.language", l.getLanguage());
            SystemProperties.set("persist.sys.country", l.getCountry());
            SystemProperties.set("persist.sys.localevar", l.getVariant());