diff options
4 files changed, 56 insertions, 2 deletions
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 4cdafe11ce10..2785ee880b80 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -665,4 +665,12 @@ public class StorageManager { public static final int CRYPT_TYPE_PATTERN = 2; /** @hide */ public static final int CRYPT_TYPE_PIN = 3; + + // Constants for the data available via MountService.getField. + /** @hide */ + public static final String SYSTEM_LOCALE_KEY = "SystemLocale"; + /** @hide */ + public static final String OWNER_INFO_KEY = "OwnerInfo"; + /** @hide */ + public static final String PATTERN_VISIBLE_KEY = "PatternVisible"; } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 85b58aa37fa8..16fa88edddcd 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -604,7 +604,7 @@ public class LockPatternUtils { IMountService mountService = IMountService.Stub.asInterface(service); try { Log.d(TAG, "Setting owner info"); - mountService.setField("OwnerInfo", ownerInfo); + mountService.setField(StorageManager.OWNER_INFO_KEY, ownerInfo); } catch (RemoteException e) { Log.e(TAG, "Error changing user info", e); } @@ -1144,7 +1144,7 @@ public class LockPatternUtils { IMountService mountService = IMountService.Stub.asInterface(service); try { - mountService.setField("PatternVisible", enabled ? "1" : "0"); + mountService.setField(StorageManager.PATTERN_VISIBLE_KEY, enabled ? "1" : "0"); } catch (RemoteException e) { Log.e(TAG, "Error changing pattern visible state", e); } diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index ea24d7c9543c..7f24d07debce 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -19,6 +19,7 @@ package com.android.server; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.Manifest; +import android.app.ActivityManagerNative; import android.app.AppOpsManager; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -28,6 +29,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.content.res.Configuration; import android.content.res.ObbInfo; import android.content.res.Resources; import android.content.res.TypedArray; @@ -94,6 +96,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; @@ -821,6 +824,10 @@ class MountService extends IMountService.Stub */ mConnectedSignal.countDown(); + // On an encrypted device we can't see system properties yet, so pull + // the system locale out of the mount service. + copyLocaleFromMountService(); + // Let package manager load internal ASECs. mPms.scanAvailableAsecs(); @@ -830,6 +837,28 @@ class MountService extends IMountService.Stub }.start(); } + private void copyLocaleFromMountService() { + String systemLocale; + try { + systemLocale = getField(StorageManager.SYSTEM_LOCALE_KEY); + } catch (RemoteException e) { + return; + } + if (TextUtils.isEmpty(systemLocale)) { + return; + } + + Slog.d(TAG, "Got locale " + systemLocale + " from mount service"); + Locale locale = Locale.forLanguageTag(systemLocale); + Configuration config = new Configuration(); + config.setLocale(locale); + try { + ActivityManagerNative.getDefault().updateConfiguration(config); + } catch (RemoteException e) { + Slog.e(TAG, "Error setting system locale from mount service", e); + } + } + /** * Callback from NativeDaemonConnector */ diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a30775bdbb4f..d0463b79e64b 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -48,6 +48,8 @@ import android.graphics.Point; import android.graphics.Rect; import android.os.BatteryStats; import android.os.PersistableBundle; +import android.os.storage.IMountService; +import android.os.storage.StorageManager; import android.service.voice.IVoiceInteractionSession; import android.util.ArrayMap; import android.util.ArraySet; @@ -1192,6 +1194,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final int ENTER_ANIMATION_COMPLETE_MSG = 44; static final int ENABLE_SCREEN_AFTER_BOOT_MSG = 45; static final int START_USER_SWITCH_MSG = 46; + static final int SEND_LOCALE_TO_MOUNT_DAEMON_MSG = 47; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; @@ -1878,6 +1881,18 @@ public final class ActivityManagerService extends ActivityManagerNative enableScreenAfterBoot(); break; } + case SEND_LOCALE_TO_MOUNT_DAEMON_MSG: { + try { + Locale l = (Locale) msg.obj; + IBinder service = ServiceManager.getService("mount"); + IMountService mountService = IMountService.Stub.asInterface(service); + Log.d(TAG, "Storing locale " + l.toLanguageTag() + " for decryption UI"); + mountService.setField(StorageManager.SYSTEM_LOCALE_KEY, l.toLanguageTag()); + } catch (RemoteException e) { + Log.e(TAG, "Error storing locale for decryption UI", e); + } + break; + } } } }; @@ -16258,6 +16273,8 @@ public final class ActivityManagerService extends ActivityManagerNative SystemProperties.set("persist.sys.language", l.getLanguage()); SystemProperties.set("persist.sys.country", l.getCountry()); SystemProperties.set("persist.sys.localevar", l.getVariant()); + + mHandler.sendMessage(mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG, l)); } } |