TimePicker.java revision cedc446684e94c9971c38c3206f1f224314bda2a
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganovimport com.android.internal.R;
20206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.Widget;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
234243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganovimport android.content.res.TypedArray;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
29cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganovimport android.widget.NumberPicker.OnValueChangeListener;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.DateFormatSymbols;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
354243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * A view for selecting the time of day, in either 24 hour or AM/PM mode. The
364243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * hour, each minute digit, and AM/PM (if applicable) can be conrolled by
374243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * vertical spinners. The hour can be entered by keyboard input. Entering in two
384243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * digit hours can be accomplished by hitting two digits within a timeout of
394243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * about a second (e.g. '1' then '2' to select 12). The minutes can be entered
404243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * by entering single digits. Under AM/PM mode, the user can hit 'a', 'A", 'p'
414243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * or 'P' to pick. For a dialog using this view, see
424243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * {@link android.app.TimePickerDialog}.
434243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov *<p>
444243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * See the <a href="{@docRoot}
454243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * resources/tutorials/views/hello-timepicker.html">Time Picker tutorial</a>.
464243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * </p>
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@Widget
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TimePicker extends FrameLayout {
50206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
5125f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov    private static final boolean DEFAULT_ENABLED_STATE = true;
5225f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov
534243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    private static final int HOURS_IN_HALF_DAY = 12;
544243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
564243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov     * A no-op callback used in the constructor to avoid null checks later in
574243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov     * the code.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final OnTimeChangedListener NO_OP_CHANGE_LISTENER = new OnTimeChangedListener() {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
634243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // state
654243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    private boolean mIs24HourView;
664243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIsAm;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ui components
70e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov    private final NumberPicker mHourSpinner;
714243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
72e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov    private final NumberPicker mMinuteSpinner;
734243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
74e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov    private final NumberPicker mAmPmSpinner;
754243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
76206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov    private final TextView mDivider;
77206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
784243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    // Note that the legacy implementation of the TimePicker is
794243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    // using a button for toggling between AM/PM while the new
804243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    // version uses a NumberPicker spinner. Therefore the code
814243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    // accommodates these two cases to be backwards compatible.
824243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    private final Button mAmPmButton;
834243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
84206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov    private final String[] mAmPmStrings;
85206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
8625f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov    private boolean mIsEnabled = DEFAULT_ENABLED_STATE;
8751c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // callbacks
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnTimeChangedListener mOnTimeChangedListener;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The callback interface used to indicate the time has been adjusted.
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnTimeChangedListener {
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param view The view associated with this listener.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param hourOfDay The current hour.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param minute The current minute.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onTimeChanged(TimePicker view, int hourOfDay, int minute);
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TimePicker(Context context) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, null);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1074243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TimePicker(Context context, AttributeSet attrs) {
1094243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        this(context, attrs, R.attr.timePickerStyle);
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TimePicker(Context context, AttributeSet attrs, int defStyle) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs, defStyle);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1154243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // process style attributes
1164243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        TypedArray attributesArray = context.obtainStyledAttributes(
1174243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                attrs, R.styleable.TimePicker, defStyle, 0);
1184243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        int layoutResourceId = attributesArray.getResourceId(
1194243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                R.styleable.TimePicker_layout, R.layout.time_picker);
1204243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        attributesArray.recycle();
1214243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1224243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        LayoutInflater inflater = (LayoutInflater) context.getSystemService(
1234243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                Context.LAYOUT_INFLATER_SERVICE);
1244243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        inflater.inflate(layoutResourceId, this, true);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // hour
127e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mHourSpinner = (NumberPicker) findViewById(R.id.hour);
128cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganov        mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
129e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
1304243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                if (!is24HourView()) {
1314243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    int minValue = mHourSpinner.getMinValue();
1324243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    int maxValue = mHourSpinner.getMaxValue();
1334243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    // toggle AM/PM if the spinner has wrapped and not in 24
1344243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    // format
1354243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    if ((oldVal == maxValue && newVal == minValue)
1364243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                            || (oldVal == minValue && newVal == maxValue)) {
1374243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                        mIsAm = !mIsAm;
1384243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                        updateAmPmControl();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onTimeChanged();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1454243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // divider (only for the new widget style)
146206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov        mDivider = (TextView) findViewById(R.id.divider);
1474243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (mDivider != null) {
1484243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mDivider.setText(R.string.time_picker_separator);
1494243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
150206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
1514243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // minute
152e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
153e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mMinuteSpinner.setMinValue(0);
154e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mMinuteSpinner.setMaxValue(59);
155e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mMinuteSpinner.setOnLongPressUpdateInterval(100);
156e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mMinuteSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
157cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganov        mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
158e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            public void onValueChange(NumberPicker spinner, int oldVal, int newVal) {
1594243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                int minValue = mMinuteSpinner.getMinValue();
1604243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                int maxValue = mMinuteSpinner.getMaxValue();
1614243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                if (oldVal == maxValue && newVal == minValue) {
1624243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    int currentHour = mHourSpinner.getValue();
1634243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    // toggle AM/PM if the spinner is about to wrap
1644243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    if (!is24HourView() && currentHour == mHourSpinner.getMaxValue()) {
1654243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                        mIsAm = !mIsAm;
1664243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                        updateAmPmControl();
167206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov                    }
1684243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    mHourSpinner.setValue(currentHour + 1);
1694243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                } else if (oldVal == minValue && newVal == maxValue) {
1704243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    int currentHour = mHourSpinner.getValue();
1714243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    // toggle AM/PM if the spinner is about to wrap
1724243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    if (!is24HourView() && currentHour == mHourSpinner.getMinValue()) {
1734243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                        mIsAm = !mIsAm;
1744243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                        updateAmPmControl();
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1764243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    mHourSpinner.setValue(currentHour - 1);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onTimeChanged();
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        });
181206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
182206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov        /* Get the localized am/pm strings and use them in the spinner */
183206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov        mAmPmStrings = new DateFormatSymbols().getAmPmStrings();
184206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
1854243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // am/pm
1864243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        View amPmView = findViewById(R.id.amPm);
1874243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (amPmView instanceof Button) {
1884243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmSpinner = null;
1894243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmButton = (Button) amPmView;
1904243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmButton.setOnClickListener(new OnClickListener() {
1914243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                public void onClick(View button) {
1924243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    button.requestFocus();
1934243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    mIsAm = !mIsAm;
1944243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    updateAmPmControl();
1954243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                }
1964243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            });
1974243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        } else {
1984243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmButton = null;
1994243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmSpinner = (NumberPicker) amPmView;
2004243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmSpinner.setMinValue(0);
2014243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmSpinner.setMaxValue(1);
2024243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmSpinner.setDisplayedValues(mAmPmStrings);
203cedc446684e94c9971c38c3206f1f224314bda2aSvetoslav Ganov            mAmPmSpinner.setOnValueChangedListener(new OnValueChangeListener() {
2044243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
2054243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    picker.requestFocus();
2064243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    mIsAm = !mIsAm;
2074243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    updateAmPmControl();
2084243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                }
2094243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            });
2104243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
2114243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
2124243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // update controls to initial state
2134243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        updateHourControl();
2144243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        updateAmPmControl();
215206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
216206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov        // initialize to current time
2174243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        Calendar calendar = Calendar.getInstance();
218206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov        setOnTimeChangedListener(NO_OP_CHANGE_LISTENER);
219206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
2204243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // set to current time
2214243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
2224243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        setCurrentMinute(calendar.get(Calendar.MINUTE));
223206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isEnabled()) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setEnabled(false);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22850f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEnabled(boolean enabled) {
23151c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov        if (mIsEnabled == enabled) {
23251c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov            return;
23351c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov        }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.setEnabled(enabled);
235e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mMinuteSpinner.setEnabled(enabled);
2364243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (mDivider != null) {
2374243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mDivider.setEnabled(enabled);
2384243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
239e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        mHourSpinner.setEnabled(enabled);
2404243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (mAmPmSpinner != null) {
2414243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmSpinner.setEnabled(enabled);
2424243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        } else {
2434243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            mAmPmButton.setEnabled(enabled);
2444243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
24551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov        mIsEnabled = enabled;
24651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov    }
24751c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov
24851c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov    @Override
24951c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov    public boolean isEnabled() {
25051c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov        return mIsEnabled;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used to save / restore state of time picker
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static class SavedState extends BaseSavedState {
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int mHour;
2594243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final int mMinute;
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private SavedState(Parcelable superState, int hour, int minute) {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(superState);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHour = hour;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMinute = minute;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2674243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private SavedState(Parcel in) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(in);
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHour = in.readInt();
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mMinute = in.readInt();
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getHour() {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mHour;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getMinute() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mMinute;
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel dest, int flags) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.writeToParcel(dest, flags);
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(mHour);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dest.writeInt(mMinute);
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        @SuppressWarnings("unused")
2904243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState createFromParcel(Parcel in) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState(in);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public SavedState[] newArray(int size) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new SavedState[size];
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Parcelable onSaveInstanceState() {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcelable superState = super.onSaveInstanceState();
3044243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        return new SavedState(superState, getCurrentHour(), getCurrentMinute());
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Parcelable state) {
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SavedState ss = (SavedState) state;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onRestoreInstanceState(ss.getSuperState());
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCurrentHour(ss.getHour());
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setCurrentMinute(ss.getMinute());
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the callback that indicates the time has been adjusted by the user.
3174243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov     *
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param onTimeChangedListener the callback, should not be null.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnTimeChangedListener = onTimeChangedListener;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3254243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov     * @return The current hour in the range (0-23).
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Integer getCurrentHour() {
3284243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        int currentHour = mHourSpinner.getValue();
3294243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (is24HourView() || mIsAm) {
3304243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            return currentHour;
3314243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        } else {
3324243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            return (currentHour == HOURS_IN_HALF_DAY) ? 0 : currentHour + HOURS_IN_HALF_DAY;
3334243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the current hour.
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCurrentHour(Integer currentHour) {
3404243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // why was Integer used in the first place?
3414243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (currentHour == null || currentHour == getCurrentHour()) {
3424243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            return;
3434243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
3444243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (!is24HourView()) {
3454243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            // convert [0,23] ordinal to wall clock display
3464243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            if (currentHour > HOURS_IN_HALF_DAY) {
3474243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                currentHour -= HOURS_IN_HALF_DAY;
3484243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mIsAm = false;
3494243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            } else {
3504243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                if (currentHour == 0) {
3514243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                    currentHour = HOURS_IN_HALF_DAY;
3524243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                }
3534243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mIsAm = true;
3544243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            }
3554243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            updateAmPmControl();
3564243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
3574243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        mHourSpinner.setValue(currentHour);
3584243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        onTimeChanged();
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set whether in 24 hour or AM/PM mode.
3634243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov     *
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param is24HourView True = 24 hour mode. False = AM/PM.
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIs24HourView(Boolean is24HourView) {
3674243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (mIs24HourView == is24HourView) {
3684243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            return;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3704243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        mIs24HourView = is24HourView;
3714243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // cache the current hour since spinner range changes
3724243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        int currentHour = getCurrentHour();
3734243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        updateHourControl();
3744243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        // set value after spinner range is updated
3754243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        setCurrentHour(currentHour);
3764243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        updateAmPmControl();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if this is in 24 hour view else false.
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean is24HourView() {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mIs24HourView;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3854243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The current minute.
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Integer getCurrentMinute() {
3904243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        return mMinuteSpinner.getValue();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the current minute (0-59).
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCurrentMinute(Integer currentMinute) {
3974243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (currentMinute == getCurrentMinute()) {
3984243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            return;
3994243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
4004243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        mMinuteSpinner.setValue(currentMinute);
4014243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        onTimeChanged();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getBaseline() {
406e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov        return mHourSpinner.getBaseline();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4094243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    private void updateHourControl() {
4104243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (is24HourView()) {
411e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            mHourSpinner.setMinValue(0);
412e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            mHourSpinner.setMaxValue(23);
413e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            mHourSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
415e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            mHourSpinner.setMinValue(1);
416e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            mHourSpinner.setMaxValue(12);
417e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov            mHourSpinner.setFormatter(null);
4184243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        }
4194243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    }
4204243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
4214243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov    private void updateAmPmControl() {
4224243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        if (is24HourView()) {
4234243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            if (mAmPmSpinner != null) {
4244243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mAmPmSpinner.setVisibility(View.GONE);
4254243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            } else {
4264243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mAmPmButton.setVisibility(View.GONE);
4274243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            }
4284243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov        } else {
4294243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            int index = mIsAm ? Calendar.AM : Calendar.PM;
4304243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            if (mAmPmSpinner != null) {
4314243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mAmPmSpinner.setValue(index);
4324243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mAmPmSpinner.setVisibility(View.VISIBLE);
4334243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            } else {
4344243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mAmPmButton.setText(mAmPmStrings[index]);
4354243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov                mAmPmButton.setVisibility(View.VISIBLE);
4364243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov            }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void onTimeChanged() {
441206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov        if (mOnTimeChangedListener != null) {
442206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov            mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute());
443206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov        }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
446