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)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipackage org.chromium.ui.picker;
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.app.AlertDialog;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.app.DatePickerDialog.OnDateSetListener;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.DialogInterface;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.DialogInterface.OnDismissListener;
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.text.format.DateFormat;
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.view.View;
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.widget.AdapterView;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.widget.DatePicker;
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import android.widget.ListView;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.widget.TimePicker;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.ui.R;
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.ui.picker.DateTimePickerDialog.OnDateTimeSetListener;
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.ui.picker.MultiFieldTimePickerDialog.OnMultiFieldTimeSetListener;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.Arrays;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.Calendar;
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.Date;
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.GregorianCalendar;
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.TimeZone;
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.concurrent.TimeUnit;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/**
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Opens the appropriate date/time picker dialog for the given dialog type.
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public class InputDialogContainer {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public interface InputActionDelegate {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        void cancelDateTimeDialog();
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        void replaceDateTime(double value);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static int sTextInputTypeDate;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static int sTextInputTypeDateTime;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static int sTextInputTypeDateTimeLocal;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static int sTextInputTypeMonth;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private static int sTextInputTypeTime;
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    private static int sTextInputTypeWeek;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private final Context mContext;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Prevents sending two notifications (from onClick and from onDismiss)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private boolean mDialogAlreadyDismissed;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private AlertDialog mDialog;
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private final InputActionDelegate mInputActionDelegate;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public static void initializeInputTypes(int textInputTypeDate,
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int textInputTypeDateTime, int textInputTypeDateTimeLocal,
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int textInputTypeMonth, int textInputTypeTime,
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int textInputTypeWeek) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sTextInputTypeDate = textInputTypeDate;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sTextInputTypeDateTime = textInputTypeDateTime;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sTextInputTypeDateTimeLocal = textInputTypeDateTimeLocal;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sTextInputTypeMonth = textInputTypeMonth;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sTextInputTypeTime = textInputTypeTime;
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        sTextInputTypeWeek = textInputTypeWeek;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public static boolean isDialogInputType(int type) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return type == sTextInputTypeDate || type == sTextInputTypeTime
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                || type == sTextInputTypeDateTime || type == sTextInputTypeDateTimeLocal
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                || type == sTextInputTypeMonth || type == sTextInputTypeWeek;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public InputDialogContainer(Context context, InputActionDelegate inputActionDelegate) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mContext = context;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mInputActionDelegate = inputActionDelegate;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void showPickerDialog(final int dialogType, double dialogValue,
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        double min, double max, double step) {
80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        Calendar cal;
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // |dialogValue|, |min|, |max| mean different things depending on the |dialogType|.
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // For input type=month is the number of months since 1970.
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // For input type=time it is milliseconds since midnight.
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // For other types they are just milliseconds since 1970.
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // If |dialogValue| is NaN it means an empty value. We will show the current time.
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (Double.isNaN(dialogValue)) {
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal = Calendar.getInstance();
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.MILLISECOND, 0);
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else {
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            if (dialogType == sTextInputTypeMonth) {
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                cal = MonthPicker.createDateFromValue(dialogValue);
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            } else if (dialogType == sTextInputTypeWeek) {
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                cal = WeekPicker.createDateFromValue(dialogValue);
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            } else {
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                GregorianCalendar gregorianCalendar =
96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        new GregorianCalendar(TimeZone.getTimeZone("UTC"));
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                // According to the HTML spec we only use the Gregorian calendar
98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                // so we ignore the Julian/Gregorian transition.
99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                gregorianCalendar.setGregorianChange(new Date(Long.MIN_VALUE));
100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                gregorianCalendar.setTimeInMillis((long) dialogValue);
101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                cal =  gregorianCalendar;
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            }
103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (dialogType == sTextInputTypeDate) {
105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            showPickerDialog(dialogType,
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.YEAR),
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.MONTH),
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.DAY_OF_MONTH),
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    0, 0, 0, 0, 0, min, max, step);
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeTime) {
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            showPickerDialog(dialogType, 0, 0, 0,
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.HOUR_OF_DAY),
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.MINUTE),
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    0, 0, 0, min, max, step);
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeDateTime ||
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                dialogType == sTextInputTypeDateTimeLocal) {
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            showPickerDialog(dialogType,
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.YEAR),
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.MONTH),
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.DAY_OF_MONTH),
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.HOUR_OF_DAY),
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.MINUTE),
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.SECOND),
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    cal.get(Calendar.MILLISECOND),
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    0, min, max, step);
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeMonth) {
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            showPickerDialog(dialogType, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 0,
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    0, 0, 0, 0, 0, min, max, step);
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeWeek) {
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            int year = WeekPicker.getISOWeekYearForDate(cal);
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            int week = WeekPicker.getWeekForDate(cal);
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            showPickerDialog(dialogType, year, 0, 0, 0, 0, 0, 0, week, min, max, step);
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void showSuggestionDialog(final int dialogType,
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            final double dialogValue,
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            final double min, final double max, final double step,
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            DateTimeSuggestion[] suggestions) {
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        ListView suggestionListView = new ListView(mContext);
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        final DateTimeSuggestionListAdapter adapter =
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            new DateTimeSuggestionListAdapter(mContext, Arrays.asList(suggestions));
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        suggestionListView.setAdapter(adapter);
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        suggestionListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            @Override
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                if (position == adapter.getCount() - 1) {
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    dismissDialog();
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    showPickerDialog(dialogType, dialogValue, min, max, step);
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                } else {
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    double suggestionValue = adapter.getItem(position).value();
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    mInputActionDelegate.replaceDateTime(suggestionValue);
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    dismissDialog();
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    mDialogAlreadyDismissed = true;
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                }
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            }
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        });
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        int dialogTitleId = R.string.date_picker_dialog_title;
160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (dialogType == sTextInputTypeTime) {
161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            dialogTitleId = R.string.time_picker_dialog_title;
162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeDateTime ||
163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                dialogType == sTextInputTypeDateTimeLocal) {
164a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            dialogTitleId = R.string.date_time_picker_dialog_title;
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeMonth) {
166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            dialogTitleId = R.string.month_picker_dialog_title;
167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeWeek) {
168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            dialogTitleId = R.string.week_picker_dialog_title;
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mDialog = new AlertDialog.Builder(mContext)
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            .setTitle(dialogTitleId)
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            .setView(suggestionListView)
174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            .setNegativeButton(mContext.getText(android.R.string.cancel),
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                new DialogInterface.OnClickListener() {
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    @Override
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    public void onClick(DialogInterface dialog, int which) {
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        dismissDialog();
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    }
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                })
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            .create();
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            @Override
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            public void onDismiss(DialogInterface dialog) {
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                if (mDialog == dialog && !mDialogAlreadyDismissed) {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    mDialogAlreadyDismissed = true;
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    mInputActionDelegate.cancelDateTimeDialog();
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                }
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            }
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        });
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mDialogAlreadyDismissed = false;
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        mDialog.show();
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void showDialog(final int type, final double value,
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    double min, double max, double step,
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    DateTimeSuggestion[] suggestions) {
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // When the web page asks to show a dialog while there is one already open,
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // dismiss the old one.
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        dismissDialog();
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (suggestions == null) {
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            showPickerDialog(type, value, min, max, step);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else {
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            showSuggestionDialog(type, value, min, max, step, suggestions);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    protected void showPickerDialog(final int dialogType,
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            int year, int month, int monthDay,
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            int hourOfDay, int minute, int second, int millis, int week,
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            double min, double max, double step) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (isDialogShowing()) mDialog.dismiss();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        int stepTime = (int) step;
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (dialogType == sTextInputTypeDate) {
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            ChromeDatePickerDialog dialog = new ChromeDatePickerDialog(mContext,
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    new DateListener(dialogType),
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    year, month, monthDay);
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            DateDialogNormalizer.normalize(dialog.getDatePicker(), dialog,
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    year, month, monthDay,
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    0, 0,
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    (long) min, (long) max);
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            dialog.setTitle(mContext.getText(R.string.date_picker_dialog_title));
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            mDialog = dialog;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (dialogType == sTextInputTypeTime) {
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDialog = new MultiFieldTimePickerDialog(
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                mContext, 0 /* theme */ ,
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                hourOfDay, minute, second, millis,
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                (int) min, (int) max, stepTime,
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                DateFormat.is24HourFormat(mContext),
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                new FullTimeListener(dialogType));
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (dialogType == sTextInputTypeDateTime ||
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                dialogType == sTextInputTypeDateTimeLocal) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mDialog = new DateTimePickerDialog(mContext,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    new DateTimeListener(dialogType),
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    year, month, monthDay,
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    hourOfDay, minute,
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    DateFormat.is24HourFormat(mContext), min, max);
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        } else if (dialogType == sTextInputTypeMonth) {
243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            mDialog = new MonthPickerDialog(mContext, new MonthOrWeekListener(dialogType),
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    year, month, min, max);
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        } else if (dialogType == sTextInputTypeWeek) {
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            mDialog = new WeekPickerDialog(mContext, new MonthOrWeekListener(dialogType),
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    year, week, min, max);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        mDialog.setButton(DialogInterface.BUTTON_POSITIVE,
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                mContext.getText(R.string.date_picker_dialog_set),
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                (DialogInterface.OnClickListener)mDialog);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                mContext.getText(android.R.string.cancel),
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                (DialogInterface.OnClickListener) null);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mDialog.setButton(DialogInterface.BUTTON_NEUTRAL,
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                mContext.getText(R.string.date_picker_dialog_clear),
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                new DialogInterface.OnClickListener() {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    @Override
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    public void onClick(DialogInterface dialog, int which) {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        mDialogAlreadyDismissed = true;
264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        mInputActionDelegate.replaceDateTime(Double.NaN);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                });
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mDialog.setOnDismissListener(
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                new OnDismissListener() {
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    @Override
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    public void onDismiss(final DialogInterface dialog) {
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        if (!mDialogAlreadyDismissed) {
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            mDialogAlreadyDismissed = true;
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            mInputActionDelegate.cancelDateTimeDialog();
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        }
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                    }
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                });
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mDialogAlreadyDismissed = false;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mDialog.show();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    boolean isDialogShowing() {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return mDialog != null && mDialog.isShowing();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void dismissDialog() {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (isDialogShowing()) mDialog.dismiss();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private class DateListener implements OnDateSetListener {
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final int mDialogType;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        DateListener(int dialogType) {
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mDialogType = dialogType;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        public void onDateSet(DatePicker view, int year, int month, int monthDay) {
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            setFieldDateTimeValue(mDialogType, year, month, monthDay, 0, 0, 0, 0, 0);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    private class FullTimeListener implements OnMultiFieldTimeSetListener {
3053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        private final int mDialogType;
3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        FullTimeListener(int dialogType) {
3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            mDialogType = dialogType;
3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        @Override
3113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        public void onTimeSet(int hourOfDay, int minute, int second, int milli) {
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            setFieldDateTimeValue(mDialogType, 0, 0, 0, hourOfDay, minute, second, milli, 0);
3133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        }
3143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    private class DateTimeListener implements OnDateTimeSetListener {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final boolean mLocal;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final int mDialogType;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        public DateTimeListener(int dialogType) {
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mLocal = dialogType == sTextInputTypeDateTimeLocal;
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mDialogType = dialogType;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        public void onDateTimeSet(DatePicker dateView, TimePicker timeView,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int year, int month, int monthDay,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                int hourOfDay, int minute) {
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            setFieldDateTimeValue(mDialogType, year, month, monthDay, hourOfDay, minute, 0, 0, 0);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    private class MonthOrWeekListener implements TwoFieldDatePickerDialog.OnValueSetListener {
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        private final int mDialogType;
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        MonthOrWeekListener(int dialogType) {
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            mDialogType = dialogType;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        @Override
341eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        public void onValueSet(int year, int positionInYear) {
342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            if (mDialogType == sTextInputTypeMonth) {
343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                setFieldDateTimeValue(mDialogType, year, positionInYear, 0, 0, 0, 0, 0, 0);
344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            } else {
345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                setFieldDateTimeValue(mDialogType, year, 0, 0, 0, 0, 0, 0, positionInYear);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    protected void setFieldDateTimeValue(int dialogType,
351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       int year, int month, int monthDay,
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       int hourOfDay, int minute, int second, int millis,
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       int week) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Prevents more than one callback being sent to the native
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // side when the dialog triggers multiple events.
356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (mDialogAlreadyDismissed)
357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            return;
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mDialogAlreadyDismissed = true;
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        if (dialogType == sTextInputTypeMonth) {
361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mInputActionDelegate.replaceDateTime((year - 1970) * 12 + month);
362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeWeek) {
363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mInputActionDelegate.replaceDateTime(
364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  WeekPicker.createDateFromWeek(year, week).getTimeInMillis());
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else if (dialogType == sTextInputTypeTime) {
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mInputActionDelegate.replaceDateTime(TimeUnit.HOURS.toMillis(hourOfDay) +
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                 TimeUnit.MINUTES.toMillis(minute) +
368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                 TimeUnit.SECONDS.toMillis(second) +
369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                 millis);
370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        } else {
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.clear();
373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.YEAR, year);
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.MONTH, month);
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.DAY_OF_MONTH, monthDay);
376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.HOUR_OF_DAY, hourOfDay);
377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.MINUTE, minute);
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.SECOND, second);
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            cal.set(Calendar.MILLISECOND, millis);
380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            mInputActionDelegate.replaceDateTime(cal.getTimeInMillis());
381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        }
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
384