From 4442635aec49e9465a109e1d6ed669768828fc95 Mon Sep 17 00:00:00 2001 From: dsn5ft <1420597+dsn5ft@users.noreply.github.com> Date: Mon, 18 Sep 2023 22:41:52 +0000 Subject: [PATCH] [Catalog][Predictive Back][Side Sheet] Update side sheet state handling to be more accurate in demos Fixes inaccurate state label text and back callback enabled flag after rotation Resolves https://github.com/material-components/material-components-android/issues/3575 PiperOrigin-RevId: 566433974 (cherry picked from commit 357cf2d9ca79227a35c48903bf73270bc92e105c) --- .../sidesheet/SideSheetMainDemoFragment.java | 76 +++++++++++-------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java b/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java index 6ed7973b8f5..849a565bcc7 100644 --- a/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java +++ b/catalog/java/io/material/catalog/sidesheet/SideSheetMainDemoFragment.java @@ -186,7 +186,7 @@ private void setUpSheetGravityButtonToggleGroup(@NonNull View view) { }); } - private void setupBackHandling(SideSheetBehavior sideSheetBehavior) { + private void setupBackHandling(View sideSheet, SideSheetBehavior sideSheetBehavior) { OnBackPressedCallback nonModalOnBackPressedCallback = createNonModalOnBackPressedCallback(sideSheetBehavior); requireActivity().getOnBackPressedDispatcher().addCallback(this, nonModalOnBackPressedCallback); @@ -194,23 +194,30 @@ private void setupBackHandling(SideSheetBehavior sideSheetBehavior) { new SideSheetCallback() { @Override public void onStateChanged(@NonNull View sheet, int newState) { - switch (newState) { - case SideSheetBehavior.STATE_EXPANDED: - case SideSheetBehavior.STATE_SETTLING: - nonModalOnBackPressedCallback.setEnabled(true); - break; - case SideSheetBehavior.STATE_HIDDEN: - nonModalOnBackPressedCallback.setEnabled(false); - break; - case SideSheetBehavior.STATE_DRAGGING: - default: - break; - } + updateBackHandlingEnabled(nonModalOnBackPressedCallback, newState); } @Override public void onSlide(@NonNull View sheet, float slideOffset) {} }); + sideSheet.post( + () -> + updateBackHandlingEnabled(nonModalOnBackPressedCallback, sideSheetBehavior.getState())); + } + + private void updateBackHandlingEnabled(OnBackPressedCallback onBackPressedCallback, int state) { + switch (state) { + case SideSheetBehavior.STATE_EXPANDED: + case SideSheetBehavior.STATE_SETTLING: + onBackPressedCallback.setEnabled(true); + break; + case SideSheetBehavior.STATE_HIDDEN: + onBackPressedCallback.setEnabled(false); + break; + case SideSheetBehavior.STATE_DRAGGING: + default: + break; + } } private View setUpSideSheet( @@ -227,7 +234,7 @@ private View setUpSideSheet( View standardSideSheetCloseIconButton = sideSheet.findViewById(closeIconButtonId); standardSideSheetCloseIconButton.setOnClickListener(v -> hideSideSheet(sideSheetBehavior)); - setupBackHandling(sideSheetBehavior); + setupBackHandling(sideSheet, sideSheetBehavior); sideSheetViews.add(sideSheet); @@ -237,9 +244,10 @@ private View setUpSideSheet( private void setSideSheetCallback( View sideSheet, @IdRes int stateTextViewId, @IdRes int slideOffsetTextId) { SideSheetBehavior sideSheetBehavior = SideSheetBehavior.from(sideSheet); + TextView stateTextView = sideSheet.findViewById(stateTextViewId); sideSheetBehavior.addCallback( - createSideSheetCallback( - sideSheet.findViewById(stateTextViewId), sideSheet.findViewById(slideOffsetTextId))); + createSideSheetCallback(stateTextView, sideSheet.findViewById(slideOffsetTextId))); + sideSheet.post(() -> updateStateTextView(stateTextView, sideSheetBehavior.getState())); } private void setUpDetachedModalSheet() { @@ -373,22 +381,7 @@ private SideSheetCallback createSideSheetCallback( return new SideSheetCallback() { @Override public void onStateChanged(@NonNull View sheet, int newState) { - stateTextView.setVisibility(View.VISIBLE); - - switch (newState) { - case SideSheetBehavior.STATE_DRAGGING: - stateTextView.setText(R.string.cat_sidesheet_state_dragging); - break; - case SideSheetBehavior.STATE_EXPANDED: - stateTextView.setText(R.string.cat_sidesheet_state_expanded); - break; - case SideSheetBehavior.STATE_SETTLING: - stateTextView.setText(R.string.cat_sidesheet_state_settling); - break; - case SideSheetBehavior.STATE_HIDDEN: - default: - break; - } + updateStateTextView(stateTextView, newState); } @Override @@ -400,6 +393,25 @@ public void onSlide(@NonNull View sheet, float slideOffset) { }; } + private void updateStateTextView(@NonNull TextView stateTextView, int state) { + stateTextView.setVisibility(View.VISIBLE); + + switch (state) { + case SideSheetBehavior.STATE_DRAGGING: + stateTextView.setText(R.string.cat_sidesheet_state_dragging); + break; + case SideSheetBehavior.STATE_EXPANDED: + stateTextView.setText(R.string.cat_sidesheet_state_expanded); + break; + case SideSheetBehavior.STATE_SETTLING: + stateTextView.setText(R.string.cat_sidesheet_state_settling); + break; + case SideSheetBehavior.STATE_HIDDEN: + default: + break; + } + } + private OnBackPressedCallback createNonModalOnBackPressedCallback( SideSheetBehavior behavior) { return new OnBackPressedCallback(/* enabled= */ false) {