1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)package org.chromium.content.browser.input;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.app.AlertDialog;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.DialogInterface;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.DialogInterface.OnClickListener;
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)import android.text.format.Time;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.LayoutInflater;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.View;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.widget.DatePicker;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.widget.DatePicker.OnDateChangedListener;
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import android.widget.TimePicker;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.widget.TimePicker.OnTimeChangedListener;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.R;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DateTimePickerDialog extends AlertDialog implements OnClickListener,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        OnDateChangedListener, OnTimeChangedListener {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final DatePicker mDatePicker;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final TimePicker mTimePicker;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private final OnDateTimeSetListener mCallBack;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    private final long mMinTimeMillis;
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    private final long mMaxTimeMillis;
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * The callback used to indicate the user is done filling in the date.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public interface OnDateTimeSetListener {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /**
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param dateView The DatePicker view associated with this listener.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param timeView The TimePicker view associated with this listener.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param year The year that was set.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param monthOfYear The month that was set (0-11) for compatibility
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         *            with {@link java.util.Calendar}.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param dayOfMonth The day of the month that was set.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param hourOfDay The hour that was set.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         * @param minute The minute that was set.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         */
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void onDateTimeSet(DatePicker dateView, TimePicker timeView, int year, int monthOfYear,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int dayOfMonth, int hourOfDay, int minute);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param context The context the dialog is to run in.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param callBack How the parent is notified that the date is set.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param year The initial year of the dialog.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param monthOfYear The initial month of the dialog.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param dayOfMonth The initial day of the dialog.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public DateTimePickerDialog(Context context,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OnDateTimeSetListener callBack,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int year,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int monthOfYear,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int dayOfMonth,
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            int hourOfDay, int minute, boolean is24HourView,
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            double min, double max) {
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        super(context, 0);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mMinTimeMillis = (long) min;
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mMaxTimeMillis = (long) max;
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mCallBack = callBack;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        setButton(BUTTON_POSITIVE, context.getText(
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                R.string.date_picker_dialog_set), this);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        setButton(BUTTON_NEGATIVE, context.getText(android.R.string.cancel),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (OnClickListener) null);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        setIcon(0);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        setTitle(context.getText(R.string.date_time_picker_dialog_title));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LayoutInflater inflater =
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        View view = inflater.inflate(R.layout.date_time_picker_dialog, null);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        setView(view);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mDatePicker = (DatePicker) view.findViewById(R.id.date_picker);
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        DateDialogNormalizer.normalize(mDatePicker, this,
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                year, monthOfYear, dayOfMonth, hourOfDay, minute, mMinTimeMillis, mMaxTimeMillis);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mTimePicker = (TimePicker) view.findViewById(R.id.time_picker);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mTimePicker.setIs24HourView(is24HourView);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mTimePicker.setCurrentHour(hourOfDay);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mTimePicker.setCurrentMinute(minute);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mTimePicker.setOnTimeChangedListener(this);
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        onTimeChanged(mTimePicker, mTimePicker.getCurrentHour(),
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                mTimePicker.getCurrentMinute());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onClick(DialogInterface dialog, int which) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tryNotifyDateTimeSet();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private void tryNotifyDateTimeSet() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (mCallBack != null) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mDatePicker.clearFocus();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mCallBack.onDateTimeSet(mDatePicker, mTimePicker, mDatePicker.getYear(),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    mDatePicker.getMonth(), mDatePicker.getDayOfMonth(),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    mTimePicker.getCurrentHour(), mTimePicker.getCurrentMinute());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onDateChanged(DatePicker view, int year,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int month, int day) {
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        // Signal a time change so the max/min checks can be applied.
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (mTimePicker != null) {
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            onTimeChanged(mTimePicker, mTimePicker.getCurrentHour(),
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                    mTimePicker.getCurrentMinute());
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    @Override
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Time time = new Time();
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        time.set(0, mTimePicker.getCurrentMinute(),
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                mTimePicker.getCurrentHour(), mDatePicker.getDayOfMonth(),
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                mDatePicker.getMonth(), mDatePicker.getYear());
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (time.toMillis(true) < mMinTimeMillis) {
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            time.set(mMinTimeMillis);
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        } else if (time.toMillis(true) > mMaxTimeMillis) {
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            time.set(mMaxTimeMillis);
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        }
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        mTimePicker.setCurrentHour(time.hour);
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        mTimePicker.setCurrentMinute(time.minute);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /**
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * Sets the current date.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     *
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param year The date year.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param monthOfYear The date month.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     * @param dayOfMonth The date day of month.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     */
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    public void updateDateTime(int year, int monthOfYear, int dayOfMonth,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            int hourOfDay, int minutOfHour) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mTimePicker.setCurrentHour(hourOfDay);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mTimePicker.setCurrentMinute(minutOfHour);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
148