|  | /* | 
|  | * Copyright (C) 2007 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | package android.app; | 
|  |  | 
|  | import android.annotation.TestApi; | 
|  | import android.content.Context; | 
|  | import android.content.DialogInterface; | 
|  | import android.content.DialogInterface.OnClickListener; | 
|  | import android.os.Bundle; | 
|  | import android.util.TypedValue; | 
|  | import android.view.LayoutInflater; | 
|  | import android.view.View; | 
|  | import android.widget.TimePicker; | 
|  | import android.widget.TimePicker.OnTimeChangedListener; | 
|  |  | 
|  | import com.android.internal.R; | 
|  |  | 
|  | /** | 
|  | * A dialog that prompts the user for the time of day using a | 
|  | * {@link TimePicker}. | 
|  | * | 
|  | * <p> | 
|  | * See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a> | 
|  | * guide. | 
|  | */ | 
|  | public class TimePickerDialog extends AlertDialog implements OnClickListener, | 
|  | OnTimeChangedListener { | 
|  | private static final String HOUR = "hour"; | 
|  | private static final String MINUTE = "minute"; | 
|  | private static final String IS_24_HOUR = "is24hour"; | 
|  |  | 
|  | private final TimePicker mTimePicker; | 
|  | private final OnTimeSetListener mTimeSetListener; | 
|  |  | 
|  | private final int mInitialHourOfDay; | 
|  | private final int mInitialMinute; | 
|  | private final boolean mIs24HourView; | 
|  |  | 
|  | /** | 
|  | * The callback interface used to indicate the user is done filling in | 
|  | * the time (e.g. they clicked on the 'OK' button). | 
|  | */ | 
|  | public interface OnTimeSetListener { | 
|  | /** | 
|  | * Called when the user is done setting a new time and the dialog has | 
|  | * closed. | 
|  | * | 
|  | * @param view the view associated with this listener | 
|  | * @param hourOfDay the hour that was set | 
|  | * @param minute the minute that was set | 
|  | */ | 
|  | void onTimeSet(TimePicker view, int hourOfDay, int minute); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Creates a new time picker dialog. | 
|  | * | 
|  | * @param context the parent context | 
|  | * @param listener the listener to call when the time is set | 
|  | * @param hourOfDay the initial hour | 
|  | * @param minute the initial minute | 
|  | * @param is24HourView whether this is a 24 hour view or AM/PM | 
|  | */ | 
|  | public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute, | 
|  | boolean is24HourView) { | 
|  | this(context, 0, listener, hourOfDay, minute, is24HourView); | 
|  | } | 
|  |  | 
|  | static int resolveDialogTheme(Context context, int resId) { | 
|  | if (resId == 0) { | 
|  | final TypedValue outValue = new TypedValue(); | 
|  | context.getTheme().resolveAttribute(R.attr.timePickerDialogTheme, outValue, true); | 
|  | return outValue.resourceId; | 
|  | } else { | 
|  | return resId; | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Creates a new time picker dialog with the specified theme. | 
|  | * <p> | 
|  | * The theme is overlaid on top of the theme of the parent {@code context}. | 
|  | * If {@code themeResId} is 0, the dialog will be inflated using the theme | 
|  | * specified by the | 
|  | * {@link android.R.attr#timePickerDialogTheme android:timePickerDialogTheme} | 
|  | * attribute on the parent {@code context}'s theme. | 
|  | * | 
|  | * @param context the parent context | 
|  | * @param themeResId the resource ID of the theme to apply to this dialog | 
|  | * @param listener the listener to call when the time is set | 
|  | * @param hourOfDay the initial hour | 
|  | * @param minute the initial minute | 
|  | * @param is24HourView Whether this is a 24 hour view, or AM/PM. | 
|  | */ | 
|  | public TimePickerDialog(Context context, int themeResId, OnTimeSetListener listener, | 
|  | int hourOfDay, int minute, boolean is24HourView) { | 
|  | super(context, resolveDialogTheme(context, themeResId)); | 
|  |  | 
|  | mTimeSetListener = listener; | 
|  | mInitialHourOfDay = hourOfDay; | 
|  | mInitialMinute = minute; | 
|  | mIs24HourView = is24HourView; | 
|  |  | 
|  | final Context themeContext = getContext(); | 
|  | final LayoutInflater inflater = LayoutInflater.from(themeContext); | 
|  | final View view = inflater.inflate(R.layout.time_picker_dialog, null); | 
|  | setView(view); | 
|  | setButton(BUTTON_POSITIVE, themeContext.getString(R.string.ok), this); | 
|  | setButton(BUTTON_NEGATIVE, themeContext.getString(R.string.cancel), this); | 
|  | setButtonPanelLayoutHint(LAYOUT_HINT_SIDE); | 
|  |  | 
|  | mTimePicker = (TimePicker) view.findViewById(R.id.timePicker); | 
|  | mTimePicker.setIs24HourView(mIs24HourView); | 
|  | mTimePicker.setCurrentHour(mInitialHourOfDay); | 
|  | mTimePicker.setCurrentMinute(mInitialMinute); | 
|  | mTimePicker.setOnTimeChangedListener(this); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @return the time picker displayed in the dialog | 
|  | * @hide For testing only. | 
|  | */ | 
|  | @TestApi | 
|  | public TimePicker getTimePicker() { | 
|  | return mTimePicker; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { | 
|  | /* do nothing */ | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void show() { | 
|  | super.show(); | 
|  | getButton(BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { | 
|  | @Override | 
|  | public void onClick(View view) { | 
|  | if (mTimePicker.validateInput()) { | 
|  | TimePickerDialog.this.onClick(TimePickerDialog.this, BUTTON_POSITIVE); | 
|  | // Clearing focus forces the dialog to commit any pending | 
|  | // changes, e.g. typed text in a NumberPicker. | 
|  | mTimePicker.clearFocus(); | 
|  | dismiss(); | 
|  | } | 
|  | } | 
|  | }); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void onClick(DialogInterface dialog, int which) { | 
|  | switch (which) { | 
|  | case BUTTON_POSITIVE: | 
|  | // Note this skips input validation and just uses the last valid time and hour | 
|  | // entry. This will only be invoked programmatically. User clicks on BUTTON_POSITIVE | 
|  | // are handled in show(). | 
|  | if (mTimeSetListener != null) { | 
|  | mTimeSetListener.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(), | 
|  | mTimePicker.getCurrentMinute()); | 
|  | } | 
|  | break; | 
|  | case BUTTON_NEGATIVE: | 
|  | cancel(); | 
|  | break; | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Sets the current time. | 
|  | * | 
|  | * @param hourOfDay The current hour within the day. | 
|  | * @param minuteOfHour The current minute within the hour. | 
|  | */ | 
|  | public void updateTime(int hourOfDay, int minuteOfHour) { | 
|  | mTimePicker.setCurrentHour(hourOfDay); | 
|  | mTimePicker.setCurrentMinute(minuteOfHour); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Bundle onSaveInstanceState() { | 
|  | final Bundle state = super.onSaveInstanceState(); | 
|  | state.putInt(HOUR, mTimePicker.getCurrentHour()); | 
|  | state.putInt(MINUTE, mTimePicker.getCurrentMinute()); | 
|  | state.putBoolean(IS_24_HOUR, mTimePicker.is24HourView()); | 
|  | return state; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void onRestoreInstanceState(Bundle savedInstanceState) { | 
|  | super.onRestoreInstanceState(savedInstanceState); | 
|  | final int hour = savedInstanceState.getInt(HOUR); | 
|  | final int minute = savedInstanceState.getInt(MINUTE); | 
|  | mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR)); | 
|  | mTimePicker.setCurrentHour(hour); | 
|  | mTimePicker.setCurrentMinute(minute); | 
|  | } | 
|  | } |