From f335a509077e954a9ed5206947b7649425f2f04a Mon Sep 17 00:00:00 2001 From: afohrman Date: Wed, 26 Apr 2023 15:03:13 -0400 Subject: [PATCH] [Predictive Back][Side Sheet] Added predictive back support for modal side sheets. PiperOrigin-RevId: 527334991 --- .../material/sidesheet/SheetDialog.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/java/com/google/android/material/sidesheet/SheetDialog.java b/lib/java/com/google/android/material/sidesheet/SheetDialog.java index c2bde302b52..93e687704cf 100644 --- a/lib/java/com/google/android/material/sidesheet/SheetDialog.java +++ b/lib/java/com/google/android/material/sidesheet/SheetDialog.java @@ -43,6 +43,7 @@ import androidx.core.view.GravityCompat; import androidx.core.view.ViewCompat; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import com.google.android.material.motion.MaterialBackOrchestrator; import com.google.android.material.sidesheet.Sheet.StableSheetState; /** @@ -64,6 +65,8 @@ abstract class SheetDialog extends AppCompatDialog { private boolean canceledOnTouchOutside = true; private boolean canceledOnTouchOutsideSet; + @Nullable private MaterialBackOrchestrator backOrchestrator; + SheetDialog( @NonNull Context context, @StyleRes int theme, @@ -117,6 +120,20 @@ public void setCancelable(boolean cancelable) { if (this.cancelable != cancelable) { this.cancelable = cancelable; } + if (getWindow() != null) { + updateListeningForBackCallbacks(); + } + } + + private void updateListeningForBackCallbacks() { + if (backOrchestrator == null) { + return; + } + if (cancelable) { + backOrchestrator.startListeningForBackCallbacks(); + } else { + backOrchestrator.stopListeningForBackCallbacks(); + } } @Override @@ -131,6 +148,15 @@ protected void onStart() { public void onAttachedToWindow() { super.onAttachedToWindow(); maybeUpdateWindowAnimationsBasedOnLayoutDirection(); + updateListeningForBackCallbacks(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (backOrchestrator != null) { + backOrchestrator.stopListeningForBackCallbacks(); + } } /** @@ -190,6 +216,7 @@ private void ensureContainerAndBehavior() { sheet = container.findViewById(getDialogId()); behavior = getBehaviorFromSheet(sheet); addSheetCancelOnHideCallback(behavior); + backOrchestrator = new MaterialBackOrchestrator(behavior, sheet); } }