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

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

Issue 15057004: Week picker for android (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed WebRuntimeFeatures::enableInputTypeWeek Created 7 years, 6 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/WeekPicker.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java b/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java
new file mode 100644
index 0000000000000000000000000000000000000000..ca1a72eaa4f20db544f7a2a0d6548af2467277e9
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/input/WeekPicker.java
@@ -0,0 +1,168 @@
+// Copyright (c) 2012 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.content.Context;
+import android.view.LayoutInflater;
+import android.widget.NumberPicker;
+import android.widget.NumberPicker.OnValueChangeListener;
+
+import java.util.Calendar;
+
+import org.chromium.content.R;
+
+// This class is heavily based on android.widget.DatePicker.
+public class WeekPicker extends TwoFieldDatePicker {
+
+ public WeekPicker(Context context, long minValue, long maxValue) {
+ super(context);
+
+ LayoutInflater inflater = (LayoutInflater) context
Miguel Garcia 2013/06/11 13:02:52 yeah it seems you can move the inflation to the pa
keishi 2013/06/12 13:23:07 Done.
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ inflater.inflate(R.layout.week_picker, this, true);
+
+ OnValueChangeListener onChangeListener = new OnValueChangeListener() {
+ @Override
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ // take care of wrapping of weeks to update greater fields
+ if (picker == mPositionInYearSpinner) {
+ Calendar tempDate = (Calendar) mCurrentDate.clone();
+ if (oldVal == mPositionInYearSpinner.getMaxValue()
+ && newVal == mPositionInYearSpinner.getMinValue()) {
+ tempDate.add(Calendar.WEEK_OF_YEAR, 1);
+ } else if (oldVal == mPositionInYearSpinner.getMinValue()
+ && newVal == mPositionInYearSpinner.getMaxValue()) {
+ tempDate.add(Calendar.WEEK_OF_YEAR, -1);
+ } else {
+ tempDate.add(Calendar.WEEK_OF_YEAR, newVal - oldVal);
+ }
+ // now set the date to the adjusted one
+ setCurrentDate(getISOWeekYearForDate(tempDate),
+ getWeekForDate(tempDate));
+ } else if (picker == mYearSpinner) {
+ setCurrentDate(newVal, getWeekForDate(mCurrentDate));
+ } else {
+ throw new IllegalArgumentException();
+ }
+
+ updateSpinners();
+ notifyDateChanged();
+ }
+ };
+
+ // week
+ mPositionInYearSpinner = (NumberPicker) findViewById(R.id.week);
+ mPositionInYearSpinner.setOnLongPressUpdateInterval(200);
+ mPositionInYearSpinner.setOnValueChangedListener(onChangeListener);
+
+ // year
+ mYearSpinner = (NumberPicker) findViewById(R.id.year);
+ mYearSpinner.setOnLongPressUpdateInterval(100);
+ mYearSpinner.setOnValueChangedListener(onChangeListener);
+
+ mMinDate = Calendar.getInstance();
+ mMinDate.setFirstDayOfWeek(Calendar.MONDAY);
+ mMinDate.setMinimalDaysInFirstWeek(4);
+ mMinDate.setTimeInMillis(minValue);
+
+ mMaxDate = Calendar.getInstance();
+ mMaxDate.setFirstDayOfWeek(Calendar.MONDAY);
+ mMaxDate.setMinimalDaysInFirstWeek(4);
+ mMaxDate.setTimeInMillis(maxValue);
+
+ // initialize to current date
+ mCurrentDate.setTimeInMillis(System.currentTimeMillis());
+ init(getISOWeekYearForDate(mCurrentDate), getWeekForDate(mCurrentDate), null);
+ }
+
+ private Calendar createDateFromWeek(int year, int week) {
+ Calendar date = Calendar.getInstance();
+ date.setFirstDayOfWeek(Calendar.MONDAY);
+ date.setMinimalDaysInFirstWeek(4);
+ date.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+ date.set(Calendar.YEAR, year);
+ date.set(Calendar.WEEK_OF_YEAR, week);
+ return date;
+ }
+
+ public static int getISOWeekYearForDate(Calendar date) {
+ int year = date.get(Calendar.YEAR);
+ int month = date.get(Calendar.MONTH);
+ int week = date.get(Calendar.WEEK_OF_YEAR);
+ if (month == 0 && week > 51) {
+ year--;
+ } else if (month == 11 && week == 1) {
+ year++;
+ }
+ return year;
+ }
+
+ public static int getWeekForDate(Calendar date) {
+ return date.get(Calendar.WEEK_OF_YEAR);
+ }
+
+ @Override
+ protected void setCurrentDate(int year, int week) {
+ mCurrentDate = createDateFromWeek(year, week);
+ if (mCurrentDate.before(mMinDate)) {
+ mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
+ } else if (mCurrentDate.after(mMaxDate)) {
+ mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+ }
+ }
+
+ private int getNumberOfWeeks() {
+ // Create a date in the middle of the year, where the week year matches the year.
+ Calendar date = createDateFromWeek(getYear(), 20);
+ return date.getActualMaximum(Calendar.WEEK_OF_YEAR);
+ }
+
+ @Override
+ protected void updateSpinners() {
+ // set the spinner ranges respecting the min and max dates
+ if (mCurrentDate.equals(mMinDate)) {
+ mPositionInYearSpinner.setMinValue(getWeekForDate(mCurrentDate));
+ mPositionInYearSpinner.setMaxValue(getNumberOfWeeks());
+ mPositionInYearSpinner.setWrapSelectorWheel(false);
+ } else if (mCurrentDate.equals(mMaxDate)) {
+ mPositionInYearSpinner.setMinValue(getNumberOfWeeks());
+ mPositionInYearSpinner.setMaxValue(getWeekForDate(mCurrentDate));
+ mPositionInYearSpinner.setWrapSelectorWheel(false);
+ } else {
+ mPositionInYearSpinner.setMinValue(1);
+ mPositionInYearSpinner.setMaxValue(getNumberOfWeeks());
+ mPositionInYearSpinner.setWrapSelectorWheel(true);
+ }
+
+ // year spinner range does not change based on the current date
+ mYearSpinner.setMinValue(getISOWeekYearForDate(mMinDate));
+ mYearSpinner.setMaxValue(getISOWeekYearForDate(mMaxDate));
+ mYearSpinner.setWrapSelectorWheel(false);
+
+ // set the spinner values
+ mYearSpinner.setValue(getISOWeekYearForDate(mCurrentDate));
+ mPositionInYearSpinner.setValue(getWeekForDate(mCurrentDate));
+ }
+
+ /**
+ * @return The selected year.
+ */
+ @Override
+ public int getYear() {
+ return getISOWeekYearForDate(mCurrentDate);
+ }
+
+ /**
+ * @return The selected week.
+ */
+ public int getWeek() {
+ return getWeekForDate(mCurrentDate);
+ }
+
+ @Override
+ public int getMonthOrWeek() {
+ return getWeek();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698