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