From e1ee959b1b6065de37da7a6648fe319b10cc13ca Mon Sep 17 00:00:00 2001 From: conradchen Date: Thu, 7 Apr 2022 11:16:52 -0400 Subject: [PATCH] [DatePicker] Fix edge-to-edge mode being applied multiple times When the date picker goes back from background to foreground, the onStart() method will be called and make enableEdgeToEdge() be called again. This will make it incorrectly use the header height and top padding already adjusted with system inset as the original height and padding, and thus add the inset multiple times. Creates a flag to only enable edge-to-edge once to fix the issue. Resolves https://github.com/material-components/material-components-android/issues/2628 PiperOrigin-RevId: 440110562 (cherry picked from commit c6a654c7dd68827a55d6d3dcda424cf6749678fa) --- .../material/datepicker/MaterialDatePicker.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java b/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java index aa31ce7525f..4d8a64218c2 100644 --- a/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java +++ b/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java @@ -141,6 +141,8 @@ public String getHeaderText() { @Nullable private MaterialShapeDrawable background; private Button confirmButton; + private boolean edgeToEdgeEnabled; + @NonNull static MaterialDatePicker newInstance(@NonNull Builder options) { MaterialDatePicker materialDatePickerDialogFragment = new MaterialDatePicker<>(); @@ -307,7 +309,7 @@ public void onStart() { if (fullscreen) { window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); window.setBackgroundDrawable(background); - enableEdgeToEdge(window); + enableEdgeToEdgeIfNeeded(window); } else { window.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); int inset = @@ -356,7 +358,11 @@ public final S getSelection() { return getDateSelector().getSelection(); } - private void enableEdgeToEdge(Window window) { + private void enableEdgeToEdgeIfNeeded(Window window) { + if (edgeToEdgeEnabled) { + // Avoid enabling edge-to-edge multiple times. + return; + } final View headerLayout = requireView().findViewById(R.id.fullscreen_header); EdgeToEdgeUtils.applyEdgeToEdge( window, true, ViewUtils.getBackgroundColor(headerLayout), null); @@ -380,6 +386,7 @@ public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) return insets; } }); + edgeToEdgeEnabled = true; } private void updateHeader() {