From ddfb9d8b521955558b4d5f5ff9aa8a1371d652ce Mon Sep 17 00:00:00 2001 From: Chris Banes Date: Wed, 30 Nov 2016 05:00:49 +0000 Subject: [PATCH] Merge \"Fix FloatingActionButton auto offset functionality\" into nyc-support-24.1-dev am: ff6b133ef5 Change-Id: I4059b0c3cb330b0423f5b85e00d373fe5ffe0d09 GitOrigin-RevId=b8bd61b2fd3075bd901fb4e97960a2565402231e PiperOrigin-RevId: 140563797 --- .../design/widget/FloatingActionButton.java | 4 +- tests/res/layout/design_fab.xml | 5 +- .../FloatingActionButtonActions.java | 27 ++++++++ .../design/testutils/TestUtilsMatchers.java | 62 +++++++++++++++++++ .../widget/FloatingActionButtonTest.java | 14 +++++ 5 files changed, 108 insertions(+), 4 deletions(-) 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))); + } + }