diff options
author | Narayan Kamath <narayan@google.com> | 2015-05-01 11:15:54 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-05-01 11:15:54 +0000 |
commit | c2b1f93c70cadfed69b8ad9114de7c8cfcaef3e2 (patch) | |
tree | f5010756d3d47c98e371048a7499e6bd04ec407b /core | |
parent | 17004d636712c092d7ac8fdfcf933572481cebfb (diff) | |
parent | 2d7d952323a11e0fcf8b2d435ba857d45af05503 (diff) | |
download | frameworks_base-c2b1f93c70cadfed69b8ad9114de7c8cfcaef3e2.zip frameworks_base-c2b1f93c70cadfed69b8ad9114de7c8cfcaef3e2.tar.gz frameworks_base-c2b1f93c70cadfed69b8ad9114de7c8cfcaef3e2.tar.bz2 |
am 2d7d9523: am a78240ba: AlarmManager: Reject non-olson timezones for targetSdk >= M
* commit '2d7d952323a11e0fcf8b2d435ba857d45af05503':
AlarmManager: Reject non-olson timezones for targetSdk >= M
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/app/AlarmManager.java | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index 9d1d312..b0fda9c 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -26,6 +26,10 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.UserHandle; import android.os.WorkSource; +import android.text.TextUtils; +import libcore.util.ZoneInfoDB; + +import java.io.IOException; /** * This class provides access to the system alarm services. These allow you @@ -151,6 +155,7 @@ public class AlarmManager private final IAlarmManager mService; private final boolean mAlwaysExact; + private final int mTargetSdkVersion; /** @@ -159,8 +164,8 @@ public class AlarmManager AlarmManager(IAlarmManager service, Context ctx) { mService = service; - final int sdkVersion = ctx.getApplicationInfo().targetSdkVersion; - mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KITKAT); + mTargetSdkVersion = ctx.getApplicationInfo().targetSdkVersion; + mAlwaysExact = (mTargetSdkVersion < Build.VERSION_CODES.KITKAT); } private long legacyExactLength() { @@ -585,12 +590,38 @@ public class AlarmManager } /** - * Set the system default time zone. - * Requires the permission android.permission.SET_TIME_ZONE. - * - * @param timeZone in the format understood by {@link java.util.TimeZone} + * Sets the system's persistent default time zone. This is the time zone for all apps, even + * after a reboot. Use {@link java.util.TimeZone#setDefault} if you just want to change the + * time zone within your app, and even then prefer to pass an explicit + * {@link java.util.TimeZone} to APIs that require it rather than changing the time zone for + * all threads. + * + * <p> On android M and above, it is an error to pass in a non-Olson timezone to this + * function. Note that this is a bad idea on all Android releases because POSIX and + * the {@code TimeZone} class have opposite interpretations of {@code '+'} and {@code '-'} + * in the same non-Olson ID. + * + * @param timeZone one of the Olson ids from the list returned by + * {@link java.util.TimeZone#getAvailableIDs} */ public void setTimeZone(String timeZone) { + if (TextUtils.isEmpty(timeZone)) { + return; + } + + // Reject this timezone if it isn't an Olson zone we recognize. + if (mTargetSdkVersion >= Build.VERSION_CODES.MNC) { + boolean hasTimeZone = false; + try { + hasTimeZone = ZoneInfoDB.getInstance().hasTimeZone(timeZone); + } catch (IOException ignored) { + } + + if (!hasTimeZone) { + throw new IllegalArgumentException("Timezone: " + timeZone + " is not an Olson ID"); + } + } + try { mService.setTimeZone(timeZone); } catch (RemoteException ex) { |