From c0fb5ad1afae83e4e369aaab2bb100bb624ef39c Mon Sep 17 00:00:00 2001 From: ldjesper Date: Wed, 3 Jul 2019 15:46:13 -0400 Subject: [PATCH] Fix Date Picker Catalog Demo to retain listeners PiperOrigin-RevId: 256421089 --- .../picker/PickerMainDemoFragment.java | 75 +++++++++---------- .../material/picker/MaterialDatePicker.java | 8 +- 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/catalog/java/io/material/catalog/picker/PickerMainDemoFragment.java b/catalog/java/io/material/catalog/picker/PickerMainDemoFragment.java index 6d73ee2fd..1dc8f1458 100644 --- a/catalog/java/io/material/catalog/picker/PickerMainDemoFragment.java +++ b/catalog/java/io/material/catalog/picker/PickerMainDemoFragment.java @@ -18,7 +18,6 @@ package io.material.catalog.picker; import io.material.catalog.R; import android.app.DatePickerDialog; -import android.app.Dialog; import android.os.Bundle; import androidx.annotation.Nullable; import androidx.annotation.StringRes; @@ -26,7 +25,6 @@ import androidx.annotation.StyleRes; import com.google.android.material.button.MaterialButton; import com.google.android.material.resources.MaterialAttributes; import com.google.android.material.snackbar.Snackbar; -import androidx.fragment.app.DialogFragment; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -57,58 +55,62 @@ public class PickerMainDemoFragment extends DemoFragment { MaterialAttributes.resolveOrThrow( getContext(), R.attr.materialCalendarFullscreenTheme, getClass().getCanonicalName()); - MaterialDatePicker datePicker = MaterialDatePicker.Builder.datePicker().build(); - addSnackBarListeners(datePicker); - addDialogLauncher( - dialogLaunchersLayout, R.string.cat_picker_date_calendar, buildOnClickListener(datePicker)); - - MaterialDatePicker datePickerFSTheme = - MaterialDatePicker.Builder.datePicker().setTheme(fullscreenTheme).build(); - addSnackBarListeners(datePickerFSTheme); - addDialogLauncher( + setupDialogFragment( + dialogLaunchersLayout, + R.string.cat_picker_date_calendar, + MaterialDatePicker.Builder.datePicker()); + setupDialogFragment( dialogLaunchersLayout, R.string.cat_picker_date_calendar_fullscreen, - buildOnClickListener(datePickerFSTheme)); - - MaterialDatePicker rangePicker = MaterialDatePicker.Builder.dateRangePicker().build(); - addSnackBarListeners(rangePicker); - addDialogLauncher( + MaterialDatePicker.Builder.datePicker().setTheme(fullscreenTheme)); + setupDialogFragment( dialogLaunchersLayout, R.string.cat_picker_date_range_calendar, - buildOnClickListener(rangePicker)); - - MaterialDatePicker rangePickerDialogTheme = - MaterialDatePicker.Builder.dateRangePicker().setTheme(dialogTheme).build(); - addSnackBarListeners(rangePickerDialogTheme); - addDialogLauncher( + MaterialDatePicker.Builder.dateRangePicker()); + setupDialogFragment( dialogLaunchersLayout, R.string.cat_picker_date_range_calendar_dialog, - buildOnClickListener(rangePickerDialogTheme)); + MaterialDatePicker.Builder.dateRangePicker().setTheme(dialogTheme)); layoutInflater.inflate(R.layout.cat_picker_spacer, dialogLaunchersLayout, true); - addDialogLauncher( - dialogLaunchersLayout, - R.string.cat_picker_base, - buildOnClickListener(frameworkTodayDatePicker(0))); + dialogLaunchersLayout, R.string.cat_picker_base, v -> frameworkTodayDatePicker(0).show()); return view; } // This demo is for a transient API. Once the API is set, the RestrictTo will be removed. @SuppressWarnings("RestrictTo") - private void addSnackBarListeners(MaterialDatePicker materialDatePicker) { - materialDatePicker.addOnPositiveButtonClickListener( + private void setupDialogFragment( + ViewGroup dialogLaunchersLayout, + @StringRes int tagId, + MaterialDatePicker.Builder builder) { + String tag = getString(tagId); + final MaterialDatePicker materialCalendarPicker; + if (getFragmentManager().findFragmentByTag(tag) == null) { + materialCalendarPicker = builder.build(); + } else { + materialCalendarPicker = (MaterialDatePicker) getFragmentManager().findFragmentByTag(tag); + } + addSnackBarListeners(materialCalendarPicker); + addDialogLauncher( + dialogLaunchersLayout, tagId, v -> materialCalendarPicker.show(getFragmentManager(), tag)); + } + + // This demo is for a transient API. Once the API is set, the RestrictTo will be removed. + @SuppressWarnings("RestrictTo") + private void addSnackBarListeners(MaterialDatePicker materialCalendarPicker) { + materialCalendarPicker.addOnPositiveButtonClickListener( selection -> { - snackbar.setText(materialDatePicker.getHeaderText()); + snackbar.setText(materialCalendarPicker.getHeaderText()); snackbar.show(); }); - materialDatePicker.addOnNegativeButtonClickListener( + materialCalendarPicker.addOnNegativeButtonClickListener( dialog -> { snackbar.setText(R.string.cat_picker_user_clicked_cancel); snackbar.show(); }); - materialDatePicker.addOnCancelListener( + materialCalendarPicker.addOnCancelListener( dialog -> { snackbar.setText(R.string.cat_picker_cancel); snackbar.show(); @@ -123,14 +125,6 @@ public class PickerMainDemoFragment extends DemoFragment { return R.style.ThemeOverlay_MaterialComponents_MaterialAlertDialog_Picker_Date_Calendar; } - private OnClickListener buildOnClickListener(Dialog dialog) { - return v -> dialog.show(); - } - - private OnClickListener buildOnClickListener(DialogFragment dialogFragment) { - return v -> dialogFragment.show(getFragmentManager(), "Calendar Fragment"); - } - private void addDialogLauncher( ViewGroup viewGroup, @StringRes int stringResId, OnClickListener onClickListener) { MaterialButton dialogLauncherButton = new MaterialButton(viewGroup.getContext()); @@ -146,5 +140,4 @@ public class PickerMainDemoFragment extends DemoFragment { int day = calendar.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getContext(), themeResId, null, year, month, day); } - } diff --git a/lib/java/com/google/android/material/picker/MaterialDatePicker.java b/lib/java/com/google/android/material/picker/MaterialDatePicker.java index c58000e51..2846a0cd0 100644 --- a/lib/java/com/google/android/material/picker/MaterialDatePicker.java +++ b/lib/java/com/google/android/material/picker/MaterialDatePicker.java @@ -126,15 +126,15 @@ public class MaterialDatePicker extends DialogFragment { private CheckableImageButton headerToggleButton; private MaterialShapeDrawable background; - static MaterialDatePicker newInstance(MaterialDatePicker.Builder options) { - MaterialDatePicker materialDateRangePickerDialogFragment = new MaterialDatePicker<>(); + static MaterialDatePicker newInstance(Builder options) { + MaterialDatePicker materialDatePickerDialogFragment = new MaterialDatePicker<>(); Bundle args = new Bundle(); args.putInt(OVERRIDE_THEME_RES_ID, options.overrideThemeResId); args.putParcelable(GRID_SELECTOR_KEY, options.gridSelector); args.putParcelable(CALENDAR_BOUNDS_KEY, options.calendarBounds); args.putInt(TITLE_TEXT_RES_ID_KEY, options.titleTextResId); - materialDateRangePickerDialogFragment.setArguments(args); - return materialDateRangePickerDialogFragment; + materialDatePickerDialogFragment.setArguments(args); + return materialDatePickerDialogFragment; } @Override