Skip to content

Commit 2ccc716

Browse files
gabrielemariottidsn5ft
authored andcommitted
[TimePicker] Added listeners
Resolves #1517 GIT_ORIGIN_REV_ID=be2559a45bff94592537183d46659df5a2a91056 PiperOrigin-RevId: 324215552
1 parent d8d3e0a commit 2ccc716

File tree

2 files changed

+156
-39
lines changed

2 files changed

+156
-39
lines changed

catalog/java/io/material/catalog/timepicker/TimePickerMainDemoFragment.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public View onCreateDemoView(
7979
materialTimePicker.setHour(hour);
8080
materialTimePicker.setMinute(minute);
8181

82-
materialTimePicker.setListener(dialog -> {
82+
materialTimePicker.addOnPositiveButtonClickListener(dialog -> {
8383
int newHour = dialog.getHour();
8484
int newMinute = dialog.getMinute();
8585
TimePickerMainDemoFragment.this.onTimeSet(newHour, newMinute);

lib/java/com/google/android/material/timepicker/MaterialTimePicker.java

Lines changed: 155 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818

1919
import com.google.android.material.R;
2020

21-
2221
import android.app.Dialog;
2322
import android.content.Context;
23+
import android.content.DialogInterface;
24+
import android.content.DialogInterface.OnCancelListener;
25+
import android.content.DialogInterface.OnDismissListener;
2426
import android.content.res.ColorStateList;
2527
import android.os.Bundle;
2628
import androidx.fragment.app.DialogFragment;
@@ -40,13 +42,20 @@
4042
import com.google.android.material.shape.MaterialShapeDrawable;
4143
import java.lang.annotation.Retention;
4244
import java.lang.annotation.RetentionPolicy;
45+
import java.util.LinkedHashSet;
46+
import java.util.Set;
4347

4448
/** A {@link Dialog} with a clock display and a clock face to choose the time. */
4549
public final class MaterialTimePicker extends DialogFragment {
4650

4751
private static final int CLOCK_ICON = R.drawable.ic_clock_black_24dp;
4852
private static final int KEYBOARD_ICON = R.drawable.ic_keyboard_black_24dp;
4953

54+
private final Set<OnPositiveButtonClickListener> positiveButtonListeners = new LinkedHashSet<>();
55+
private final Set<OnClickListener> negativeButtonListeners = new LinkedHashSet<>();
56+
private final Set<OnCancelListener> cancelListeners = new LinkedHashSet<>();
57+
private final Set<OnDismissListener> dismissListeners = new LinkedHashSet<>();
58+
5059
private TimePickerView timePickerView;
5160
private LinearLayout textInputView;
5261

@@ -70,26 +79,23 @@ public final class MaterialTimePicker extends DialogFragment {
7079
@InputMode private int inputMode = INPUT_MODE_CLOCK;
7180

7281
/**
73-
* The callback interface used to indicate the user is done filling in
74-
* the time (e.g. they clicked on the 'OK' button).
82+
* The callback interface used to indicate the user is done filling in the time (e.g. they clicked
83+
* on the 'OK' button).
7584
*/
76-
public interface OnTimeSetListener {
85+
public interface OnPositiveButtonClickListener {
7786

78-
/** **
79-
* Called when the user is done setting a new time and the dialog has
80-
* closed.
87+
/**
88+
* Called when the user is done setting a new time and the dialog has closed.
8189
*
82-
* <p> use {@link #getHour()}, {@link #getMinute()} to get the selection.
90+
* <p>use {@link #getHour()}, {@link #getMinute()} to get the selection.
8391
*
8492
* @param dialog the dialog associated with this listener
8593
*/
86-
void onTimeSet(MaterialTimePicker dialog);
94+
void onClick(MaterialTimePicker dialog);
8795
}
8896

8997
private TimeModel time = new TimeModel();
9098

91-
private OnTimeSetListener listener;
92-
9399
@NonNull
94100
public static MaterialTimePicker newInstance() {
95101
return new MaterialTimePicker();
@@ -135,21 +141,15 @@ public final Dialog onCreateDialog(@Nullable Bundle bundle) {
135141
context, R.attr.colorSurface, MaterialTimePicker.class.getCanonicalName());
136142

137143
MaterialShapeDrawable background =
138-
new MaterialShapeDrawable(
139-
context,
140-
null,
141-
0,
142-
R.style.Widget_MaterialComponents_TimePicker);
144+
new MaterialShapeDrawable(context, null, 0, R.style.Widget_MaterialComponents_TimePicker);
143145

144146
background.initializeElevationOverlay(context);
145147
background.setFillColor(ColorStateList.valueOf(surfaceColor));
146148
Window window = dialog.getWindow();
147149
window.setBackgroundDrawable(background);
148150
window.requestFeature(Window.FEATURE_NO_TITLE);
149151
// On some Android APIs the dialog won't wrap content by default. Explicitly update here.
150-
window.setLayout(
151-
ViewGroup.LayoutParams.WRAP_CONTENT,
152-
ViewGroup.LayoutParams.WRAP_CONTENT);
152+
window.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
153153

154154
return dialog;
155155
}
@@ -192,23 +192,28 @@ public final View onCreateView(
192192
modeButton = root.findViewById(R.id.material_timepicker_mode_button);
193193
updateInputMode(modeButton);
194194
MaterialButton okButton = root.findViewById(R.id.material_timepicker_ok_button);
195-
okButton.setOnClickListener(new OnClickListener() {
196-
@Override
197-
public void onClick(View v) {
198-
if (listener != null) {
199-
listener.onTimeSet(MaterialTimePicker.this);
200-
}
201-
dismiss();
202-
}
203-
});
195+
okButton.setOnClickListener(
196+
new OnClickListener() {
197+
@Override
198+
public void onClick(View v) {
199+
for (OnPositiveButtonClickListener listener : positiveButtonListeners) {
200+
listener.onClick(MaterialTimePicker.this);
201+
}
202+
dismiss();
203+
}
204+
});
204205

205206
MaterialButton cancelButton = root.findViewById(R.id.material_timepicker_cancel_button);
206-
cancelButton.setOnClickListener(new OnClickListener() {
207-
@Override
208-
public void onClick(View v) {
209-
dismiss();
210-
}
211-
});
207+
cancelButton.setOnClickListener(
208+
new OnClickListener() {
209+
@Override
210+
public void onClick(View v) {
211+
for (OnClickListener listener : negativeButtonListeners) {
212+
listener.onClick(v);
213+
}
214+
dismiss();
215+
}
216+
});
212217

213218
modeButton.setOnClickListener(
214219
new OnClickListener() {
@@ -222,6 +227,26 @@ public void onClick(View v) {
222227
return root;
223228
}
224229

230+
@Override
231+
public final void onCancel(@NonNull DialogInterface dialogInterface) {
232+
for (OnCancelListener listener : cancelListeners) {
233+
listener.onCancel(dialogInterface);
234+
}
235+
super.onCancel(dialogInterface);
236+
}
237+
238+
@Override
239+
public final void onDismiss(@NonNull DialogInterface dialogInterface) {
240+
for (OnDismissListener listener : dismissListeners) {
241+
listener.onDismiss(dialogInterface);
242+
}
243+
ViewGroup viewGroup = ((ViewGroup) getView());
244+
if (viewGroup != null) {
245+
viewGroup.removeAllViews();
246+
}
247+
super.onDismiss(dialogInterface);
248+
}
249+
225250
private void updateInputMode(MaterialButton modeButton) {
226251
if (activePresenter != null) {
227252
activePresenter.hide();
@@ -262,12 +287,104 @@ private static int iconForMode(@InputMode int mode) {
262287
}
263288
}
264289

265-
public void setListener(@Nullable OnTimeSetListener listener) {
266-
this.listener = listener;
267-
}
268-
269290
@Nullable
270291
TimePickerClockPresenter getTimePickerClockPresenter() {
271292
return timePickerClockPresenter;
272293
}
294+
295+
/** The supplied listener is called when the user confirms a valid selection. */
296+
public boolean addOnPositiveButtonClickListener(
297+
OnPositiveButtonClickListener onPositiveButtonClickListener) {
298+
return positiveButtonListeners.add(onPositiveButtonClickListener);
299+
}
300+
301+
/**
302+
* Removes a listener previously added via {@link
303+
* MaterialTimePicker#addOnPositiveButtonClickListener(OnPositiveButtonClickListener)}.
304+
*/
305+
public boolean removeOnPositiveButtonClickListener(
306+
@NonNull OnPositiveButtonClickListener listener) {
307+
return positiveButtonListeners.remove(listener);
308+
}
309+
310+
/**
311+
* Removes all listeners added via {@link
312+
* MaterialTimePicker#addOnPositiveButtonClickListener(OnPositiveButtonClickListener)}.
313+
*/
314+
public void clearOnPositiveButtonClickListeners() {
315+
positiveButtonListeners.clear();
316+
}
317+
318+
/** The supplied listener is called when the user clicks the cancel button. */
319+
public boolean addOnNegativeButtonClickListener(@NonNull OnClickListener listener) {
320+
return negativeButtonListeners.add(listener);
321+
}
322+
323+
/**
324+
* Removes a listener previously added via {@link
325+
* MaterialTimePicker#addOnNegativeButtonClickListener(OnClickListener)}.
326+
*/
327+
public boolean removeOnNegativeButtonClickListener(@NonNull OnClickListener listener) {
328+
return negativeButtonListeners.remove(listener);
329+
}
330+
331+
/**
332+
* Removes all listeners added via {@link
333+
* MaterialTimePicker#addOnNegativeButtonClickListener(OnClickListener)}.
334+
*/
335+
public void clearOnNegativeButtonClickListeners() {
336+
negativeButtonListeners.clear();
337+
}
338+
339+
/**
340+
* The supplied listener is called when the user cancels the picker via back button or a touch
341+
* outside the view.
342+
*
343+
* <p>It is not called when the user clicks the cancel button. To add a listener for use when the
344+
* user clicks the cancel button, use {@link
345+
* MaterialTimePicker#addOnNegativeButtonClickListener(OnClickListener)}.
346+
*/
347+
public boolean addOnCancelListener(@NonNull OnCancelListener listener) {
348+
return cancelListeners.add(listener);
349+
}
350+
351+
/**
352+
* Removes a listener previously added via {@link
353+
* MaterialTimePicker#addOnCancelListener(OnCancelListener)}.
354+
*/
355+
public boolean removeOnCancelListener(@NonNull OnCancelListener listener) {
356+
return cancelListeners.remove(listener);
357+
}
358+
359+
/**
360+
* Removes all listeners added via {@link
361+
* MaterialTimePicker#addOnCancelListener(OnCancelListener)}.
362+
*/
363+
public void clearOnCancelListeners() {
364+
cancelListeners.clear();
365+
}
366+
367+
/**
368+
* The supplied listener is called whenever the DialogFragment is dismissed, no matter how it is
369+
* dismissed.
370+
*/
371+
public boolean addOnDismissListener(@NonNull OnDismissListener listener) {
372+
return dismissListeners.add(listener);
373+
}
374+
375+
/**
376+
* Removes a listener previously added via {@link
377+
* MaterialTimePicker#addOnDismissListener(OnDismissListener)}.
378+
*/
379+
public boolean removeOnDismissListener(@NonNull OnDismissListener listener) {
380+
return dismissListeners.remove(listener);
381+
}
382+
383+
/**
384+
* Removes all listeners added via {@link
385+
* MaterialTimePicker#addOnDismissListener(OnDismissListener)}.
386+
*/
387+
public void clearOnDismissListeners() {
388+
dismissListeners.clear();
389+
}
273390
}

0 commit comments

Comments
 (0)