Merge "Fix inset edge of CoordinatorLayout" into nyc-support-24.1-dev
diff --git a/design/src/android/support/design/widget/CoordinatorLayout.java b/design/src/android/support/design/widget/CoordinatorLayout.java
index 7173b6b..9420920 100644
--- a/design/src/android/support/design/widget/CoordinatorLayout.java
+++ b/design/src/android/support/design/widget/CoordinatorLayout.java
@@ -1282,7 +1282,7 @@
}
private void offsetChildByInset(View child, Rect inset, int layoutDirection) {
- LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
final int absDodgeInsetEdges = GravityCompat.getAbsoluteGravity(lp.dodgeInsetEdges,
layoutDirection);
@@ -1295,31 +1295,43 @@
rect.set(child.getLeft(), child.getTop(), child.getRight(), child.getBottom());
}
- switch (absDodgeInsetEdges & Gravity.VERTICAL_GRAVITY_MASK) {
- case Gravity.TOP: {
- int distance = rect.top - lp.topMargin - lp.mInsetOffsetY;
- setInsetOffsetY(child, Math.max(0, inset.top - distance));
- break;
- }
- case Gravity.BOTTOM: {
- int distance = getHeight() - rect.bottom - lp.bottomMargin + lp.mInsetOffsetY;
- setInsetOffsetY(child, Math.min(0, distance - inset.bottom));
- break;
+ boolean offsetY = false;
+ if ((absDodgeInsetEdges & Gravity.TOP) == Gravity.TOP) {
+ int distance = rect.top - lp.topMargin - lp.mInsetOffsetY;
+ if (distance < inset.top) {
+ setInsetOffsetY(child, inset.top - distance);
+ offsetY = true;
}
}
+ if ((absDodgeInsetEdges & Gravity.BOTTOM) == Gravity.BOTTOM) {
+ int distance = getHeight() - rect.bottom - lp.bottomMargin + lp.mInsetOffsetY;
+ if (distance < inset.bottom) {
+ setInsetOffsetY(child, distance - inset.bottom);
+ offsetY = true;
+ }
+ }
+ if (!offsetY) {
+ setInsetOffsetY(child, 0);
+ }
- switch (absDodgeInsetEdges & Gravity.HORIZONTAL_GRAVITY_MASK) {
- case Gravity.LEFT: {
- int distance = rect.left - lp.leftMargin - lp.mInsetOffsetX;
- setInsetOffsetX(child, Math.max(0, inset.left - distance));
- break;
+ boolean offsetX = false;
+ if ((absDodgeInsetEdges & Gravity.LEFT) == Gravity.LEFT) {
+ int distance = rect.left - lp.leftMargin - lp.mInsetOffsetX;
+ if (distance < inset.left) {
+ setInsetOffsetX(child, inset.left - distance);
+ offsetX = true;
}
- case Gravity.RIGHT: {
- int distance = getWidth() - rect.right - lp.rightMargin + lp.mInsetOffsetX;
- setInsetOffsetX(child, Math.min(0, distance - inset.right));
- break;
+ }
+ if ((absDodgeInsetEdges & Gravity.RIGHT) == Gravity.RIGHT) {
+ int distance = getWidth() - rect.right - lp.rightMargin + lp.mInsetOffsetX;
+ if (distance < inset.right) {
+ setInsetOffsetX(child, distance - inset.right);
+ offsetX = true;
}
}
+ if (!offsetX) {
+ setInsetOffsetX(child, 0);
+ }
}
private void setInsetOffsetX(View child, int offsetX) {
@@ -2798,18 +2810,10 @@
* Checks whether the view with this LayoutParams should dodge the specified view.
*/
private boolean shouldDodge(View other, int layoutDirection) {
- LayoutParams otherLp = (LayoutParams) other.getLayoutParams();
- final int absInset = GravityCompat.getAbsoluteGravity(
- otherLp.insetEdge, layoutDirection);
- if (absInset != Gravity.NO_GRAVITY) {
- final int absDodge = GravityCompat.getAbsoluteGravity(
- dodgeInsetEdges, layoutDirection);
- return (absInset & Gravity.HORIZONTAL_GRAVITY_MASK)
- == (absDodge & Gravity.HORIZONTAL_GRAVITY_MASK)
- || (absInset & Gravity.VERTICAL_GRAVITY_MASK)
- == (absDodge & Gravity.VERTICAL_GRAVITY_MASK);
- }
- return false;
+ LayoutParams lp = (LayoutParams) other.getLayoutParams();
+ final int absInset = GravityCompat.getAbsoluteGravity(lp.insetEdge, layoutDirection);
+ return absInset != Gravity.NO_GRAVITY && (absInset &
+ GravityCompat.getAbsoluteGravity(dodgeInsetEdges, layoutDirection)) == absInset;
}
}
diff --git a/design/src/android/support/design/widget/Snackbar.java b/design/src/android/support/design/widget/Snackbar.java
index 47c5a49..bc5df7f 100644
--- a/design/src/android/support/design/widget/Snackbar.java
+++ b/design/src/android/support/design/widget/Snackbar.java
@@ -477,7 +477,7 @@
});
clp.setBehavior(behavior);
// Also set the inset edge so that views can dodge the snackbar correctly
- clp.insetEdge = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
+ clp.insetEdge = Gravity.BOTTOM;
}
mTargetParent.addView(mView);
diff --git a/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java b/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java
index 724e21a..c6b6e3b 100644
--- a/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java
+++ b/design/tests/src/android/support/design/widget/CoordinatorLayoutTest.java
@@ -106,20 +106,46 @@
@Test
public void testInsetDependency() {
final CoordinatorLayout col = mActivityTestRule.getActivity().mCoordinatorLayout;
+
final CoordinatorLayout.LayoutParams lpInsetLeft = col.generateDefaultLayoutParams();
lpInsetLeft.insetEdge = Gravity.LEFT;
+
+ final CoordinatorLayout.LayoutParams lpInsetRight = col.generateDefaultLayoutParams();
+ lpInsetRight.insetEdge = Gravity.RIGHT;
+
final CoordinatorLayout.LayoutParams lpInsetTop = col.generateDefaultLayoutParams();
lpInsetTop.insetEdge = Gravity.TOP;
+
+ final CoordinatorLayout.LayoutParams lpInsetBottom = col.generateDefaultLayoutParams();
+ lpInsetBottom.insetEdge = Gravity.BOTTOM;
+
final CoordinatorLayout.LayoutParams lpDodgeLeft = col.generateDefaultLayoutParams();
lpDodgeLeft.dodgeInsetEdges = Gravity.LEFT;
+
final CoordinatorLayout.LayoutParams lpDodgeLeftAndTop = col.generateDefaultLayoutParams();
lpDodgeLeftAndTop.dodgeInsetEdges = Gravity.LEFT | Gravity.TOP;
+
+ final CoordinatorLayout.LayoutParams lpDodgeAll = col.generateDefaultLayoutParams();
+ lpDodgeAll.dodgeInsetEdges = Gravity.FILL;
+
final View a = new View(col.getContext());
final View b = new View(col.getContext());
+
assertThat(dependsOn(lpDodgeLeft, lpInsetLeft, col, a, b), is(true));
+ assertThat(dependsOn(lpDodgeLeft, lpInsetRight, col, a, b), is(false));
assertThat(dependsOn(lpDodgeLeft, lpInsetTop, col, a, b), is(false));
+ assertThat(dependsOn(lpDodgeLeft, lpInsetBottom, col, a, b), is(false));
+
assertThat(dependsOn(lpDodgeLeftAndTop, lpInsetLeft, col, a, b), is(true));
+ assertThat(dependsOn(lpDodgeLeftAndTop, lpInsetRight, col, a, b), is(false));
assertThat(dependsOn(lpDodgeLeftAndTop, lpInsetTop, col, a, b), is(true));
+ assertThat(dependsOn(lpDodgeLeftAndTop, lpInsetBottom, col, a, b), is(false));
+
+ assertThat(dependsOn(lpDodgeAll, lpInsetLeft, col, a, b), is(true));
+ assertThat(dependsOn(lpDodgeAll, lpInsetRight, col, a, b), is(true));
+ assertThat(dependsOn(lpDodgeAll, lpInsetTop, col, a, b), is(true));
+ assertThat(dependsOn(lpDodgeAll, lpInsetBottom, col, a, b), is(true));
+
assertThat(dependsOn(lpInsetLeft, lpDodgeLeft, col, a, b), is(false));
}