From b7146fec0d864fc8d107ff42c863f999d1129c84 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Tue, 15 Nov 2016 16:52:15 +0000 Subject: [PATCH] Change EXTRA_TIME_PREF_24_HOUR_FORMAT from boolean to int ... on Intent.ACTION_TIME_CHANGED. This is to better represent the possible settings values for the "use 24 hour format" setting. These are "12" (use 12 hour formatting), "24" (use 24 hour formatting), unset (use locale default formatting). The EXTRA_TIME_PREF_24_HOUR_FORMAT for the ACTION_TIME_CHANGED is now an int, not a boolean. 0 means "12", 1 means "24" and 2 means "use locale default". This is not a backwards compatible change but the EXTRA_TIME_PREF_24_HOUR_FORMAT is not public and so should only affect platform code that generates or consumes the intent like settings code. There are associated changes to Settings code to update the source of the Intent. The related underlying code that is triggered in response to the intent and previously assumed a boolean now takes a Boolean. Other changes: The ActivityManagerService now only sends a binder notification to running services if the EXTRA_TIME_PREF_24_HOUR_FORMAT is present. There is an example of ACTION_TIME_CHANGED being sent from the platform (AlarmManagerService, when the system clock is noticed to have changed independently of the RTC) that does not set the extra and would previously have misinterpreted to mean "user wants 12 hour formatting", which would have been a bug. i.e. the code from ActivityManagerService that would interpret the missing extra as false: final int is24Hour = intent.getBooleanExtra( Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, false) ? 1 : 0; Some methods and constants have be renamed to better reflect their use. Bug: 32761619 Bug: 32933009 Test: Manual testing Change-Id: Ie7e9c62ce65e7e3a056b2751b45fe6cb9de86498 --- core/java/android/app/ActivityThread.java | 15 +++++++-- core/java/android/app/IApplicationThread.aidl | 4 +-- core/java/android/content/Intent.java | 12 +++++-- .../server/am/ActivityManagerService.java | 32 +++++++++++++------ 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 1aa13a9348a9b..f052bf7fb717e 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -1309,8 +1309,19 @@ public final class ActivityThread { } @Override - public final void updateTimePrefs(boolean is24Hour) { - DateFormat.set24HourTimePref(is24Hour); + public final void updateTimePrefs(int timeFormatPreference) { + final Boolean timeFormatPreferenceBool; + // For convenience we are using the Intent extra values. + if (timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR) { + timeFormatPreferenceBool = Boolean.FALSE; + } else if (timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR) { + timeFormatPreferenceBool = Boolean.TRUE; + } else { + // timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT + // (or unknown). + timeFormatPreferenceBool = null; + } + DateFormat.set24HourTimePref(timeFormatPreferenceBool); } @Override diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl index 8c9837b6ed4de..6b962b92a66d7 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -138,7 +138,7 @@ oneway interface IApplicationThread { void scheduleTranslucentConversionComplete(IBinder token, boolean timeout); void setProcessState(int state); void scheduleInstallProvider(in ProviderInfo provider); - void updateTimePrefs(boolean is24Hour); + void updateTimePrefs(int timeFormatPreference); void scheduleCancelVisibleBehind(IBinder token); void scheduleBackgroundVisibleBehindChanged(IBinder token, boolean enabled); void scheduleEnterAnimationComplete(IBinder token); @@ -152,4 +152,4 @@ oneway interface IApplicationThread { IVoiceInteractor voiceInteractor); void handleTrustStorageUpdate(); void attachAgent(String path); -} \ No newline at end of file +} diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index c87de9ade0346..50589fea233b8 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4186,13 +4186,21 @@ public class Intent implements Parcelable, Cloneable { = "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. + * Optional int extra for {@link #ACTION_TIME_CHANGED} that indicates the + * user has set their time format preference. See {@link #EXTRA_TIME_PREF_VALUE_USE_12_HOUR}, + * {@link #EXTRA_TIME_PREF_VALUE_USE_24_HOUR} and + * {@link #EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT}. The value must not be negative. * * @hide for internal use only. */ public static final String EXTRA_TIME_PREF_24_HOUR_FORMAT = "android.intent.extra.TIME_PREF_24_HOUR_FORMAT"; + /** @hide */ + public static final int EXTRA_TIME_PREF_VALUE_USE_12_HOUR = 0; + /** @hide */ + public static final int EXTRA_TIME_PREF_VALUE_USE_24_HOUR = 1; + /** @hide */ + public static final int EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT = 2; /** {@hide} */ public static final String EXTRA_REASON = "android.intent.extra.REASON"; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 1437c8385d429..a3f79eaf28660 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1520,7 +1520,7 @@ public class ActivityManagerService extends IActivityManager.Stub static final int PERSIST_URI_GRANTS_MSG = 38; static final int REQUEST_ALL_PSS_MSG = 39; static final int START_PROFILES_MSG = 40; - static final int UPDATE_TIME = 41; + static final int UPDATE_TIME_PREFERENCE_MSG = 41; static final int SYSTEM_USER_START_MSG = 42; static final int SYSTEM_USER_CURRENT_MSG = 43; static final int ENTER_ANIMATION_COMPLETE_MSG = 44; @@ -2026,15 +2026,18 @@ public class ActivityManagerService extends IActivityManager.Stub } break; } - case UPDATE_TIME: { + case UPDATE_TIME_PREFERENCE_MSG: { + // The user's time format preference might have changed. + // For convenience we re-use the Intent extra values. synchronized (ActivityManagerService.this) { - for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) { + 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); + r.thread.updateTimePrefs(msg.arg1); } catch (RemoteException ex) { - Slog.w(TAG, "Failed to update preferences for: " + r.info.processName); + Slog.w(TAG, "Failed to update preferences for: " + + r.info.processName); } } } @@ -18124,11 +18127,20 @@ public class ActivityManagerService extends IActivityManager.Stub mHandler.sendEmptyMessage(UPDATE_TIME_ZONE); break; case Intent.ACTION_TIME_CHANGED: - // If the user set the time, let all running processes know. - final int is24Hour = - intent.getBooleanExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, false) ? 1 - : 0; - mHandler.sendMessage(mHandler.obtainMessage(UPDATE_TIME, is24Hour, 0)); + // EXTRA_TIME_PREF_24_HOUR_FORMAT is optional so we must distinguish between + // the tri-state value it may contain and "unknown". + // For convenience we re-use the Intent extra values. + final int NO_EXTRA_VALUE_FOUND = -1; + final int timeFormatPreferenceMsgValue = intent.getIntExtra( + Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, + NO_EXTRA_VALUE_FOUND /* defaultValue */); + // Only send a message if the time preference is available. + if (timeFormatPreferenceMsgValue != NO_EXTRA_VALUE_FOUND) { + Message updateTimePreferenceMsg = + mHandler.obtainMessage(UPDATE_TIME_PREFERENCE_MSG, + timeFormatPreferenceMsgValue, 0); + mHandler.sendMessage(updateTimePreferenceMsg); + } BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics(); synchronized (stats) { stats.noteCurrentTimeChangedLocked();