1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.deskclock.alarms;
18
19import android.app.Dialog;
20import android.app.DialogFragment;
21import android.app.Fragment;
22import android.app.FragmentManager;
23import android.app.TimePickerDialog;
24import android.content.Context;
25import android.content.DialogInterface;
26import android.os.Bundle;
27import android.support.v7.app.AlertDialog;
28import android.text.format.DateFormat;
29import android.widget.TimePicker;
30
31import com.android.deskclock.Utils;
32
33import java.util.Calendar;
34
35/**
36 * DialogFragment used to show TimePicker.
37 */
38public class TimePickerDialogFragment extends DialogFragment {
39
40    /**
41     * Tag for timer picker fragment in FragmentManager.
42     */
43    private static final String TAG = "TimePickerDialogFragment";
44
45    private static final String ARG_HOUR = TAG + "_hour";
46    private static final String ARG_MINUTE = TAG + "_minute";
47
48    @Override
49    @SuppressWarnings("deprecation")
50    public Dialog onCreateDialog(Bundle savedInstanceState) {
51        final OnTimeSetListener listener = ((OnTimeSetListener) getParentFragment());
52
53        final Calendar now = Calendar.getInstance();
54        final Bundle args = getArguments() == null ? Bundle.EMPTY : getArguments();
55        final int hour = args.getInt(ARG_HOUR, now.get(Calendar.HOUR_OF_DAY));
56        final int minute = args.getInt(ARG_MINUTE, now.get(Calendar.MINUTE));
57
58        if (Utils.isLOrLater()) {
59            final Context context = getActivity();
60            return new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {
61                @Override
62                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
63                    listener.onTimeSet(TimePickerDialogFragment.this, hourOfDay, minute);
64                }
65            }, hour, minute, DateFormat.is24HourFormat(context));
66        } else {
67            final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
68            final Context context = builder.getContext();
69
70            final TimePicker timePicker = new TimePicker(context);
71            timePicker.setCurrentHour(hour);
72            timePicker.setCurrentMinute(minute);
73            timePicker.setIs24HourView(DateFormat.is24HourFormat(context));
74
75            return builder.setView(timePicker)
76                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
77                        @Override
78                        public void onClick(DialogInterface dialog, int which) {
79                            listener.onTimeSet(TimePickerDialogFragment.this,
80                                    timePicker.getCurrentHour(), timePicker.getCurrentMinute());
81                        }
82                    }).setNegativeButton(android.R.string.cancel, null /* listener */)
83                    .create();
84        }
85    }
86
87    public static void show(Fragment fragment) {
88        show(fragment, -1 /* hour */, -1 /* minute */);
89    }
90
91    public static void show(Fragment parentFragment, int hourOfDay, int minute) {
92        if (!(parentFragment instanceof OnTimeSetListener)) {
93            throw new IllegalArgumentException("Fragment must implement OnTimeSetListener");
94        }
95
96        final FragmentManager manager = parentFragment.getChildFragmentManager();
97        if (manager == null || manager.isDestroyed()) {
98            return;
99        }
100
101        // Make sure the dialog isn't already added.
102        removeTimeEditDialog(manager);
103
104        final TimePickerDialogFragment fragment = new TimePickerDialogFragment();
105
106        final Bundle args = new Bundle();
107        if (hourOfDay >= 0 && hourOfDay < 24) {
108            args.putInt(ARG_HOUR, hourOfDay);
109        }
110        if (minute >= 0 && minute < 60) {
111            args.putInt(ARG_MINUTE, minute);
112        }
113
114        fragment.setArguments(args);
115        fragment.show(manager, TAG);
116    }
117
118    public static void removeTimeEditDialog(FragmentManager manager) {
119        if (manager != null) {
120            final Fragment prev = manager.findFragmentByTag(TAG);
121            if (prev != null) {
122                manager.beginTransaction().remove(prev).commit();
123            }
124        }
125    }
126
127    /**
128     * The callback interface used to indicate the user is done filling in the time (e.g. they
129     * clicked on the 'OK' button).
130     */
131    public interface OnTimeSetListener {
132        /**
133         * Called when the user is done setting a new time and the dialog has closed.
134         *
135         * @param fragment  the fragment associated with this listener
136         * @param hourOfDay the hour that was set
137         * @param minute    the minute that was set
138         */
139        void onTimeSet(TimePickerDialogFragment fragment, int hourOfDay, int minute);
140    }
141}
142