Home | History | Annotate | Download | only in app
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.app;
     18 
     19 import android.content.Context;
     20 import android.content.DialogInterface;
     21 import android.content.DialogInterface.OnClickListener;
     22 import android.os.Bundle;
     23 import android.util.TypedValue;
     24 import android.view.LayoutInflater;
     25 import android.view.View;
     26 import android.widget.TimePicker;
     27 import android.widget.TimePicker.OnTimeChangedListener;
     28 
     29 import com.android.internal.R;
     30 
     31 /**
     32  * A dialog that prompts the user for the time of day using a
     33  * {@link TimePicker}.
     34  *
     35  * <p>
     36  * See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a>
     37  * guide.
     38  */
     39 public class TimePickerDialog extends AlertDialog implements OnClickListener,
     40         OnTimeChangedListener {
     41     private static final String HOUR = "hour";
     42     private static final String MINUTE = "minute";
     43     private static final String IS_24_HOUR = "is24hour";
     44 
     45     private final TimePicker mTimePicker;
     46     private final OnTimeSetListener mTimeSetListener;
     47 
     48     private final int mInitialHourOfDay;
     49     private final int mInitialMinute;
     50     private final boolean mIs24HourView;
     51 
     52     /**
     53      * The callback interface used to indicate the user is done filling in
     54      * the time (e.g. they clicked on the 'OK' button).
     55      */
     56     public interface OnTimeSetListener {
     57         /**
     58          * Called when the user is done setting a new time and the dialog has
     59          * closed.
     60          *
     61          * @param view the view associated with this listener
     62          * @param hourOfDay the hour that was set
     63          * @param minute the minute that was set
     64          */
     65         void onTimeSet(TimePicker view, int hourOfDay, int minute);
     66     }
     67 
     68     /**
     69      * Creates a new time picker dialog.
     70      *
     71      * @param context the parent context
     72      * @param listener the listener to call when the time is set
     73      * @param hourOfDay the initial hour
     74      * @param minute the initial minute
     75      * @param is24HourView whether this is a 24 hour view or AM/PM
     76      */
     77     public TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute,
     78             boolean is24HourView) {
     79         this(context, 0, listener, hourOfDay, minute, is24HourView);
     80     }
     81 
     82     static int resolveDialogTheme(Context context, int resId) {
     83         if (resId == 0) {
     84             final TypedValue outValue = new TypedValue();
     85             context.getTheme().resolveAttribute(R.attr.timePickerDialogTheme, outValue, true);
     86             return outValue.resourceId;
     87         } else {
     88             return resId;
     89         }
     90     }
     91 
     92     /**
     93      * Creates a new time picker dialog with the specified theme.
     94      *
     95      * @param context the parent context
     96      * @param themeResId the resource ID of the theme to apply to this dialog
     97      * @param listener the listener to call when the time is set
     98      * @param hourOfDay the initial hour
     99      * @param minute the initial minute
    100      * @param is24HourView Whether this is a 24 hour view, or AM/PM.
    101      */
    102     public TimePickerDialog(Context context, int themeResId, OnTimeSetListener listener,
    103             int hourOfDay, int minute, boolean is24HourView) {
    104         super(context, resolveDialogTheme(context, themeResId));
    105 
    106         mTimeSetListener = listener;
    107         mInitialHourOfDay = hourOfDay;
    108         mInitialMinute = minute;
    109         mIs24HourView = is24HourView;
    110 
    111         final Context themeContext = getContext();
    112 
    113 
    114         final TypedValue outValue = new TypedValue();
    115         context.getTheme().resolveAttribute(R.attr.timePickerDialogTheme, outValue, true);
    116 
    117         final LayoutInflater inflater = LayoutInflater.from(themeContext);
    118         final View view = inflater.inflate(R.layout.time_picker_dialog, null);
    119         setView(view);
    120         setButton(BUTTON_POSITIVE, themeContext.getString(R.string.ok), this);
    121         setButton(BUTTON_NEGATIVE, themeContext.getString(R.string.cancel), this);
    122         setButtonPanelLayoutHint(LAYOUT_HINT_SIDE);
    123 
    124         mTimePicker = (TimePicker) view.findViewById(R.id.timePicker);
    125         mTimePicker.setIs24HourView(mIs24HourView);
    126         mTimePicker.setCurrentHour(mInitialHourOfDay);
    127         mTimePicker.setCurrentMinute(mInitialMinute);
    128         mTimePicker.setOnTimeChangedListener(this);
    129     }
    130 
    131     @Override
    132     public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    133         /* do nothing */
    134     }
    135 
    136     @Override
    137     public void onClick(DialogInterface dialog, int which) {
    138         switch (which) {
    139             case BUTTON_POSITIVE:
    140                 if (mTimeSetListener != null) {
    141                     mTimeSetListener.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
    142                             mTimePicker.getCurrentMinute());
    143                 }
    144                 break;
    145             case BUTTON_NEGATIVE:
    146                 cancel();
    147                 break;
    148         }
    149     }
    150 
    151     /**
    152      * Sets the current time.
    153      *
    154      * @param hourOfDay The current hour within the day.
    155      * @param minuteOfHour The current minute within the hour.
    156      */
    157     public void updateTime(int hourOfDay, int minuteOfHour) {
    158         mTimePicker.setCurrentHour(hourOfDay);
    159         mTimePicker.setCurrentMinute(minuteOfHour);
    160     }
    161 
    162     @Override
    163     public Bundle onSaveInstanceState() {
    164         final Bundle state = super.onSaveInstanceState();
    165         state.putInt(HOUR, mTimePicker.getCurrentHour());
    166         state.putInt(MINUTE, mTimePicker.getCurrentMinute());
    167         state.putBoolean(IS_24_HOUR, mTimePicker.is24HourView());
    168         return state;
    169     }
    170 
    171     @Override
    172     public void onRestoreInstanceState(Bundle savedInstanceState) {
    173         super.onRestoreInstanceState(savedInstanceState);
    174         final int hour = savedInstanceState.getInt(HOUR);
    175         final int minute = savedInstanceState.getInt(MINUTE);
    176         mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR));
    177         mTimePicker.setCurrentHour(hour);
    178         mTimePicker.setCurrentMinute(minute);
    179     }
    180 }
    181