diff --git a/src/android/support/design/widget/FloatingActionButton.java b/src/android/support/design/widget/FloatingActionButton.java
index 4bc4394d7..e09c2233c 100644
--- a/src/android/support/design/widget/FloatingActionButton.java
+++ b/src/android/support/design/widget/FloatingActionButton.java
@@ -774,13 +774,13 @@ public class FloatingActionButton extends VisibilityAwareImageButton {
int offsetTB = 0, offsetLR = 0;
if (fab.getRight() >= parent.getWidth() - lp.rightMargin) {
- // If we're on the left edge, shift it the right
+ // If we're on the right edge, shift it the right
offsetLR = padding.right;
} else if (fab.getLeft() <= lp.leftMargin) {
// If we're on the left edge, shift it the left
offsetLR = -padding.left;
}
- if (fab.getBottom() >= parent.getBottom() - lp.bottomMargin) {
+ if (fab.getBottom() >= parent.getHeight() - lp.bottomMargin) {
// If we're on the bottom edge, shift it down
offsetTB = padding.bottom;
} else if (fab.getTop() <= lp.topMargin) {
diff --git a/tests/res/layout/design_fab.xml b/tests/res/layout/design_fab.xml
index cecd5a4b8..f8710299e 100644
--- a/tests/res/layout/design_fab.xml
+++ b/tests/res/layout/design_fab.xml
@@ -15,7 +15,8 @@
limitations under the License.
-->
-
-
+
diff --git a/tests/src/android/support/design/testutils/FloatingActionButtonActions.java b/tests/src/android/support/design/testutils/FloatingActionButtonActions.java
index bc80607fd..ad8068b4c 100644
--- a/tests/src/android/support/design/testutils/FloatingActionButtonActions.java
+++ b/tests/src/android/support/design/testutils/FloatingActionButtonActions.java
@@ -21,6 +21,7 @@ import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFro
import android.content.res.ColorStateList;
import android.support.annotation.ColorInt;
import android.support.annotation.DrawableRes;
+import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
@@ -102,4 +103,30 @@ public class FloatingActionButtonActions {
};
}
+ public static ViewAction setLayoutGravity(final int gravity) {
+ return new ViewAction() {
+ @Override
+ public Matcher getConstraints() {
+ return isAssignableFrom(View.class);
+ }
+
+ @Override
+ public String getDescription() {
+ return "Sets Views layout_gravity";
+ }
+
+ @Override
+ public void perform(UiController uiController, View view) {
+ uiController.loopMainThreadUntilIdle();
+
+ CoordinatorLayout.LayoutParams lp =
+ (CoordinatorLayout.LayoutParams) view.getLayoutParams();
+ lp.gravity = gravity;
+ view.requestLayout();
+
+ uiController.loopMainThreadUntilIdle();
+ }
+ };
+ }
+
}
diff --git a/tests/src/android/support/design/testutils/TestUtilsMatchers.java b/tests/src/android/support/design/testutils/TestUtilsMatchers.java
index 357ed441e..b4830e5db 100644
--- a/tests/src/android/support/design/testutils/TestUtilsMatchers.java
+++ b/tests/src/android/support/design/testutils/TestUtilsMatchers.java
@@ -16,14 +16,19 @@
package android.support.design.testutils;
+import static org.junit.Assert.assertEquals;
+
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.design.widget.FloatingActionButton;
import android.support.test.espresso.matcher.BoundedMatcher;
+import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewCompat;
+import android.view.Gravity;
import android.view.View;
+import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ImageView;
import android.widget.TextView;
@@ -353,4 +358,61 @@ public class TestUtilsMatchers {
}
};
}
+
+ /**
+ * Returns a matcher that matches FloatingActionButtons with the specified gravity.
+ */
+ public static Matcher withFabContentAreaOnMargins(final int gravity) {
+ return new BoundedMatcher(View.class) {
+ private String failedCheckDescription;
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText(failedCheckDescription);
+ }
+
+ @Override
+ public boolean matchesSafely(final View view) {
+ if (!(view instanceof FloatingActionButton)) {
+ return false;
+ }
+
+ final FloatingActionButton fab = (FloatingActionButton) view;
+ final ViewGroup.MarginLayoutParams lp =
+ (ViewGroup.MarginLayoutParams) fab.getLayoutParams();
+ final ViewGroup parent = (ViewGroup) view.getParent();
+
+ final Rect area = new Rect();
+ fab.getContentRect(area);
+
+ final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
+ ViewCompat.getLayoutDirection(view));
+
+ try {
+ switch (absGravity & Gravity.VERTICAL_GRAVITY_MASK) {
+ case Gravity.TOP:
+ assertEquals(lp.topMargin, fab.getTop() + area.top);
+ break;
+ case Gravity.BOTTOM:
+ assertEquals(parent.getHeight() - lp.bottomMargin,
+ fab.getTop() + area.bottom);
+ break;
+ }
+ switch (absGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+ case Gravity.LEFT:
+ assertEquals(lp.leftMargin, fab.getLeft() + area.left);
+ break;
+ case Gravity.RIGHT:
+ assertEquals(parent.getWidth() - lp.rightMargin,
+ fab.getLeft() + area.right);
+ break;
+ }
+ return true;
+ } catch (Throwable t) {
+ failedCheckDescription = t.getMessage();
+ return false;
+ }
+ }
+ };
+ }
}
diff --git a/tests/src/android/support/design/widget/FloatingActionButtonTest.java b/tests/src/android/support/design/widget/FloatingActionButtonTest.java
index de35b6a2e..69277320e 100644
--- a/tests/src/android/support/design/widget/FloatingActionButtonTest.java
+++ b/tests/src/android/support/design/widget/FloatingActionButtonTest.java
@@ -18,8 +18,10 @@ package android.support.design.widget;
import static android.support.design.testutils.FloatingActionButtonActions.setBackgroundTintColor;
import static android.support.design.testutils.FloatingActionButtonActions.setImageResource;
+import static android.support.design.testutils.FloatingActionButtonActions.setLayoutGravity;
import static android.support.design.testutils.FloatingActionButtonActions.setSize;
import static android.support.design.testutils.TestUtilsMatchers.withFabBackgroundFill;
+import static android.support.design.testutils.TestUtilsMatchers.withFabContentAreaOnMargins;
import static android.support.design.testutils.TestUtilsMatchers.withFabContentHeight;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
@@ -29,6 +31,7 @@ import android.graphics.Color;
import android.support.design.test.R;
import android.support.design.testutils.TestUtils;
import android.test.suitebuilder.annotation.SmallTest;
+import android.view.Gravity;
import org.junit.Test;
@@ -100,4 +103,15 @@ public class FloatingActionButtonTest
.check(matches(withFabContentHeight(normalSize)));
}
+ @Test
+ public void testOffset() {
+ onView(withId(R.id.fab_standard))
+ .perform(setLayoutGravity(Gravity.LEFT | Gravity.TOP))
+ .check(matches(withFabContentAreaOnMargins(Gravity.LEFT | Gravity.TOP)));
+
+ onView(withId(R.id.fab_standard))
+ .perform(setLayoutGravity(Gravity.RIGHT | Gravity.BOTTOM))
+ .check(matches(withFabContentAreaOnMargins(Gravity.RIGHT | Gravity.BOTTOM)));
+ }
+
}