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));
     }