summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2015-05-01 11:15:54 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-05-01 11:15:54 +0000
commitc2b1f93c70cadfed69b8ad9114de7c8cfcaef3e2 (patch)
treef5010756d3d47c98e371048a7499e6bd04ec407b /core
parent17004d636712c092d7ac8fdfcf933572481cebfb (diff)
parent2d7d952323a11e0fcf8b2d435ba857d45af05503 (diff)
downloadframeworks_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.java43
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) {