From 1252d4f2639b2c98136b3de5a1e16a0facc56a78 Mon Sep 17 00:00:00 2001 From: manabu-nakamura Date: Thu, 28 Sep 2023 14:48:40 +0000 Subject: [PATCH] [Catalog][Predictive Back][Navigation Drawer] Update navigation drawer state handling to be more accurate in custom drawer demo Partially addresses https://github.com/material-components/material-components-android/issues/3593 Resolves https://github.com/material-components/material-components-android/pull/3596 GIT_ORIGIN_REV_ID=9ca19b41473caa9bb303c7ac1ed2c5191cb4b081 PiperOrigin-RevId: 569180296 --- .../CustomNavigationDrawerDemoActivity.java | 74 +++++++++++-------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java b/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java index 19bbd0bfa0f..5f3726d0015 100644 --- a/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java +++ b/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java @@ -86,40 +86,12 @@ public View onCreateDemoView( new SimpleDrawerListener() { @Override public void onDrawerOpened(@NonNull View drawerView) { - currentDrawerView = drawerView; - sideContainerBackHelper = new MaterialSideContainerBackHelper(drawerView); - - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - if (drawerOnBackAnimationCallback == null) { - drawerOnBackAnimationCallback = createOnBackAnimationCallback(); - } - drawerLayout.post( - () -> - getOnBackInvokedDispatcher() - .registerOnBackInvokedCallback( - OnBackInvokedDispatcher.PRIORITY_OVERLAY, - drawerOnBackAnimationCallback)); - } else { - getOnBackPressedDispatcher() - .addCallback( - CustomNavigationDrawerDemoActivity.this, drawerOnBackPressedCallback); - } + registerBackCallback(drawerView); } @Override public void onDrawerClosed(@NonNull View drawerView) { - currentDrawerView = null; - sideContainerBackHelper = null; - - if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { - if (drawerOnBackAnimationCallback != null) { - getOnBackInvokedDispatcher() - .unregisterOnBackInvokedCallback(drawerOnBackAnimationCallback); - drawerOnBackAnimationCallback = null; - } - } else { - drawerOnBackPressedCallback.remove(); - } + unregisterBackCallback(); } }); @@ -127,9 +99,51 @@ public void onDrawerClosed(@NonNull View drawerView) { view.findViewById(R.id.show_end_drawer_gravity) .setOnClickListener(v -> drawerLayout.openDrawer(endDrawer)); + drawerLayout.post( + () -> { + View startDrawer = view.findViewById(R.id.custom_drawer_start); + if (drawerLayout.isDrawerOpen(startDrawer)) { + registerBackCallback(startDrawer); + } else if (drawerLayout.isDrawerOpen(endDrawer)) { + registerBackCallback(endDrawer); + } + }); + return view; } + private void registerBackCallback(@NonNull View drawerView) { + currentDrawerView = drawerView; + sideContainerBackHelper = new MaterialSideContainerBackHelper(drawerView); + + if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { + if (drawerOnBackAnimationCallback == null) { + drawerOnBackAnimationCallback = createOnBackAnimationCallback(); + } + drawerLayout.post( + () -> + getOnBackInvokedDispatcher() + .registerOnBackInvokedCallback( + OnBackInvokedDispatcher.PRIORITY_OVERLAY, drawerOnBackAnimationCallback)); + } else { + getOnBackPressedDispatcher().addCallback(this, drawerOnBackPressedCallback); + } + } + + private void unregisterBackCallback() { + currentDrawerView = null; + sideContainerBackHelper = null; + + if (VERSION.SDK_INT >= VERSION_CODES.UPSIDE_DOWN_CAKE) { + if (drawerOnBackAnimationCallback != null) { + getOnBackInvokedDispatcher().unregisterOnBackInvokedCallback(drawerOnBackAnimationCallback); + drawerOnBackAnimationCallback = null; + } + } else { + drawerOnBackPressedCallback.remove(); + } + } + @Override protected boolean shouldShowDefaultDemoActionBar() { return false;