Skip to content

Commit abd1d1c

Browse files
pubiqqhunterstich
authored andcommitted
[Snackbar] Fix the snackbar position when the anchor view layout listener is enabled
Resolves #3211 Resolves: #3194 GIT_ORIGIN_REV_ID=ef12e5c4f6c6ec49287a472ba1243c20cc2ac979 PiperOrigin-RevId: 509892239
1 parent 6166e73 commit abd1d1c

File tree

1 file changed

+39
-17
lines changed

1 file changed

+39
-17
lines changed

lib/java/com/google/android/material/snackbar/BaseTransientBottomBar.java

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)