14143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar/* 24143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * Copyright (C) 2016 The Android Open Source Project 34143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * 44143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 54143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * you may not use this file except in compliance with the License. 64143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * You may obtain a copy of the License at 74143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * 84143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 94143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * 104143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * Unless required by applicable law or agreed to in writing, software 114143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 124143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * See the License for the specific language governing permissions and 144143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * limitations under the License. 154143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar */ 164143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 174143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarpackage android.support.v7.widget; 184143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 194143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 204143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport org.junit.Test; 214143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport org.junit.runner.RunWith; 224143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport org.junit.runners.Parameterized; 234143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 244143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport android.view.View; 254143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport android.view.ViewGroup; 264143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 274143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport java.util.ArrayList; 284143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport java.util.List; 294143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 304143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport static android.support.v7.widget.LinearLayoutManager.HORIZONTAL; 314143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport static android.support.v7.widget.LinearLayoutManager.VERTICAL; 324143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport static org.junit.Assert.assertEquals; 334143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport static org.junit.Assert.assertNotNull; 344143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport static org.junit.Assert.assertTrue; 354143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 364143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar@RunWith(Parameterized.class) 374143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarpublic class GridLayoutManagerRtlTest extends BaseGridLayoutManagerTest { 384143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 394143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public GridLayoutManagerRtlTest(Config config, boolean changeRtlAfter, boolean oneLine, 404143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar boolean itemsWrapContent) { 414143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mConfig = config; 424143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mChangeRtlAfter = changeRtlAfter; 434143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mOneLine = oneLine; 444143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mItemsWrapContent = itemsWrapContent; 454143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 464143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 474143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Parameterized.Parameters(name = "conf: {0} changeRl:{1} oneLine: {2} itemsWrap: {3}") 484143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public static List<Object[]> params() { 494143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar List<Object[]> result = new ArrayList<>(); 504143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar for (boolean changeRtlAfter : new boolean[]{false, true}) { 514143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar for (boolean oneLine : new boolean[]{false, true}) { 524143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar for (boolean itemsWrapContent : new boolean[]{false, true}) { 534143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar for (Config config : createBaseVariations()) { 544143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar result.add(new Object[] { 554143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar config, 564143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar changeRtlAfter, 574143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar oneLine, 584143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar itemsWrapContent 594143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }); 604143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 614143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 624143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 634143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 644143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return result; 654143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 664143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar final Config mConfig; 674143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar final boolean mChangeRtlAfter; 684143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar final boolean mOneLine; 694143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar final boolean mItemsWrapContent; 704143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 714143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 724143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Test 734143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public void rtlTest() throws Throwable { 744143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mOneLine && mConfig.mOrientation != VERTICAL) { 754143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return;// nothing to test 764143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 774143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mConfig.mSpanCount == 1) { 784143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mConfig.mSpanCount = 2; 794143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 804143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar String logPrefix = mConfig + ", changeRtlAfterLayout:" + mChangeRtlAfter + "," 814143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar + "oneLine:" + mOneLine + " itemsWrap:" + mItemsWrapContent; 824143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mConfig.mItemCount = 5; 834143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mOneLine) { 844143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mConfig.mSpanCount = mConfig.mItemCount + 1; 854143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } else { 864143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mConfig.mSpanCount = Math.min(mConfig.mItemCount - 1, mConfig.mSpanCount); 874143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 884143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 894143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar RecyclerView rv = setupBasic(mConfig, new GridTestAdapter(mConfig.mItemCount) { 904143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 914143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public void onBindViewHolder(TestViewHolder holder, 924143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar int position) { 934143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar super.onBindViewHolder(holder, position); 944143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mItemsWrapContent) { 954143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); 964143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (lp == null) { 974143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar lp = mGlm.generateDefaultLayoutParams(); 984143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 994143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mConfig.mOrientation == HORIZONTAL) { 1004143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 1014143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } else { 1024143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; 1034143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1044143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1054143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1064143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }); 1074143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mChangeRtlAfter) { 1084143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar waitForFirstLayout(rv); 1094143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mGlm.expectLayout(1); 1104143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mGlm.setFakeRtl(true); 1114143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mGlm.waitForLayout(2); 1124143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } else { 1134143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mGlm.mFakeRTL = true; 1144143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar waitForFirstLayout(rv); 1154143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1164143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 1174143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertEquals("view should become rtl", true, mGlm.isLayoutRTL()); 1184143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar OrientationHelper helper = OrientationHelper.createHorizontalHelper(mGlm); 1194143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar View child0 = mGlm.findViewByPosition(0); 1204143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar final int secondChildPos = mConfig.mOrientation == VERTICAL ? 1 1214143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar : mConfig.mSpanCount; 1224143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar View child1 = mGlm.findViewByPosition(secondChildPos); 1234143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertNotNull(logPrefix + " child position 0 should be laid out", child0); 1244143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertNotNull( 1254143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar logPrefix + " second child position " + (secondChildPos) + " should be laid out", 1264143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar child1); 1274143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mConfig.mOrientation == VERTICAL || !mConfig.mReverseLayout) { 1284143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertTrue(logPrefix + " second child should be to the left of first child", 1294143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar helper.getDecoratedStart(child0) >= helper.getDecoratedEnd(child1)); 1304143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertEquals(logPrefix + " first child should be right aligned", 1314143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar helper.getDecoratedEnd(child0), helper.getEndAfterPadding()); 1324143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } else { 1334143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertTrue(logPrefix + " first child should be to the left of second child", 1344143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar helper.getDecoratedStart(child1) >= helper.getDecoratedEnd(child0)); 1354143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar assertEquals(logPrefix + " first child should be left aligned", 1364143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar helper.getDecoratedStart(child0), helper.getStartAfterPadding()); 1374143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1384143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar checkForMainThreadException(); 1394143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1404143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar} 141