Merge \"Fix FloatingActionButton auto offset functionality\" into nyc-support-24.1-dev

am: ff6b133ef5

Change-Id: I4059b0c3cb330b0423f5b85e00d373fe5ffe0d09

GitOrigin-RevId=b8bd61b2fd3075bd901fb4e97960a2565402231e

PiperOrigin-RevId: 140563797
This commit is contained in:
Chris Banes 2016-11-30 05:00:49 +00:00 committed by Travis Collins
parent 97af0274a6
commit ddfb9d8b52
5 changed files with 108 additions and 4 deletions

View File

@ -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) {

View File

@ -15,7 +15,8 @@
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/container"
android:layout_width="match_parent"
@ -43,4 +44,4 @@
android:src="@drawable/ic_add"
app:backgroundTint="#FF00FF"/>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>

View File

@ -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<View> 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();
}
};
}
}

View File

@ -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, View>(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;
}
}
};
}
}

View File

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