diff --git a/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java b/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java index 11e3e13bceb..82c06fcd826 100644 --- a/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java +++ b/catalog/java/io/material/catalog/navigationdrawer/CustomNavigationDrawerDemoActivity.java @@ -46,47 +46,6 @@ @SuppressWarnings("RestrictTo") public class CustomNavigationDrawerDemoActivity extends DemoActivity { - @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) - private final OnBackAnimationCallback drawerOnBackAnimationCallback = - new OnBackAnimationCallback() { - @Override - public void onBackStarted(@NonNull BackEvent backEvent) { - sideContainerBackHelper.startBackProgress(backEvent); - } - - @Override - public void onBackProgressed(@NonNull BackEvent backEvent) { - DrawerLayout.LayoutParams drawerLayoutParams = - (LayoutParams) currentDrawerView.getLayoutParams(); - sideContainerBackHelper.updateBackProgress(backEvent, drawerLayoutParams.gravity); - } - - @Override - public void onBackInvoked() { - BackEvent backEvent = sideContainerBackHelper.onHandleBackInvoked(); - if (backEvent == null) { - drawerLayout.closeDrawers(); - return; - } - - DrawerLayout.LayoutParams drawerLayoutParams = - (LayoutParams) currentDrawerView.getLayoutParams(); - int gravity = drawerLayoutParams.gravity; - AnimatorListener scrimCloseAnimatorListener = - DrawerLayoutUtils.getScrimCloseAnimatorListener(drawerLayout, currentDrawerView); - AnimatorUpdateListener scrimCloseAnimatorUpdateListener = - DrawerLayoutUtils.getScrimCloseAnimatorUpdateListener(drawerLayout); - - sideContainerBackHelper.finishBackProgress( - backEvent, gravity, scrimCloseAnimatorListener, scrimCloseAnimatorUpdateListener); - } - - @Override - public void onBackCancelled() { - sideContainerBackHelper.cancelBackProgress(); - } - }; - private final OnBackPressedCallback drawerOnBackPressedCallback = new OnBackPressedCallback(/* enabled= */ true) { @Override @@ -95,6 +54,8 @@ public void handleOnBackPressed() { } }; + @Nullable private OnBackAnimationCallback drawerOnBackAnimationCallback; + private DrawerLayout drawerLayout; private View currentDrawerView; private MaterialSideContainerBackHelper sideContainerBackHelper; @@ -128,6 +89,9 @@ public void onDrawerOpened(@NonNull View drawerView) { sideContainerBackHelper = new MaterialSideContainerBackHelper(drawerView); if (BuildCompat.isAtLeastU()) { + if (drawerOnBackAnimationCallback == null) { + drawerOnBackAnimationCallback = createOnBackAnimationCallback(); + } drawerLayout.post( () -> getOnBackInvokedDispatcher() @@ -147,8 +111,11 @@ public void onDrawerClosed(@NonNull View drawerView) { sideContainerBackHelper = null; if (BuildCompat.isAtLeastU()) { - getOnBackInvokedDispatcher() - .unregisterOnBackInvokedCallback(drawerOnBackAnimationCallback); + if (drawerOnBackAnimationCallback != null) { + getOnBackInvokedDispatcher() + .unregisterOnBackInvokedCallback(drawerOnBackAnimationCallback); + drawerOnBackAnimationCallback = null; + } } else { drawerOnBackPressedCallback.remove(); } @@ -166,4 +133,47 @@ public void onDrawerClosed(@NonNull View drawerView) { protected boolean shouldShowDefaultDemoActionBar() { return false; } + + @RequiresApi(VERSION_CODES.UPSIDE_DOWN_CAKE) + private OnBackAnimationCallback createOnBackAnimationCallback() { + return new OnBackAnimationCallback() { + + @Override + public void onBackStarted(@NonNull BackEvent backEvent) { + sideContainerBackHelper.startBackProgress(backEvent); + } + + @Override + public void onBackProgressed(@NonNull BackEvent backEvent) { + DrawerLayout.LayoutParams drawerLayoutParams = + (LayoutParams) currentDrawerView.getLayoutParams(); + sideContainerBackHelper.updateBackProgress(backEvent, drawerLayoutParams.gravity); + } + + @Override + public void onBackInvoked() { + BackEvent backEvent = sideContainerBackHelper.onHandleBackInvoked(); + if (backEvent == null) { + drawerLayout.closeDrawers(); + return; + } + + DrawerLayout.LayoutParams drawerLayoutParams = + (LayoutParams) currentDrawerView.getLayoutParams(); + int gravity = drawerLayoutParams.gravity; + AnimatorListener scrimCloseAnimatorListener = + DrawerLayoutUtils.getScrimCloseAnimatorListener(drawerLayout, currentDrawerView); + AnimatorUpdateListener scrimCloseAnimatorUpdateListener = + DrawerLayoutUtils.getScrimCloseAnimatorUpdateListener(drawerLayout); + + sideContainerBackHelper.finishBackProgress( + backEvent, gravity, scrimCloseAnimatorListener, scrimCloseAnimatorUpdateListener); + } + + @Override + public void onBackCancelled() { + sideContainerBackHelper.cancelBackProgress(); + } + }; + } }