4646@ SuppressWarnings ("RestrictTo" )
4747public class CustomNavigationDrawerDemoActivity extends DemoActivity {
4848
49- @ RequiresApi (VERSION_CODES .UPSIDE_DOWN_CAKE )
50- private final OnBackAnimationCallback drawerOnBackAnimationCallback =
51- new OnBackAnimationCallback () {
52- @ Override
53- public void onBackStarted (@ NonNull BackEvent backEvent ) {
54- sideContainerBackHelper .startBackProgress (backEvent );
55- }
56-
57- @ Override
58- public void onBackProgressed (@ NonNull BackEvent backEvent ) {
59- DrawerLayout .LayoutParams drawerLayoutParams =
60- (LayoutParams ) currentDrawerView .getLayoutParams ();
61- sideContainerBackHelper .updateBackProgress (backEvent , drawerLayoutParams .gravity );
62- }
63-
64- @ Override
65- public void onBackInvoked () {
66- BackEvent backEvent = sideContainerBackHelper .onHandleBackInvoked ();
67- if (backEvent == null ) {
68- drawerLayout .closeDrawers ();
69- return ;
70- }
71-
72- DrawerLayout .LayoutParams drawerLayoutParams =
73- (LayoutParams ) currentDrawerView .getLayoutParams ();
74- int gravity = drawerLayoutParams .gravity ;
75- AnimatorListener scrimCloseAnimatorListener =
76- DrawerLayoutUtils .getScrimCloseAnimatorListener (drawerLayout , currentDrawerView );
77- AnimatorUpdateListener scrimCloseAnimatorUpdateListener =
78- DrawerLayoutUtils .getScrimCloseAnimatorUpdateListener (drawerLayout );
79-
80- sideContainerBackHelper .finishBackProgress (
81- backEvent , gravity , scrimCloseAnimatorListener , scrimCloseAnimatorUpdateListener );
82- }
83-
84- @ Override
85- public void onBackCancelled () {
86- sideContainerBackHelper .cancelBackProgress ();
87- }
88- };
89-
9049 private final OnBackPressedCallback drawerOnBackPressedCallback =
9150 new OnBackPressedCallback (/* enabled= */ true ) {
9251 @ Override
@@ -95,6 +54,8 @@ public void handleOnBackPressed() {
9554 }
9655 };
9756
57+ @ Nullable private OnBackAnimationCallback drawerOnBackAnimationCallback ;
58+
9859 private DrawerLayout drawerLayout ;
9960 private View currentDrawerView ;
10061 private MaterialSideContainerBackHelper sideContainerBackHelper ;
@@ -128,6 +89,9 @@ public void onDrawerOpened(@NonNull View drawerView) {
12889 sideContainerBackHelper = new MaterialSideContainerBackHelper (drawerView );
12990
13091 if (BuildCompat .isAtLeastU ()) {
92+ if (drawerOnBackAnimationCallback == null ) {
93+ drawerOnBackAnimationCallback = createOnBackAnimationCallback ();
94+ }
13195 drawerLayout .post (
13296 () ->
13397 getOnBackInvokedDispatcher ()
@@ -147,8 +111,11 @@ public void onDrawerClosed(@NonNull View drawerView) {
147111 sideContainerBackHelper = null ;
148112
149113 if (BuildCompat .isAtLeastU ()) {
150- getOnBackInvokedDispatcher ()
151- .unregisterOnBackInvokedCallback (drawerOnBackAnimationCallback );
114+ if (drawerOnBackAnimationCallback != null ) {
115+ getOnBackInvokedDispatcher ()
116+ .unregisterOnBackInvokedCallback (drawerOnBackAnimationCallback );
117+ drawerOnBackAnimationCallback = null ;
118+ }
152119 } else {
153120 drawerOnBackPressedCallback .remove ();
154121 }
@@ -166,4 +133,47 @@ public void onDrawerClosed(@NonNull View drawerView) {
166133 protected boolean shouldShowDefaultDemoActionBar () {
167134 return false ;
168135 }
136+
137+ @ RequiresApi (VERSION_CODES .UPSIDE_DOWN_CAKE )
138+ private OnBackAnimationCallback createOnBackAnimationCallback () {
139+ return new OnBackAnimationCallback () {
140+
141+ @ Override
142+ public void onBackStarted (@ NonNull BackEvent backEvent ) {
143+ sideContainerBackHelper .startBackProgress (backEvent );
144+ }
145+
146+ @ Override
147+ public void onBackProgressed (@ NonNull BackEvent backEvent ) {
148+ DrawerLayout .LayoutParams drawerLayoutParams =
149+ (LayoutParams ) currentDrawerView .getLayoutParams ();
150+ sideContainerBackHelper .updateBackProgress (backEvent , drawerLayoutParams .gravity );
151+ }
152+
153+ @ Override
154+ public void onBackInvoked () {
155+ BackEvent backEvent = sideContainerBackHelper .onHandleBackInvoked ();
156+ if (backEvent == null ) {
157+ drawerLayout .closeDrawers ();
158+ return ;
159+ }
160+
161+ DrawerLayout .LayoutParams drawerLayoutParams =
162+ (LayoutParams ) currentDrawerView .getLayoutParams ();
163+ int gravity = drawerLayoutParams .gravity ;
164+ AnimatorListener scrimCloseAnimatorListener =
165+ DrawerLayoutUtils .getScrimCloseAnimatorListener (drawerLayout , currentDrawerView );
166+ AnimatorUpdateListener scrimCloseAnimatorUpdateListener =
167+ DrawerLayoutUtils .getScrimCloseAnimatorUpdateListener (drawerLayout );
168+
169+ sideContainerBackHelper .finishBackProgress (
170+ backEvent , gravity , scrimCloseAnimatorListener , scrimCloseAnimatorUpdateListener );
171+ }
172+
173+ @ Override
174+ public void onBackCancelled () {
175+ sideContainerBackHelper .cancelBackProgress ();
176+ }
177+ };
178+ }
169179}
0 commit comments