1eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio/* 2eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * Copyright (C) 2013 The Android Open Source Project 3eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * 4eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License"); 5eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * you may not use this file except in compliance with the License. 6eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * You may obtain a copy of the License at 7eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * 8eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * http://www.apache.org/licenses/LICENSE-2.0 9eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * 10eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * Unless required by applicable law or agreed to in writing, software 11eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS, 12eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * See the License for the specific language governing permissions and 14eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * limitations under the License. 15eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio */ 16eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 17eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Megliopackage android.widget; 18eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 19eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.content.Context; 20eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.content.res.Configuration; 21eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.content.res.TypedArray; 22eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.os.Parcel; 23eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.os.Parcelable; 24eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.text.format.DateFormat; 25014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglioimport android.text.format.DateUtils; 26eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.util.AttributeSet; 27eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.view.LayoutInflater; 28eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.view.View; 29eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.view.ViewGroup; 30eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.view.accessibility.AccessibilityEvent; 31eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport android.view.accessibility.AccessibilityNodeInfo; 32daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viveretteimport android.view.inputmethod.EditorInfo; 33daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viveretteimport android.view.inputmethod.InputMethodManager; 34eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport com.android.internal.R; 35eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 36daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viveretteimport java.text.DateFormatSymbols; 37eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglioimport java.util.Calendar; 38014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglioimport java.util.Locale; 39eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 40daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viveretteimport libcore.icu.LocaleData; 41eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 42daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viveretteimport static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; 43daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viveretteimport static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES; 44eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 45daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette/** 46daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * A delegate implementing the basic spinner-based TimePicker. 47daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette */ 48daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viveretteclass TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate { 49eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio private static final boolean DEFAULT_ENABLED_STATE = true; 50eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio private static final int HOURS_IN_HALF_DAY = 12; 51eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 52daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // state 53daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private boolean mIs24HourView; 54daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private boolean mIsAm; 5567945c11a5e9547f71be91ceb99e7b9ff15a6292Alan Viverette 56daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // ui components 57daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final NumberPicker mHourSpinner; 58daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final NumberPicker mMinuteSpinner; 59daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final NumberPicker mAmPmSpinner; 60daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final EditText mHourSpinnerInput; 61daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final EditText mMinuteSpinnerInput; 62daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final EditText mAmPmSpinnerInput; 63daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final TextView mDivider; 64eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 65daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Note that the legacy implementation of the TimePicker is 66daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // using a button for toggling between AM/PM while the new 67daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // version uses a NumberPicker spinner. Therefore the code 68daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // accommodates these two cases to be backwards compatible. 69daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final Button mAmPmButton; 70eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 71daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private final String[] mAmPmStrings; 7226c563b051aacf5be66a0453be00a645ed3f50cdAlan Viverette 73daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private boolean mIsEnabled = DEFAULT_ENABLED_STATE; 74014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio private Calendar mTempCalendar; 75daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private boolean mHourWithTwoDigit; 76daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private char mHourFormat; 77014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio 783053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase public TimePickerSpinnerDelegate(TimePicker delegator, Context context, AttributeSet attrs, 793053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase int defStyleAttr, int defStyleRes) { 80eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio super(delegator, context); 81eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 82eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio // process style attributes 83daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final TypedArray a = mContext.obtainStyledAttributes( 84daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes); 85daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final int layoutResourceId = a.getResourceId( 86daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette R.styleable.TimePicker_legacyLayout, R.layout.time_picker_legacy); 8760727e07c6ef72e2f494266939c02494a3df28f8Alan Viverette a.recycle(); 885134478151d8aa3d776f8d4f368dbcdbc501a92aAlan Viverette 89daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final LayoutInflater inflater = LayoutInflater.from(mContext); 90daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette inflater.inflate(layoutResourceId, mDelegator, true); 91daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 92daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // hour 93daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner = (NumberPicker) delegator.findViewById(R.id.hour); 94daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 95daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette public void onValueChange(NumberPicker spinner, int oldVal, int newVal) { 96daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateInputState(); 97daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (!is24HourView()) { 98daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if ((oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) || 99daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette (oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1)) { 100daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mIsAm = !mIsAm; 101daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 102daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 103daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 104daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette onTimeChanged(); 105daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 106daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette }); 107daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinnerInput = (EditText) mHourSpinner.findViewById(R.id.numberpicker_input); 108daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT); 109daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 110daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // divider (only for the new widget style) 111daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mDivider = (TextView) mDelegator.findViewById(R.id.divider); 112daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mDivider != null) { 113daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setDividerText(); 114daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 115daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 116daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // minute 117daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner = (NumberPicker) mDelegator.findViewById(R.id.minute); 118daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner.setMinValue(0); 119daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner.setMaxValue(59); 120daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner.setOnLongPressUpdateInterval(100); 121daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter()); 122daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 123daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette public void onValueChange(NumberPicker spinner, int oldVal, int newVal) { 124daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateInputState(); 125daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int minValue = mMinuteSpinner.getMinValue(); 126daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int maxValue = mMinuteSpinner.getMaxValue(); 127daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (oldVal == maxValue && newVal == minValue) { 128daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int newHour = mHourSpinner.getValue() + 1; 129daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (!is24HourView() && newHour == HOURS_IN_HALF_DAY) { 130daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mIsAm = !mIsAm; 131daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 132daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 133daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setValue(newHour); 134daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else if (oldVal == minValue && newVal == maxValue) { 135daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int newHour = mHourSpinner.getValue() - 1; 136daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (!is24HourView() && newHour == HOURS_IN_HALF_DAY - 1) { 137daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mIsAm = !mIsAm; 138daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 139daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 140daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setValue(newHour); 141daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 142daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette onTimeChanged(); 143daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 144daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette }); 145daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinnerInput = (EditText) mMinuteSpinner.findViewById(R.id.numberpicker_input); 146daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT); 147daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 148daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Get the localized am/pm strings and use them in the spinner. 149daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmStrings = getAmPmStrings(context); 150daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 151daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // am/pm 152daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final View amPmView = mDelegator.findViewById(R.id.amPm); 153daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (amPmView instanceof Button) { 154daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner = null; 155daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinnerInput = null; 156daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmButton = (Button) amPmView; 157daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmButton.setOnClickListener(new View.OnClickListener() { 158daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette public void onClick(View button) { 159daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette button.requestFocus(); 160daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mIsAm = !mIsAm; 161daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 162daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette onTimeChanged(); 163daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 164daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette }); 165daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 166daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmButton = null; 167daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner = (NumberPicker) amPmView; 168daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setMinValue(0); 169daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setMaxValue(1); 170daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setDisplayedValues(mAmPmStrings); 171daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 172daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 173daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateInputState(); 174daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette picker.requestFocus(); 175daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mIsAm = !mIsAm; 176daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 177daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette onTimeChanged(); 178daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 179daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette }); 180daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinnerInput = (EditText) mAmPmSpinner.findViewById(R.id.numberpicker_input); 181daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE); 182daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 183daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 184daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (isAmPmAtStart()) { 185daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Move the am/pm view to the beginning 186daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette ViewGroup amPmParent = (ViewGroup) delegator.findViewById(R.id.timePickerLayout); 187daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette amPmParent.removeView(amPmView); 188daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette amPmParent.addView(amPmView, 0); 189daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Swap layout margins if needed. They may be not symmetrical (Old Standard Theme 190daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // for example and not for Holo Theme) 191daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette ViewGroup.MarginLayoutParams lp = 192daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette (ViewGroup.MarginLayoutParams) amPmView.getLayoutParams(); 193daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final int startMargin = lp.getMarginStart(); 194daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final int endMargin = lp.getMarginEnd(); 195daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (startMargin != endMargin) { 196daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette lp.setMarginStart(endMargin); 197daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette lp.setMarginEnd(startMargin); 198daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 199daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 20067945c11a5e9547f71be91ceb99e7b9ff15a6292Alan Viverette 201daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette getHourFormatData(); 202eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 203daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // update controls to initial state 204daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateHourControl(); 205daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateMinuteControl(); 206daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 207eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 208daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // set to current time 209daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setCurrentHour(mTempCalendar.get(Calendar.HOUR_OF_DAY)); 210daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setCurrentMinute(mTempCalendar.get(Calendar.MINUTE)); 211eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 212daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (!isEnabled()) { 213daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setEnabled(false); 214daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 215eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 216daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // set the content descriptions 217daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setContentDescriptions(); 218eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 219daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // If not explicitly specified this view is important for accessibility. 220daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mDelegator.getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { 221daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mDelegator.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); 222daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 223eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 224eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 225daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void getHourFormatData() { 226daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale, 227daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette (mIs24HourView) ? "Hm" : "hm"); 228daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final int lengthPattern = bestDateTimePattern.length(); 229daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourWithTwoDigit = false; 230daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette char hourFormat = '\0'; 231daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Check if the returned pattern is single or double 'H', 'h', 'K', 'k'. We also save 232daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // the hour format that we found. 233daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette for (int i = 0; i < lengthPattern; i++) { 234daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final char c = bestDateTimePattern.charAt(i); 235daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (c == 'H' || c == 'h' || c == 'K' || c == 'k') { 236daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourFormat = c; 237daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (i + 1 < lengthPattern && c == bestDateTimePattern.charAt(i + 1)) { 238daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourWithTwoDigit = true; 239daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 240daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette break; 241daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 242daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 243eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 244eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 245daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private boolean isAmPmAtStart() { 246daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale, 247daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette "hm" /* skeleton */); 248eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 249daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette return bestDateTimePattern.startsWith("a"); 250eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 251eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 252daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette /** 253daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * The time separator is defined in the Unicode CLDR and cannot be supposed to be ":". 254daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * 255daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * See http://unicode.org/cldr/trac/browser/trunk/common/main 256daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * 257daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * We pass the correct "skeleton" depending on 12 or 24 hours view and then extract the 258daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * separator as the character which is just after the hour marker in the returned pattern. 259daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette */ 260daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void setDividerText() { 261daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final String skeleton = (mIs24HourView) ? "Hm" : "hm"; 262daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final String bestDateTimePattern = DateFormat.getBestDateTimePattern(mCurrentLocale, 263daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette skeleton); 264daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette final String separatorText; 265daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int hourIndex = bestDateTimePattern.lastIndexOf('H'); 266daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (hourIndex == -1) { 267daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette hourIndex = bestDateTimePattern.lastIndexOf('h'); 268eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 269daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (hourIndex == -1) { 270daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Default case 271daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette separatorText = ":"; 272eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } else { 273daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int minuteIndex = bestDateTimePattern.indexOf('m', hourIndex + 1); 274daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (minuteIndex == -1) { 275daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette separatorText = Character.toString(bestDateTimePattern.charAt(hourIndex + 1)); 276eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } else { 277daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette separatorText = bestDateTimePattern.substring(hourIndex + 1, minuteIndex); 278eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 279eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 280daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mDivider.setText(separatorText); 281eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 282eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 283eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 284eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void setCurrentHour(Integer currentHour) { 285daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setCurrentHour(currentHour, true); 286daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 287daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 288daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void setCurrentHour(Integer currentHour, boolean notifyTimeChanged) { 289daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // why was Integer used in the first place? 290daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (currentHour == null || currentHour == getCurrentHour()) { 291eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return; 292eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 293daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (!is24HourView()) { 294daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // convert [0,23] ordinal to wall clock display 295daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (currentHour >= HOURS_IN_HALF_DAY) { 296daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mIsAm = false; 297daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (currentHour > HOURS_IN_HALF_DAY) { 298daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette currentHour = currentHour - HOURS_IN_HALF_DAY; 299daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 300daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 301daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mIsAm = true; 302daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (currentHour == 0) { 303daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette currentHour = HOURS_IN_HALF_DAY; 304daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 305daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 306daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 307daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 308daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setValue(currentHour); 309daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (notifyTimeChanged) { 310daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette onTimeChanged(); 311daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 312eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 313eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 314eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 315eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public Integer getCurrentHour() { 316daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int currentHour = mHourSpinner.getValue(); 317daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (is24HourView()) { 318eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return currentHour; 319daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else if (mIsAm) { 320daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette return currentHour % HOURS_IN_HALF_DAY; 321eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } else { 322daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY; 323eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 324eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 325eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 326eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 327eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void setCurrentMinute(Integer currentMinute) { 328daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (currentMinute == getCurrentMinute()) { 329eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return; 330eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 331daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner.setValue(currentMinute); 332eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio onTimeChanged(); 333eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 334eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 335eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 336eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public Integer getCurrentMinute() { 337daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette return mMinuteSpinner.getValue(); 338eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 339eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 340eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 341eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void setIs24HourView(Boolean is24HourView) { 342daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mIs24HourView == is24HourView) { 343eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return; 344eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 345daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // cache the current hour since spinner range changes and BEFORE changing mIs24HourView!! 346daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int currentHour = getCurrentHour(); 347daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Order is important here. 348eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio mIs24HourView = is24HourView; 349daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette getHourFormatData(); 350daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateHourControl(); 351daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // set value after spinner range is updated 352daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setCurrentHour(currentHour, false); 353daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateMinuteControl(); 354daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette updateAmPmControl(); 355eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 356eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 357eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 358eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public boolean is24HourView() { 359eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return mIs24HourView; 360eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 361eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 362eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 363daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette public void setOnTimeChangedListener(TimePicker.OnTimeChangedListener onTimeChangedListener) { 364daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mOnTimeChangedListener = onTimeChangedListener; 365eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 366eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 367eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 368eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void setEnabled(boolean enabled) { 369daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinner.setEnabled(enabled); 370daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mDivider != null) { 371daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mDivider.setEnabled(enabled); 372daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 373daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setEnabled(enabled); 374daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mAmPmSpinner != null) { 375daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setEnabled(enabled); 376daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 377daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmButton.setEnabled(enabled); 378daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 379eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio mIsEnabled = enabled; 380eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 381eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 382eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 383eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public boolean isEnabled() { 384eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return mIsEnabled; 385eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 386eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 387eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 388eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public int getBaseline() { 389daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette return mHourSpinner.getBaseline(); 390eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 391eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 392eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 393eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void onConfigurationChanged(Configuration newConfig) { 394daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setCurrentLocale(newConfig.locale); 395eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 396eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 397eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 398eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public Parcelable onSaveInstanceState(Parcelable superState) { 399daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette return new SavedState(superState, getCurrentHour(), getCurrentMinute()); 400eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 401eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 402eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 403eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void onRestoreInstanceState(Parcelable state) { 404eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio SavedState ss = (SavedState) state; 405daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setCurrentHour(ss.getHour()); 406daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette setCurrentMinute(ss.getMinute()); 407014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio } 408014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio 409014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio @Override 410eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 411014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio onPopulateAccessibilityEvent(event); 412014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio return true; 413eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 414eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 415eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 416eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 417014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio int flags = DateUtils.FORMAT_SHOW_TIME; 418014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio if (mIs24HourView) { 419014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio flags |= DateUtils.FORMAT_24HOUR; 420014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio } else { 421014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio flags |= DateUtils.FORMAT_12HOUR; 422014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio } 423014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio mTempCalendar.set(Calendar.HOUR_OF_DAY, getCurrentHour()); 424014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio mTempCalendar.set(Calendar.MINUTE, getCurrentMinute()); 425daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette String selectedDateUtterance = DateUtils.formatDateTime(mContext, 426014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio mTempCalendar.getTimeInMillis(), flags); 427daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette event.getText().add(selectedDateUtterance); 428eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 429eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 430eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 431eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 432014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio event.setClassName(TimePicker.class.getName()); 433eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 434eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 435eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 436eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 437014b8cfcf87507e629a728582b196b62aee71e37Fabrice Di Meglio info.setClassName(TimePicker.class.getName()); 438eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 439eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 440daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void updateInputState() { 441daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Make sure that if the user changes the value and the IME is active 442daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // for one of the inputs if this widget, the IME is closed. If the user 443daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // changed the value via the IME and there is a next input the IME will 444daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // be shown, otherwise the user chose another means of changing the 445daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // value and having the IME up makes no sense. 446daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); 447daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (inputMethodManager != null) { 448daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (inputMethodManager.isActive(mHourSpinnerInput)) { 449daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinnerInput.clearFocus(); 450daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); 451daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else if (inputMethodManager.isActive(mMinuteSpinnerInput)) { 452daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinnerInput.clearFocus(); 453daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); 454daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else if (inputMethodManager.isActive(mAmPmSpinnerInput)) { 455daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinnerInput.clearFocus(); 456daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette inputMethodManager.hideSoftInputFromWindow(mDelegator.getWindowToken(), 0); 457daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 458daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 459daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 460daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 461daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void updateAmPmControl() { 462daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (is24HourView()) { 463daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mAmPmSpinner != null) { 464daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setVisibility(View.GONE); 465daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 466daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmButton.setVisibility(View.GONE); 467daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 468daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 469daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette int index = mIsAm ? Calendar.AM : Calendar.PM; 470daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mAmPmSpinner != null) { 471daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setValue(index); 472daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmSpinner.setVisibility(View.VISIBLE); 473daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 474daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmButton.setText(mAmPmStrings[index]); 475daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mAmPmButton.setVisibility(View.VISIBLE); 476daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 477daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 478daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 479daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 480daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 481eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio /** 482daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * Sets the current locale. 483eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * 484daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette * @param locale The current locale. 485eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio */ 486daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette @Override 487daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette public void setCurrentLocale(Locale locale) { 488daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette super.setCurrentLocale(locale); 489daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mTempCalendar = Calendar.getInstance(locale); 490eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 491eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 492daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void onTimeChanged() { 493daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mDelegator.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); 494daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mOnTimeChangedListener != null) { 495daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mOnTimeChangedListener.onTimeChanged(mDelegator, getCurrentHour(), 496daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette getCurrentMinute()); 497daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 498eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 499eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 500daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void updateHourControl() { 501daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (is24HourView()) { 502daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // 'k' means 1-24 hour 503daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mHourFormat == 'k') { 504daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMinValue(1); 505daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMaxValue(24); 506daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 507daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMinValue(0); 508daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMaxValue(23); 509daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 510daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 511daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // 'K' means 0-11 hour 512daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mHourFormat == 'K') { 513daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMinValue(0); 514daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMaxValue(11); 515daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 516daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMinValue(1); 517daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setMaxValue(12); 518daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 519daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 520daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mHourSpinner.setFormatter(mHourWithTwoDigit ? NumberPicker.getTwoDigitFormatter() : null); 521eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 522eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 523daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void updateMinuteControl() { 524daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (is24HourView()) { 525daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_DONE); 526daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } else { 527daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette mMinuteSpinnerInput.setImeOptions(EditorInfo.IME_ACTION_NEXT); 528daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 529eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 530eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 531daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void setContentDescriptions() { 532daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Minute 533daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette trySetContentDescription(mMinuteSpinner, R.id.increment, 534daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette R.string.time_picker_increment_minute_button); 535daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette trySetContentDescription(mMinuteSpinner, R.id.decrement, 536daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette R.string.time_picker_decrement_minute_button); 537daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // Hour 538daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette trySetContentDescription(mHourSpinner, R.id.increment, 539daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette R.string.time_picker_increment_hour_button); 540daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette trySetContentDescription(mHourSpinner, R.id.decrement, 541daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette R.string.time_picker_decrement_hour_button); 542daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette // AM/PM 543daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (mAmPmSpinner != null) { 544daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette trySetContentDescription(mAmPmSpinner, R.id.increment, 545daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette R.string.time_picker_increment_set_pm_button); 546daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette trySetContentDescription(mAmPmSpinner, R.id.decrement, 547daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette R.string.time_picker_decrement_set_am_button); 548daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette } 549eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 550eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 551daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private void trySetContentDescription(View root, int viewId, int contDescResId) { 552daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette View target = root.findViewById(viewId); 553daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette if (target != null) { 554daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette target.setContentDescription(mContext.getString(contDescResId)); 555eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 556eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 557eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 558eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio /** 559eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio * Used to save / restore state of time picker 560eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio */ 561eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio private static class SavedState extends View.BaseSavedState { 562eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio private final int mHour; 563eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio private final int mMinute; 564daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette 565daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette private SavedState(Parcelable superState, int hour, int minute) { 566eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio super(superState); 567eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio mHour = hour; 568eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio mMinute = minute; 569eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 570eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 571eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio private SavedState(Parcel in) { 572eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio super(in); 573eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio mHour = in.readInt(); 574eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio mMinute = in.readInt(); 575eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 576eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 577eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public int getHour() { 578eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return mHour; 579eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 580eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 581eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public int getMinute() { 582eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return mMinute; 583eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 584eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 585eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @Override 586eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public void writeToParcel(Parcel dest, int flags) { 587eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio super.writeToParcel(dest, flags); 588eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio dest.writeInt(mHour); 589eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio dest.writeInt(mMinute); 590eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 591eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 592eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio @SuppressWarnings({"unused", "hiding"}) 593eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { 594eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public SavedState createFromParcel(Parcel in) { 595eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return new SavedState(in); 596eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 597eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 598eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio public SavedState[] newArray(int size) { 599eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio return new SavedState[size]; 600eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 601eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio }; 602eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 603eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio 604daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette public static String[] getAmPmStrings(Context context) { 605daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette String[] result = new String[2]; 606daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale); 607daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette result[0] = d.amPm[0].length() > 2 ? d.narrowAm : d.amPm[0]; 608daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette result[1] = d.amPm[1].length() > 2 ? d.narrowPm : d.amPm[1]; 609daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette return result; 610eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio } 611eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio} 612