am d265bcc4: Merge "Inform libcore of time format pref. changes."

* commit 'd265bcc4b555ab75009f8ceb32cc90007a621b41':
  Inform libcore of time format pref. changes.
This commit is contained in:
Narayan Kamath
2014-03-07 08:08:05 -08:00
committed by Android Git Automerger
6 changed files with 113 additions and 17 deletions

View File

@@ -68,6 +68,7 @@ import android.os.SystemClock;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.os.Trace; import android.os.Trace;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings;
import android.util.AndroidRuntimeException; import android.util.AndroidRuntimeException;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
@@ -106,6 +107,7 @@ import java.io.PrintWriter;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.net.InetAddress; import java.net.InetAddress;
import java.security.Security; import java.security.Security;
import java.text.DateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
@@ -1095,6 +1097,11 @@ public final class ActivityThread {
public void scheduleInstallProvider(ProviderInfo provider) { public void scheduleInstallProvider(ProviderInfo provider) {
sendMessage(H.INSTALL_PROVIDER, provider); sendMessage(H.INSTALL_PROVIDER, provider);
} }
@Override
public final void updateTimePrefs(boolean is24Hour) {
DateFormat.set24HourTimePref(is24Hour);
}
} }
private class H extends Handler { private class H extends Handler {
@@ -1144,6 +1151,7 @@ public final class ActivityThread {
public static final int REQUEST_ASSIST_CONTEXT_EXTRAS = 143; public static final int REQUEST_ASSIST_CONTEXT_EXTRAS = 143;
public static final int TRANSLUCENT_CONVERSION_COMPLETE = 144; public static final int TRANSLUCENT_CONVERSION_COMPLETE = 144;
public static final int INSTALL_PROVIDER = 145; public static final int INSTALL_PROVIDER = 145;
String codeToString(int code) { String codeToString(int code) {
if (DEBUG_MESSAGES) { if (DEBUG_MESSAGES) {
switch (code) { switch (code) {
@@ -4189,6 +4197,11 @@ public final class ActivityThread {
Log.e(TAG, "Unable to setupGraphicsSupport due to missing cache directory"); Log.e(TAG, "Unable to setupGraphicsSupport due to missing cache directory");
} }
} }
final boolean is24Hr = "24".equals(mCoreSettings.getString(Settings.System.TIME_12_24));
DateFormat.set24HourTimePref(is24Hr);
/** /**
* For system applications on userdebug/eng builds, log stack * For system applications on userdebug/eng builds, log stack
* traces of disk and network access to dropbox for analysis. * traces of disk and network access to dropbox for analysis.

View File

@@ -627,6 +627,15 @@ public abstract class ApplicationThreadNative extends Binder
reply.writeNoException(); reply.writeNoException();
return true; return true;
} }
case UPDATE_TIME_PREFS_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
byte is24Hour = data.readByte();
updateTimePrefs(is24Hour == (byte) 1);
reply.writeNoException();
return true;
}
} }
return super.onTransact(code, data, reply, flags); return super.onTransact(code, data, reply, flags);
@@ -1266,4 +1275,13 @@ class ApplicationThreadProxy implements IApplicationThread {
mRemote.transact(SCHEDULE_INSTALL_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); mRemote.transact(SCHEDULE_INSTALL_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
data.recycle(); data.recycle();
} }
@Override
public void updateTimePrefs(boolean is24Hour) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
data.writeByte(is24Hour ? (byte) 1 : (byte) 0);
mRemote.transact(UPDATE_TIME_PREFS_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
data.recycle();
}
} }

View File

@@ -138,6 +138,7 @@ public interface IApplicationThread extends IInterface {
throws RemoteException; throws RemoteException;
void setProcessState(int state) throws RemoteException; void setProcessState(int state) throws RemoteException;
void scheduleInstallProvider(ProviderInfo provider) throws RemoteException; void scheduleInstallProvider(ProviderInfo provider) throws RemoteException;
void updateTimePrefs(boolean is24Hour) throws RemoteException;
String descriptor = "android.app.IApplicationThread"; String descriptor = "android.app.IApplicationThread";
@@ -191,4 +192,5 @@ public interface IApplicationThread extends IInterface {
int SCHEDULE_TRANSLUCENT_CONVERSION_COMPLETE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+48; int SCHEDULE_TRANSLUCENT_CONVERSION_COMPLETE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+48;
int SET_PROCESS_STATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+49; int SET_PROCESS_STATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+49;
int SCHEDULE_INSTALL_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+50; int SCHEDULE_INSTALL_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+50;
int UPDATE_TIME_PREFS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+51;
} }

View File

@@ -3331,6 +3331,15 @@ public class Intent implements Parcelable, Cloneable {
public static final String EXTRA_SHUTDOWN_USERSPACE_ONLY public static final String EXTRA_SHUTDOWN_USERSPACE_ONLY
= "android.intent.extra.SHUTDOWN_USERSPACE_ONLY"; = "android.intent.extra.SHUTDOWN_USERSPACE_ONLY";
/**
* Optional boolean extra for {@link #ACTION_TIME_CHANGED} that indicates the
* user has set their time format preferences to the 24 hour format.
*
* @hide for internal use only.
*/
public static final String EXTRA_TIME_PREF_24_HOUR_FORMAT =
"android.intent.extra.TIME_PREF_24_HOUR_FORMAT";
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Intent flags (see mFlags variable). // Intent flags (see mFlags variable).

View File

@@ -1058,6 +1058,7 @@ public final class ActivityManagerService extends ActivityManagerNative
static final int IMMERSIVE_MODE_LOCK_MSG = 37; static final int IMMERSIVE_MODE_LOCK_MSG = 37;
static final int PERSIST_URI_GRANTS_MSG = 38; static final int PERSIST_URI_GRANTS_MSG = 38;
static final int REQUEST_ALL_PSS_MSG = 39; static final int REQUEST_ALL_PSS_MSG = 39;
static final int UPDATE_TIME = 40;
static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_ACTIVITY_STACK_MSG = 100;
static final int FIRST_BROADCAST_QUEUE_MSG = 200; static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -1668,6 +1669,22 @@ public final class ActivityManagerService extends ActivityManagerNative
requestPssAllProcsLocked(SystemClock.uptimeMillis(), true, false); requestPssAllProcsLocked(SystemClock.uptimeMillis(), true, false);
break; break;
} }
case UPDATE_TIME: {
synchronized (ActivityManagerService.this) {
for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
ProcessRecord r = mLruProcesses.get(i);
if (r.thread != null) {
try {
r.thread.updateTimePrefs(msg.arg1 == 0 ? false : true);
} catch (RemoteException ex) {
Slog.w(TAG, "Failed to update preferences for: " + r.info.processName);
}
}
}
}
break;
}
} }
} }
}; };
@@ -13430,11 +13447,20 @@ public final class ActivityManagerService extends ActivityManagerNative
* of all currently running processes. This message will get queued up before the broadcast * of all currently running processes. This message will get queued up before the broadcast
* happens. * happens.
*/ */
if (intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) {
mHandler.sendEmptyMessage(UPDATE_TIME_ZONE); mHandler.sendEmptyMessage(UPDATE_TIME_ZONE);
} }
if (intent.ACTION_CLEAR_DNS_CACHE.equals(intent.getAction())) { /*
* If the user set the time, let all running processes know.
*/
if (Intent.ACTION_TIME_CHANGED.equals(intent.getAction())) {
final int is24Hour = intent.getBooleanExtra(
Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, false) ? 1 : 0;
mHandler.sendMessage(mHandler.obtainMessage(UPDATE_TIME, is24Hour, 0));
}
if (Intent.ACTION_CLEAR_DNS_CACHE.equals(intent.getAction())) {
mHandler.sendEmptyMessage(CLEAR_DNS_CACHE_MSG); mHandler.sendEmptyMessage(CLEAR_DNS_CACHE_MSG);
} }

