GridLayoutManagerRtlTest.java revision e9f9cd8d0e9008340985d17a2541ab24b3adb391
1b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz/* 2e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour * Copyright (C) 2016 The Android Open Source Project 3b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * 4b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * Licensed under the Apache License, Version 2.0 (the "License"); 5b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * you may not use this file except in compliance with the License. 6b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * You may obtain a copy of the License at 7e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour * 843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * http://www.apache.org/licenses/LICENSE-2.0 943b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * 1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software 11e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour * distributed under the License is distributed on an "AS IS" BASIS, 1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz * See the License for the specific language governing permissions and 1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License. 1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn */ 1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn 1743b53e83705f02245da6ae61e31273866a35b833Jon Ashburnpackage android.support.v7.widget; 1843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn 19b932f109ad6b92419e12f66f3e9087f2b49934cbKarl Schultz 20e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static android.support.v7.widget.LinearLayoutManager.HORIZONTAL; 21e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static android.support.v7.widget.LinearLayoutManager.VERTICAL; 22e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 23e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static org.junit.Assert.assertEquals; 24e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport static org.junit.Assert.assertNotNull; 25ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northropimport static org.junit.Assert.assertTrue; 26e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 27e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport android.view.View; 28f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labourimport android.view.ViewGroup; 29f1ae58e3e55f492a1e8b5651c585e28eb7cd9611Antoine Labour 30e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport org.junit.Test; 31e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport org.junit.runner.RunWith; 32e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport org.junit.runners.Parameterized; 33e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 34e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport java.util.ArrayList; 35e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourimport java.util.List; 3666e6a3f23e9332bfae6219e97cb5616208d7f30cJesse Hall 37e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour@RunWith(Parameterized.class) 38e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labourpublic class GridLayoutManagerRtlTest extends BaseGridLayoutManagerTest { 39e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 40e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour public GridLayoutManagerRtlTest(Config config, boolean changeRtlAfter, boolean oneLine, 41ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop boolean itemsWrapContent) { 42ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop mConfig = config; 43ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop mChangeRtlAfter = changeRtlAfter; 44ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop mOneLine = oneLine; 45e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour mItemsWrapContent = itemsWrapContent; 46ed42d8d57c914007f6b87a5360d97c3b990899e1Cody Northrop } 47e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour 48e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour @Parameterized.Parameters(name = "conf:{0},changeRl:{1},oneLine:{2},itemsWrap:{3}") 49e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour public static List<Object[]> params() { 50e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour List<Object[]> result = new ArrayList<>(); 51e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour for (boolean changeRtlAfter : new boolean[]{false, true}) { 52e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour for (boolean oneLine : new boolean[]{false, true}) { 5306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang for (boolean itemsWrapContent : new boolean[]{false, true}) { 54e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour for (Config config : createBaseVariations()) { 55e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour result.add(new Object[] { 56e3795c1c4e1fd43419a156d9f7858327768ccb76Antoine Labour config, 5706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang changeRtlAfter, 5806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang oneLine, 5906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang itemsWrapContent 6006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang }); 6106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 6206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 6306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 6406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 6506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return result; 6606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 6706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang final Config mConfig; 6806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang final boolean mChangeRtlAfter; 6906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang final boolean mOneLine; 7006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang final boolean mItemsWrapContent; 7106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang 7206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang 7306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang @Test 7406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang public void rtlTest() throws Throwable { 7506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (mOneLine && mConfig.mOrientation != VERTICAL) { 7606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang return;// nothing to test 7706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 7806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (mConfig.mSpanCount == 1) { 7906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mConfig.mSpanCount = 2; 8006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 8106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang String logPrefix = mConfig + ", changeRtlAfterLayout:" + mChangeRtlAfter + "," 8206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang + "oneLine:" + mOneLine + " itemsWrap:" + mItemsWrapContent; 8306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mConfig.mItemCount = 5; 8406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (mOneLine) { 8506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mConfig.mSpanCount = mConfig.mItemCount + 1; 8606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } else { 8706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mConfig.mSpanCount = Math.min(mConfig.mItemCount - 1, mConfig.mSpanCount); 8806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 8906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang 9006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang RecyclerView rv = setupBasic(mConfig, new GridTestAdapter(mConfig.mItemCount) { 9106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang @Override 9206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang public void onBindViewHolder(TestViewHolder holder, 9306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang int position) { 9406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang super.onBindViewHolder(holder, position); 9506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (mItemsWrapContent) { 9606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); 9706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (lp == null) { 9806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang lp = mGlm.generateDefaultLayoutParams(); 9906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 10006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (mConfig.mOrientation == HORIZONTAL) { 10106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 10206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } else { 10306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; 10406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 10506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 10606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 10706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang }); 10806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (mChangeRtlAfter) { 10906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang waitForFirstLayout(rv); 11006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mGlm.expectLayout(1); 11106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mGlm.setFakeRtl(true); 11206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mGlm.waitForLayout(2); 11306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } else { 11406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang mGlm.mFakeRTL = true; 11506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang waitForFirstLayout(rv); 11606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 11706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang 11806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang assertEquals("view should become rtl", true, mGlm.isLayoutRTL()); 11906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang OrientationHelper helper = OrientationHelper.createHorizontalHelper(mGlm); 12006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang View child0 = mGlm.findViewByPosition(0); 12106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang final int secondChildPos = mConfig.mOrientation == VERTICAL ? 1 12206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang : mConfig.mSpanCount; 12306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang View child1 = mGlm.findViewByPosition(secondChildPos); 12406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang assertNotNull(logPrefix + " child position 0 should be laid out", child0); 12506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang assertNotNull( 12606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang logPrefix + " second child position " + (secondChildPos) + " should be laid out", 12706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang child1); 12806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang if (mConfig.mOrientation == VERTICAL || !mConfig.mReverseLayout) { 12906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang assertTrue(logPrefix + " second child should be to the left of first child", 13006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang helper.getDecoratedStart(child0) >= helper.getDecoratedEnd(child1)); 13106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang assertEquals(logPrefix + " first child should be right aligned", 13206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang helper.getDecoratedEnd(child0), helper.getEndAfterPadding()); 13306b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } else { 13406b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang assertTrue(logPrefix + " first child should be to the left of second child", 13506b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang helper.getDecoratedStart(child1) >= helper.getDecoratedEnd(child0)); 13606b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang assertEquals(logPrefix + " first child should be left aligned", 13706b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang helper.getDecoratedStart(child0), helper.getStartAfterPadding()); 13806b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 13906b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang checkForMainThreadException(); 14006b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang } 14106b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang} 14206b3648e9a41c151ac2d1d19af1bd0ac3d479f1aYiwei Zhang