content: /*
   * 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.annotation.UnsupportedAppUsage;
  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";
  
      @UnsupportedAppUsage
      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);
      }
  }
  