1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 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)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipackage org.chromium.ui.picker;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.ui.R;
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import java.text.DateFormatSymbols;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Arrays;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Calendar;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import java.util.Locale;
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.TimeZone;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic class MonthPicker extends TwoFieldDatePicker {
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    private static final int MONTHS_NUMBER = 12;
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private final String[] mShortMonths;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    public MonthPicker(Context context, double minValue, double maxValue) {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        super(context, minValue, maxValue);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        getPositionInYearSpinner().setContentDescription(
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                getResources().getString(R.string.accessibility_date_picker_month));
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        // initialization based on locale
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        mShortMonths =
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                DateFormatSymbols.getInstance(Locale.getDefault()).getShortMonths();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // initialize to current date
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), null);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    /**
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     * Creates a date object from the |value| which is months since epoch.
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     */
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    public static Calendar createDateFromValue(double value) {
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        int year = (int) Math.min(value / 12 + 1970, Integer.MAX_VALUE);
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        int month = (int) (value % 12);
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        cal.clear();
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        cal.set(year, month, 1);
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return cal;
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    protected Calendar getDateForValue(double value) {
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return MonthPicker.createDateFromValue(value);
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    @Override
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected void setCurrentDate(int year, int month) {
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        Calendar date = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        date.set(year, month, 1);
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (date.before(getMinDate())) {
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            setCurrentDate(getMinDate());
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        } else if (date.after(getMaxDate())) {
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            setCurrentDate(getMaxDate());
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        } else {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            setCurrentDate(date);
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected void updateSpinners() {
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        super.updateSpinners();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // make sure the month names are a zero based array
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // with the months in the month spinner
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        String[] displayedValues = Arrays.copyOfRange(mShortMonths,
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                getPositionInYearSpinner().getMinValue(),
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                getPositionInYearSpinner().getMaxValue() + 1);
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        getPositionInYearSpinner().setDisplayedValues(displayedValues);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @return The selected month.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public int getMonth() {
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getCurrentDate().get(Calendar.MONTH);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public int getPositionInYear() {
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getMonth();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected int getMaxYear() {
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getMaxDate().get(Calendar.YEAR);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected int getMinYear() {
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return getMinDate().get(Calendar.YEAR);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    protected int getMaxPositionInYear(int year) {
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (year == getMaxDate().get(Calendar.YEAR)) {
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            return getMaxDate().get(Calendar.MONTH);
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return MONTHS_NUMBER - 1;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    protected int getMinPositionInYear(int year) {
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (year == getMinDate().get(Calendar.YEAR)) {
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            return getMinDate().get(Calendar.MONTH);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return 0;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
118