1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpackage org.chromium.content.browser.input;
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.app.AlertDialog;
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.content.Context;
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.content.DialogInterface;
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.content.DialogInterface.OnClickListener;
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.os.Build;
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.os.Bundle;
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.view.View;
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.content.browser.input.TwoFieldDatePicker.OnMonthOrWeekChangedListener;
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.content.R;
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic abstract class TwoFieldDatePickerDialog extends AlertDialog implements OnClickListener,
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        OnMonthOrWeekChangedListener {
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    private static final String YEAR = "year";
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    private static final String POSITION_IN_YEAR = "position_in_year";
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected final TwoFieldDatePicker mPicker;
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected final  OnValueSetListener mCallBack;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    /**
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * The callback used to indicate the user is done filling in the date.
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public interface OnValueSetListener {
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        /**
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         * @param year The year that was set.
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         * @param positionInYear The week in year.
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         *  with {@link java.util.Calendar}.
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch         */
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        void onValueSet(int year, int positionInYear);
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     }
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    /**
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param context The context the dialog is to run in.
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param callBack How the parent is notified that the date is set.
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param year The initial year of the dialog.
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param weekOfYear The initial week of the dialog.
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public TwoFieldDatePickerDialog(Context context,
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             OnValueSetListener callBack,
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int year,
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int positionInYear,
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            long minValue,
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            long maxValue) {
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        this(context, 0, callBack, year, positionInYear, minValue, maxValue);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    /**
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param context The context the dialog is to run in.
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param theme the theme to apply to this dialog
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param callBack How the parent is notified that the date is set.
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param year The initial year of the dialog.
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param weekOfYear The initial week of the dialog.
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public TwoFieldDatePickerDialog(Context context,
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int theme,
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             OnValueSetListener callBack,
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int year,
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            int positionInYear,
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            long minValue,
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            long maxValue) {
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        super(context, theme);
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        mCallBack = callBack;
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        setButton(BUTTON_POSITIVE, context.getText(
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                R.string.date_picker_dialog_set), this);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        setButton(BUTTON_NEGATIVE, context.getText(android.R.string.cancel),
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                (OnClickListener) null);
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        setIcon(0);
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        mPicker = createPicker(context, minValue, maxValue);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        setView(mPicker);
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        mPicker.init(year, positionInYear, this);
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected TwoFieldDatePicker createPicker(Context context, long minValue, long maxValue) {
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return null;
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public void onClick(DialogInterface dialog, int which) {
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        tryNotifyDateSet();
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    /**
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * Notifies the listener, if such, that a date has been set.
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected abstract void tryNotifyDateSet();
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    protected void onStop() {
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        if (Build.VERSION.SDK_INT >= 16) {
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            // The default behavior of dialogs changed in JellyBean and onwards.
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            // Dismissing a dialog (by pressing back for example)
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            // applies the chosen date. This code is added here so that the custom
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            // pickers behave the same as the internal DatePickerDialog.
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            tryNotifyDateSet();
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        }
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        super.onStop();
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    @Override
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public void onMonthOrWeekChanged(TwoFieldDatePicker view, int year, int positionInYear) {
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        mPicker.init(year, positionInYear, null);
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    /**
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * Sets the current date.
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     *
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param year The date week year.
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     * @param weekOfYear The date week.
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     */
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    public void updateDate(int year, int weekOfYear) {
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        mPicker.updateDate(year, weekOfYear);
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
125