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