Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1294)

Unified Diff: content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java

Issue 15533003: [Android] Implement min/max on all supported date types (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java b/content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java
new file mode 100644
index 0000000000000000000000000000000000000000..05f7a33719a2f5c5198eec1f5cf6fffa0d7f0ddb
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/input/DateDialogNormalizer.java
@@ -0,0 +1,72 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser.input;
+
+import android.widget.DatePicker;
+import android.widget.DatePicker.OnDateChangedListener;
+
+import java.util.Calendar;
+
+/**
+ * Normalize a date dialog so that it respect min and max.
+ */
+class DateDialogNormalizer {
+ private static final long ONE_DAY_MILLIS = 24 * 60 * 60 * 1000;
+
+ private static void setLimits(DatePicker picker, long min, long max) {
+ // DatePicker intervals are non inclusive.
+ long minTime = min > 0 ? min - 1 : 0;
+ long maxTime = (max - ONE_DAY_MILLIS) >= (Long.MAX_VALUE - ONE_DAY_MILLIS) ?
+ Long.MAX_VALUE : max + ONE_DAY_MILLIS;
+
+ // While the widget is only able to display date, min/max can also contain time
+ // information.
+ // Trim min/max to date before adjusting the picker.
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeInMillis(max);
+
+ picker.setMaxDate(trimToDate(maxTime));
+ picker.setMinDate(trimToDate(minTime));
+ }
+
+ /**
+ * Resets the hour, minute, second piece of a time stamp to 0, maintaining the remaining
+ * components (year, month, day).
+ */
+ private static long trimToDate(long time) {
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeInMillis(time);
+ Calendar result = Calendar.getInstance();
+ result.clear();
+ result.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),
+ 0, 0, 0);
+ return result.getTimeInMillis();
+ }
+
+ /**
+ * Normalizes an existing DateDialogPicker changing the default date if
+ * needed to comply with the {@code min} and {@code max} attributes.
+ */
+ static void normalize(DatePicker picker, OnDateChangedListener listener,
+ int year, int month, int day, int hour, int minute, long min, long max) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.clear();
+ calendar.set(year, month, day, hour, minute, 0);
+ if (calendar.getTimeInMillis() < min) {
+ calendar.clear();
+ calendar.setTimeInMillis(min);
+ } else if (calendar.getTimeInMillis() > max) {
+ calendar.clear();
+ calendar.setTimeInMillis(max);
+ }
+ picker.init(
+ calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH), listener);
+
+ setLimits(picker, min, max);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698