View File

@@ -37,11 +37,16 @@ final class CoreSettingsObserver extends ContentObserver {
private static final String LOG_TAG = CoreSettingsObserver.class.getSimpleName(); private static final String LOG_TAG = CoreSettingsObserver.class.getSimpleName();
// mapping form property name to its type // mapping form property name to its type
private static final Map<String, Class<?>> sCoreSettingToTypeMap = new HashMap< private static final Map<String, Class<?>> sSecureSettingToTypeMap = new HashMap<
String, Class<?>>();
private static final Map<String, Class<?>> sSystemSettingToTypeMap = new HashMap<
String, Class<?>>(); String, Class<?>>();
static { static {
sCoreSettingToTypeMap.put(Settings.Secure.LONG_PRESS_TIMEOUT, int.class); sSecureSettingToTypeMap.put(Settings.Secure.LONG_PRESS_TIMEOUT, int.class);
// add other core settings here... // add other secure settings here...
sSystemSettingToTypeMap.put(Settings.System.TIME_12_24, String.class);
// add other system settings here...
} }
private final Bundle mCoreSettings = new Bundle(); private final Bundle mCoreSettings = new Bundle();
@@ -67,39 +72,62 @@ final class CoreSettingsObserver extends ContentObserver {
} }
private void sendCoreSettings() { private void sendCoreSettings() {
populateCoreSettings(mCoreSettings); populateSettings(mCoreSettings, sSecureSettingToTypeMap);
populateSettings(mCoreSettings, sSystemSettingToTypeMap);
mActivityManagerService.onCoreSettingsChange(mCoreSettings); mActivityManagerService.onCoreSettingsChange(mCoreSettings);
} }
private void beginObserveCoreSettings() { private void beginObserveCoreSettings() {
for (String setting : sCoreSettingToTypeMap.keySet()) { for (String setting : sSecureSettingToTypeMap.keySet()) {
Uri uri = Settings.Secure.getUriFor(setting); Uri uri = Settings.Secure.getUriFor(setting);
mActivityManagerService.mContext.getContentResolver().registerContentObserver( mActivityManagerService.mContext.getContentResolver().registerContentObserver(
uri, false, this); uri, false, this);
} }
for (String setting : sSystemSettingToTypeMap.keySet()) {
Uri uri = Settings.System.getUriFor(setting);
mActivityManagerService.mContext.getContentResolver().registerContentObserver(
uri, false, this);
}
} }
private void populateCoreSettings(Bundle snapshot) { private void populateSettings(Bundle snapshot, Map<String, Class<?>> map) {
Context context = mActivityManagerService.mContext; Context context = mActivityManagerService.mContext;
for (Map.Entry<String, Class<?>> entry : sCoreSettingToTypeMap.entrySet()) { for (Map.Entry<String, Class<?>> entry : map.entrySet()) {
String setting = entry.getKey(); String setting = entry.getKey();
Class<?> type = entry.getValue(); Class<?> type = entry.getValue();
try { try {
if (type == String.class) { if (type == String.class) {
String value = Settings.Secure.getString(context.getContentResolver(), final String value;
setting); if (map == sSecureSettingToTypeMap) {
value = Settings.Secure.getString(context.getContentResolver(), setting);
} else {
value = Settings.System.getString(context.getContentResolver(), setting);
}
snapshot.putString(setting, value); snapshot.putString(setting, value);
} else if (type == int.class) { } else if (type == int.class) {
int value = Settings.Secure.getInt(context.getContentResolver(), final int value;
setting); if (map == sSecureSettingToTypeMap) {
value = Settings.Secure.getInt(context.getContentResolver(), setting);
} else {
value = Settings.System.getInt(context.getContentResolver(), setting);
}
snapshot.putInt(setting, value); snapshot.putInt(setting, value);
} else if (type == float.class) { } else if (type == float.class) {
float value = Settings.Secure.getFloat(context.getContentResolver(), final float value;
setting); if (map == sSecureSettingToTypeMap) {
value = Settings.Secure.getFloat(context.getContentResolver(), setting);
} else {
value = Settings.System.getFloat(context.getContentResolver(), setting);
}
snapshot.putFloat(setting, value); snapshot.putFloat(setting, value);
} else if (type == long.class) { } else if (type == long.class) {
long value = Settings.Secure.getLong(context.getContentResolver(), final long value;
setting); if (map == sSecureSettingToTypeMap) {
value = Settings.Secure.getLong(context.getContentResolver(), setting);
} else {
value = Settings.System.getLong(context.getContentResolver(), setting);
}
snapshot.putLong(setting, value); snapshot.putLong(setting, value);
} }
} catch (SettingNotFoundException snfe) { } catch (SettingNotFoundException snfe) {