TimePicker.java revision 25f84f323c607bbd9133432fd789ba29b2dcd4d4
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; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 28e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganovimport android.widget.NumberPicker.OnValueChangedListener; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.DateFormatSymbols; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Calendar; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A view for selecting the time of day, in either 24 hour or AM/PM mode. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The hour, each minute digit, and AM/PM (if applicable) can be conrolled by 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vertical spinners. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The hour can be entered by keyboard input. Entering in two digit hours 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be accomplished by hitting two digits within a timeout of about a 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * second (e.g. '1' then '2' to select 12). 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The minutes can be entered by entering single digits. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Under AM/PM mode, the user can hit 'a', 'A", 'p' or 'P' to pick. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a dialog using this view, see {@link android.app.TimePickerDialog}. 4841ec65355bd6ded652769725b276d47c54a0d913Scott Main * 4941ec65355bd6ded652769725b276d47c54a0d913Scott Main * <p>See the <a href="{@docRoot}resources/tutorials/views/hello-timepicker.html">Time Picker 5041ec65355bd6ded652769725b276d47c54a0d913Scott Main * tutorial</a>.</p> 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@Widget 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TimePicker extends FrameLayout { 54206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 5525f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov private static final boolean DEFAULT_ENABLED_STATE = true; 5625f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A no-op callback used in the constructor to avoid null checks 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * later in the code. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final OnTimeChangedListener NO_OP_CHANGE_LISTENER = new OnTimeChangedListener() { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // state 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCurrentHour = 0; // 0-23 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCurrentMinute = 0; // 0-59 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Boolean mIs24HourView = false; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsAm; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ui components 73e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mHourSpinner; 74e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mMinuteSpinner; 75e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov private final NumberPicker mAmPmSpinner; 76206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov private final TextView mDivider; 77206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 78206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov private final String[] mAmPmStrings; 79206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 8025f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov private boolean mIsEnabled = DEFAULT_ENABLED_STATE; 8151c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // callbacks 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnTimeChangedListener mOnTimeChangedListener; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The callback interface used to indicate the time has been adjusted. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnTimeChangedListener { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The view associated with this listener. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hourOfDay The current hour. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param minute The current minute. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onTimeChanged(TimePicker view, int hourOfDay, int minute); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TimePicker(Context context) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, null); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TimePicker(Context context, AttributeSet attrs) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(context, attrs, 0); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TimePicker(Context context, AttributeSet attrs, int defStyle) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutInflater inflater = 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater.inflate(R.layout.time_picker, 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this, // we are the parent 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // hour 116e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner = (NumberPicker) findViewById(R.id.hour); 117e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangedListener() { 118e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void onValueChange(NumberPicker spinner, int oldVal, int newVal) { 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentHour = newVal; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIs24HourView) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // adjust from [1-12] to [0-11] internally, with the times 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // written "12:xx" being the start of the half-day 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentHour == 12) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentHour = 0; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIsAm) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // PM means 12 hours later than nominal 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentHour += 12; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onTimeChanged(); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 135206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov // divider 136206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov mDivider = (TextView) findViewById(R.id.divider); 137206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov mDivider.setText(R.string.time_picker_separator); 138206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // digits of minute 140e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); 141e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner.setMinValue(0); 142e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner.setMaxValue(59); 143e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner.setOnLongPressUpdateInterval(100); 144e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); 145e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangedListener() { 146e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void onValueChange(NumberPicker spinner, int oldVal, int newVal) { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentMinute = newVal; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onTimeChanged(); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // am/pm 153e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); 154e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setOnValueChangedListener(new OnValueChangedListener() { 155e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov public void onValueChange(NumberPicker picker, int oldVal, int newVal) { 156206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov picker.requestFocus(); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsAm) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Currently AM switching to PM 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentHour < 12) { 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentHour += 12; 161206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Currently PM switching to AM 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCurrentHour >= 12) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentHour -= 12; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsAm = !mIsAm; 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onTimeChanged(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 172206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 173206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov /* Get the localized am/pm strings and use them in the spinner */ 174206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov mAmPmStrings = new DateFormatSymbols().getAmPmStrings(); 175206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 176206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov // now that the hour/minute picker objects have been initialized, set 177206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov // the hour range properly based on the 12/24 hour display mode. 178206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov configurePickerRanges(); 179206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 180206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov // initialize to current time 181206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov Calendar cal = Calendar.getInstance(); 182206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov setOnTimeChangedListener(NO_OP_CHANGE_LISTENER); 183206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 184206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov // by default we're not in 24 hour mode 185206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov setCurrentHour(cal.get(Calendar.HOUR_OF_DAY)); 186206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov setCurrentMinute(cal.get(Calendar.MINUTE)); 187206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isEnabled()) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setEnabled(false); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19250f34d14f6dd3411fdbdb6a7b8b285c2b8fdbf5cSvetoslav Ganov 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setEnabled(boolean enabled) { 19551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov if (mIsEnabled == enabled) { 19651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return; 19751c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setEnabled(enabled); 199e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner.setEnabled(enabled); 20025f84f323c607bbd9133432fd789ba29b2dcd4d4Svetoslav Ganov mDivider.setEnabled(enabled); 201e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setEnabled(enabled); 202e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setEnabled(enabled); 20351c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov mIsEnabled = enabled; 20451c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov } 20551c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov 20651c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov @Override 20751c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov public boolean isEnabled() { 20851c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov return mIsEnabled; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to save / restore state of time picker 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class SavedState extends BaseSavedState { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int mHour; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int mMinute; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcelable superState, int hour, int minute) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(superState); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHour = hour; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinute = minute; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SavedState(Parcel in) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(in); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHour = in.readInt(); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMinute = in.readInt(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHour() { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHour; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getMinute() { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMinute; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.writeToParcel(dest, flags); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mHour); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mMinute); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 246e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov @SuppressWarnings("unused") 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<SavedState> CREATOR 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Creator<SavedState>() { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState createFromParcel(Parcel in) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(in); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SavedState[] newArray(int size) { 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState[size]; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected Parcelable onSaveInstanceState() { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable superState = super.onSaveInstanceState(); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new SavedState(superState, mCurrentHour, mCurrentMinute); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Parcelable state) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SavedState ss = (SavedState) state; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(ss.getSuperState()); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCurrentHour(ss.getHour()); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCurrentMinute(ss.getMinute()); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the callback that indicates the time has been adjusted by the user. 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param onTimeChangedListener the callback, should not be null. 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnTimeChangedListener = onTimeChangedListener; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current hour (0-23). 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Integer getCurrentHour() { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentHour; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current hour. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCurrentHour(Integer currentHour) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mCurrentHour = currentHour; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateHourDisplay(); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set whether in 24 hour or AM/PM mode. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param is24HourView True = 24 hour mode. False = AM/PM. 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setIs24HourView(Boolean is24HourView) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIs24HourView != is24HourView) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIs24HourView = is24HourView; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project configurePickerRanges(); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateHourDisplay(); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this is in 24 hour view else false. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean is24HourView() { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIs24HourView; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The current minute. 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Integer getCurrentMinute() { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentMinute; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current minute (0-59). 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCurrentMinute(Integer currentMinute) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.mCurrentMinute = currentMinute; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateMinuteDisplay(); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getBaseline() { 332e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov return mHourSpinner.getBaseline(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the state of the spinners appropriate to the current hour. 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void updateHourDisplay() { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int currentHour = mCurrentHour; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIs24HourView) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // convert [0,23] ordinal to wall clock display 342206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov if (currentHour > 12) { 343206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov currentHour -= 12; 344206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov } else if (currentHour == 0) { 345206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov currentHour = 12; 346206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 348e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setValue(currentHour); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsAm = mCurrentHour < 12; 350e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setValue(mIsAm ? Calendar.AM : Calendar.PM); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onTimeChanged(); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void configurePickerRanges() { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIs24HourView) { 356e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setMinValue(0); 357e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setMaxValue(23); 358e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); 359e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setVisibility(View.GONE); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 361e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setMinValue(1); 362e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setMaxValue(12); 363e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mHourSpinner.setFormatter(null); 364e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setVisibility(View.VISIBLE); 365e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setMinValue(0); 366e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setMaxValue(1); 367e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mAmPmSpinner.setDisplayedValues(mAmPmStrings); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void onTimeChanged() { 372206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov if (mOnTimeChangedListener != null) { 373206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov mOnTimeChangedListener.onTimeChanged(this, getCurrentHour(), getCurrentMinute()); 374206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the state of the spinners appropriate to the current minute. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void updateMinuteDisplay() { 381e9730bf3d2dcbea1879f24c18aaf9810ac57084cSvetoslav Ganov mMinuteSpinner.setValue(mCurrentMinute); 382206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov onTimeChanged(); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 385