15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)package org.chromium.content.browser.input;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import java.text.DateFormatSymbols;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Arrays;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Calendar;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Locale;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.R;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic class MonthPicker extends TwoFieldDatePicker {
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    private static final int MONTHS_NUMBER = 12;
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private String[] mShortMonths;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public MonthPicker(Context context, long minValue, long maxValue) {
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        super(context, minValue, maxValue);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        getPositionInYearSpinner().setContentDescription(
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                getResources().getString(R.string.accessibility_date_picker_month));
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        // initialization based on locale
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        mShortMonths =
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                DateFormatSymbols.getInstance(Locale.getDefault()).getShortMonths();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // initialize to current date
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Calendar cal = Calendar.getInstance();
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), null);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected Calendar createDateFromValue(long value) {
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        int year = (int)Math.min(value / 12 + 1970, Integer.MAX_VALUE);
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        int month = (int) (value % 12);
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Calendar cal = Calendar.getInstance();
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        cal.clear();
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        cal.set(year, month, 1);
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return cal;
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected void setCurrentDate(int year, int month) {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        Calendar date = Calendar.getInstance();
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        date.set(year, month, 1);
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (date.before(getMinDate())) {
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            setCurrentDate(getMinDate());
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        } else if (date.after(getMaxDate())) {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            setCurrentDate(getMaxDate());
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        } else {
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            setCurrentDate(date);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected void updateSpinners() {
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        super.updateSpinners();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // make sure the month names are a zero based array
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // with the months in the month spinner
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        String[] displayedValues = Arrays.copyOfRange(mShortMonths,
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                getPositionInYearSpinner().getMinValue(),
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                getPositionInYearSpinner().getMaxValue() + 1);
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        getPositionInYearSpinner().setDisplayedValues(displayedValues);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @return The selected month.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public int getMonth() {
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getCurrentDate().get(Calendar.MONTH);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public int getPositionInYear() {
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getMonth();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected int getMaxYear() {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getMaxDate().get(Calendar.YEAR);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected int getMinYear() {
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getMinDate().get(Calendar.YEAR);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
95762b2f2129a215bc851e73887244c3a82a892731Torne (Richard Coles)    protected int getMaxPositionInYear(int year) {
96762b2f2129a215bc851e73887244c3a82a892731Torne (Richard Coles)        if (year == getMaxDate().get(Calendar.YEAR)) {
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            return getMaxDate().get(Calendar.MONTH);
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return MONTHS_NUMBER - 1;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
103762b2f2129a215bc851e73887244c3a82a892731Torne (Richard Coles)    protected int getMinPositionInYear(int year) {
104762b2f2129a215bc851e73887244c3a82a892731Torne (Richard Coles)        if (year == getMinDate().get(Calendar.YEAR)) {
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            return getMinDate().get(Calendar.MONTH);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return 0;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
110