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 
17 package com.android.deskclock.alarms;
18 
19 import android.app.Dialog;
20 import android.app.DialogFragment;
21 import android.app.Fragment;
22 import android.app.FragmentManager;
23 import android.app.TimePickerDialog;
24 import android.content.Context;
25 import android.content.DialogInterface;
26 import android.os.Bundle;
27 import androidx.appcompat.app.AlertDialog;
28 import android.text.format.DateFormat;
29 import android.widget.TimePicker;
30 
31 import com.android.deskclock.Utils;
32 
33 import java.util.Calendar;
34 
35 /**
36  * DialogFragment used to show TimePicker.
37  */
38 public 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")
onCreateDialog(Bundle savedInstanceState)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