@@ -301,6 +301,7 @@ public void run() {
301301 screenHeight - getViewAbsoluteBottom () + (int ) view .getTranslationY ();
302302 if (currentInsetBottom >= extraBottomMarginGestureInset ) {
303303 // No need to add extra offset if view is already outside of bottom gesture area
304+ appliedBottomMarginGestureInset = extraBottomMarginGestureInset ;
304305 return ;
305306 }
306307
@@ -312,6 +313,8 @@ public void run() {
312313 return ;
313314 }
314315
316+ appliedBottomMarginGestureInset = extraBottomMarginGestureInset ;
317+
315318 // Move view outside of bottom gesture area
316319 MarginLayoutParams marginParams = (MarginLayoutParams ) layoutParams ;
317320 marginParams .bottomMargin += extraBottomMarginGestureInset - currentInsetBottom ;
@@ -322,9 +325,11 @@ public void run() {
322325 private int extraBottomMarginWindowInset ;
323326 private int extraLeftMarginWindowInset ;
324327 private int extraRightMarginWindowInset ;
325- private int extraBottomMarginGestureInset ;
326328 private int extraBottomMarginAnchorView ;
327329
330+ private int extraBottomMarginGestureInset ;
331+ private int appliedBottomMarginGestureInset ;
332+
328333 private boolean pendingShowingView ;
329334
330335 private List <BaseCallback <B >> callbacks ;
@@ -455,10 +460,16 @@ public boolean performAccessibilityAction(View host, int action, Bundle args) {
455460
456461 private void updateMargins () {
457462 LayoutParams layoutParams = view .getLayoutParams ();
458- if (!(layoutParams instanceof MarginLayoutParams ) || view . originalMargins == null ) {
463+ if (!(layoutParams instanceof MarginLayoutParams )) {
459464 Log .w (TAG , "Unable to update margins because layout params are not MarginLayoutParams" );
460465 return ;
461466 }
467+
468+ if (view .originalMargins == null ) {
469+ Log .w (TAG , "Unable to update margins because original view margins are not set" );
470+ return ;
471+ }
472+
462473 if (view .getParent () == null ) {
463474 // Parent will set layout params to view again. Wait for addView() is done to update layout
464475 // params, in case we save the already updated margins as the original margins.
@@ -467,17 +478,32 @@ private void updateMargins() {
467478
468479 int extraBottomMargin =
469480 getAnchorView () != null ? extraBottomMarginAnchorView : extraBottomMarginWindowInset ;
470- MarginLayoutParams marginParams = (MarginLayoutParams ) layoutParams ;
471- marginParams .bottomMargin = view .originalMargins .bottom + extraBottomMargin ;
472- marginParams .leftMargin = view .originalMargins .left + extraLeftMarginWindowInset ;
473- marginParams .rightMargin = view .originalMargins .right + extraRightMarginWindowInset ;
474- marginParams .topMargin = view .originalMargins .top ;
475- view .requestLayout ();
476481
477- if (VERSION .SDK_INT >= VERSION_CODES .Q && shouldUpdateGestureInset ()) {
478- // Ensure there is only one gesture inset runnable running at a time
479- view .removeCallbacks (bottomMarginGestureInsetRunnable );
480- view .post (bottomMarginGestureInsetRunnable );
482+ MarginLayoutParams marginParams = (MarginLayoutParams ) layoutParams ;
483+ int newBottomMargin = view .originalMargins .bottom + extraBottomMargin ;
484+ int newLeftMargin = view .originalMargins .left + extraLeftMarginWindowInset ;
485+ int newRightMargin = view .originalMargins .right + extraRightMarginWindowInset ;
486+ int newTopMargin = view .originalMargins .top ;
487+
488+ boolean marginChanged =
489+ marginParams .bottomMargin != newBottomMargin
490+ || marginParams .leftMargin != newLeftMargin
491+ || marginParams .rightMargin != newRightMargin
492+ || marginParams .topMargin != newTopMargin ;
493+ if (marginChanged ) {
494+ marginParams .bottomMargin = newBottomMargin ;
495+ marginParams .leftMargin = newLeftMargin ;
496+ marginParams .rightMargin = newRightMargin ;
497+ marginParams .topMargin = newTopMargin ;
498+ view .requestLayout ();
499+ }
500+
501+ if (marginChanged || appliedBottomMarginGestureInset != extraBottomMarginGestureInset ) {
502+ if (VERSION .SDK_INT >= VERSION_CODES .Q && shouldUpdateGestureInset ()) {
503+ // Ensure there is only one gesture inset runnable running at a time
504+ view .removeCallbacks (bottomMarginGestureInsetRunnable );
505+ view .post (bottomMarginGestureInsetRunnable );
506+ }
481507 }
482508 }
483509
@@ -870,11 +896,7 @@ public void onDragStateChanged(int state) {
870896 }
871897
872898 private void recalculateAndUpdateMargins () {
873- int newBottomMarginAnchorView = calculateBottomMarginForAnchorView ();
874- if (newBottomMarginAnchorView == extraBottomMarginAnchorView ) {
875- return ;
876- }
877- extraBottomMarginAnchorView = newBottomMarginAnchorView ;
899+ extraBottomMarginAnchorView = calculateBottomMarginForAnchorView ();
878900 updateMargins ();
879901 }
880902
0 commit comments