1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.ui.picker;
6
7import android.app.AlertDialog;
8import android.content.Context;
9import android.content.DialogInterface;
10import android.content.DialogInterface.OnClickListener;
11import android.text.format.Time;
12import android.view.LayoutInflater;
13import android.view.View;
14import android.widget.DatePicker;
15import android.widget.DatePicker.OnDateChangedListener;
16import android.widget.TimePicker;
17import android.widget.TimePicker.OnTimeChangedListener;
18
19import org.chromium.ui.R;
20
21public class DateTimePickerDialog extends AlertDialog implements OnClickListener,
22        OnDateChangedListener, OnTimeChangedListener {
23    private final DatePicker mDatePicker;
24    private final TimePicker mTimePicker;
25    private final OnDateTimeSetListener mCallBack;
26
27    private final long mMinTimeMillis;
28    private final long mMaxTimeMillis;
29
30    /**
31     * The callback used to indicate the user is done filling in the date.
32     */
33    public interface OnDateTimeSetListener {
34
35        /**
36         * @param dateView The DatePicker view associated with this listener.
37         * @param timeView The TimePicker view associated with this listener.
38         * @param year The year that was set.
39         * @param monthOfYear The month that was set (0-11) for compatibility
40         *            with {@link java.util.Calendar}.
41         * @param dayOfMonth The day of the month that was set.
42         * @param hourOfDay The hour that was set.
43         * @param minute The minute that was set.
44         */
45        void onDateTimeSet(DatePicker dateView, TimePicker timeView, int year, int monthOfYear,
46                int dayOfMonth, int hourOfDay, int minute);
47    }
48
49    /**
50     * @param context The context the dialog is to run in.
51     * @param callBack How the parent is notified that the date is set.
52     * @param year The initial year of the dialog.
53     * @param monthOfYear The initial month of the dialog.
54     * @param dayOfMonth The initial day of the dialog.
55     */
56    public DateTimePickerDialog(Context context,
57            OnDateTimeSetListener callBack,
58            int year,
59            int monthOfYear,
60            int dayOfMonth,
61            int hourOfDay, int minute, boolean is24HourView,
62            double min, double max) {
63        super(context, 0);
64
65        mMinTimeMillis = (long) min;
66        mMaxTimeMillis = (long) max;
67
68        mCallBack = callBack;
69
70        setButton(BUTTON_POSITIVE, context.getText(
71                R.string.date_picker_dialog_set), this);
72        setButton(BUTTON_NEGATIVE, context.getText(android.R.string.cancel),
73                (OnClickListener) null);
74        setIcon(0);
75        setTitle(context.getText(R.string.date_time_picker_dialog_title));
76
77        LayoutInflater inflater =
78                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
79        View view = inflater.inflate(R.layout.date_time_picker_dialog, null);
80        setView(view);
81        mDatePicker = (DatePicker) view.findViewById(R.id.date_picker);
82        DateDialogNormalizer.normalize(mDatePicker, this,
83                year, monthOfYear, dayOfMonth, hourOfDay, minute, mMinTimeMillis, mMaxTimeMillis);
84
85        mTimePicker = (TimePicker) view.findViewById(R.id.time_picker);
86        mTimePicker.setIs24HourView(is24HourView);
87        mTimePicker.setCurrentHour(hourOfDay);
88        mTimePicker.setCurrentMinute(minute);
89        mTimePicker.setOnTimeChangedListener(this);
90        onTimeChanged(mTimePicker, mTimePicker.getCurrentHour(),
91                mTimePicker.getCurrentMinute());
92    }
93
94    @Override
95    public void onClick(DialogInterface dialog, int which) {
96        tryNotifyDateTimeSet();
97    }
98
99    private void tryNotifyDateTimeSet() {
100        if (mCallBack != null) {
101            mDatePicker.clearFocus();
102            mCallBack.onDateTimeSet(mDatePicker, mTimePicker, mDatePicker.getYear(),
103                    mDatePicker.getMonth(), mDatePicker.getDayOfMonth(),
104                    mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute());
105        }
106    }
107
108    @Override
109    public void onDateChanged(DatePicker view, int year,
110            int month, int day) {
111        // Signal a time change so the max/min checks can be applied.
112        if (mTimePicker != null) {
113            onTimeChanged(mTimePicker, mTimePicker.getCurrentHour(),
114                    mTimePicker.getCurrentMinute());
115        }
116    }
117
118    @Override
119    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
120        Time time = new Time();
121        time.set(0, mTimePicker.getCurrentMinute(),
122                mTimePicker.getCurrentHour(), mDatePicker.getDayOfMonth(),
123                mDatePicker.getMonth(), mDatePicker.getYear());
124
125        if (time.toMillis(true) < mMinTimeMillis) {
126            time.set(mMinTimeMillis);
127        } else if (time.toMillis(true) > mMaxTimeMillis) {
128            time.set(mMaxTimeMillis);
129        }
130        mTimePicker.setCurrentHour(time.hour);
131        mTimePicker.setCurrentMinute(time.minute);
132    }
133
134    /**
135     * Sets the current date.
136     *
137     * @param year The date year.
138     * @param monthOfYear The date month.
139     * @param dayOfMonth The date day of month.
140     */
141    public void updateDateTime(int year, int monthOfYear, int dayOfMonth,
142            int hourOfDay, int minutOfHour) {
143        mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
144        mTimePicker.setCurrentHour(hourOfDay);
145        mTimePicker.setCurrentMinute(minutOfHour);
146    }
147}
148