14143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar/* 24143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar * Copyright (C) 2015 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 196b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport static android.support.v7.widget.BaseLinearLayoutManagerTest.Config; 206b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport static android.support.v7.widget.LinearLayoutManager.HORIZONTAL; 216b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport static android.support.v7.widget.LinearLayoutManager.VERTICAL; 224143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 236b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport android.graphics.Rect; 24beae3c4833f02deea11babe5e95aea9b0865ec91Yigit Boyarimport android.os.Build; 25beae3c4833f02deea11babe5e95aea9b0865ec91Yigit Boyarimport android.support.test.filters.SdkSuppress; 264143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport android.support.v4.view.ViewCompat; 274143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport android.test.suitebuilder.annotation.MediumTest; 284143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport android.view.Gravity; 294143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 306b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport org.junit.Test; 316b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport org.junit.runner.RunWith; 326b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport org.junit.runners.Parameterized; 336b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar 344143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport java.util.ArrayList; 356b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyarimport java.util.Arrays; 364143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarimport java.util.List; 374143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 384143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar@RunWith(Parameterized.class) 394143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar@MediumTest 404143554adb9b31b700b6876a251a64419e6111e2Yigit Boyarpublic class LinearLayoutManagerWrapContentTest extends BaseWrapContentTest { 414143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 424143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar Config mConfig; 434143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 444143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public LinearLayoutManagerWrapContentTest(Config config, 454143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar WrapContentConfig wrapContentConfig) { 464143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar super(wrapContentConfig); 474143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mConfig = config; 484143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 494143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 50beae3c4833f02deea11babe5e95aea9b0865ec91Yigit Boyar @SdkSuppress(minSdkVersion = Build.VERSION_CODES.M) 514143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Test 52f3844451301cb14ca885e125cb27f108a834c386Yigit Boyar public void testUnspecifiedWithHint() throws Throwable { 53f3844451301cb14ca885e125cb27f108a834c386Yigit Boyar unspecifiedWithHintTest(mConfig.mOrientation == StaggeredGridLayoutManager.HORIZONTAL); 54f3844451301cb14ca885e125cb27f108a834c386Yigit Boyar } 55f3844451301cb14ca885e125cb27f108a834c386Yigit Boyar 56f3844451301cb14ca885e125cb27f108a834c386Yigit Boyar @Test 574143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public void deletion() throws Throwable { 584143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar testScenerio(new Scenario( 594143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar new Step() { 604143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 614143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar void onRun() throws Throwable { 624143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mTestAdapter.deleteAndNotify(3, 3); 634143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 644143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }, 654143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar new Step() { 664143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 674143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar void onRun() throws Throwable { 684143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mTestAdapter.deleteAndNotify(3, 3); 694143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 704143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }, 714143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar new Step() { 724143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 734143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar void onRun() throws Throwable { 744143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mTestAdapter.deleteAndNotify(1, 2); 754143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 764143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }) { 774143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }); 784143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 794143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 804143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Test 814143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public void addition() throws Throwable { 824143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar testScenerio(new Scenario( 834143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar new Step() { 844143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 854143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar void onRun() throws Throwable { 864143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mTestAdapter.addAndNotify(1, 2); 874143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 884143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 894143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar , 904143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar new Step() { 914143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 924143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar void onRun() throws Throwable { 934143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mTestAdapter.addAndNotify(0, 2); 944143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 954143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }, 964143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar new Step() { 974143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 984143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar void onRun() throws Throwable { 994143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mTestAdapter.addAndNotify(6, 3); 1004143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1014143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1024143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar ) { 1034143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 1044143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public int getSeedAdapterSize() { 1054143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return 2; 1064143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1074143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar }); 1084143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1094143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 1104143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Parameterized.Parameters(name = "{0} {1}") 1114143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar public static Iterable<Object[]> data() { 1124143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar List<Object[]> params = new ArrayList<>(); 1136b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar List<Rect> paddings = Arrays.asList( 1146b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Rect(0, 0, 0, 0), 1156b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Rect(5, 0, 0, 0), 1166b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Rect(0, 6, 0, 0), 1176b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Rect(0, 0, 7, 0), 1186b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Rect(0, 0, 0, 8), 1196b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Rect(3, 5, 7, 11) 1206b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar ); 1216b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar for (Rect padding : paddings) { 1226b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar for (int orientation : new int[]{VERTICAL, HORIZONTAL}) { 1236b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar for (boolean reverseLayout : new boolean[]{false, true}) { 1246b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar for (boolean stackFromBottom : new boolean[]{false, true}) { 1256b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar params.add( 1266b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Object[]{ 1276b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Config(orientation, reverseLayout, stackFromBottom), 1286b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new WrapContentConfig(false, false, new Rect(padding)) 1296b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar } 1306b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar ); 1316b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar params.add( 1326b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Object[]{ 1336b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new Config(orientation, reverseLayout, stackFromBottom), 1346b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar new WrapContentConfig(HORIZONTAL == orientation, 1356b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar VERTICAL == orientation, new Rect(padding)) 1366b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar } 1376b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar ); 1386b6a29eea7f6a212447b3cc7b45a081b609ca4b1Yigit Boyar } 1394143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1404143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1414143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1424143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return params; 1434143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1444143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 1454143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 1464143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar RecyclerView.LayoutManager createLayoutManager() { 1474143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return createFromConfig(); 1484143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1494143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 1504143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar private LinearLayoutManager createFromConfig() { 1514143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar LinearLayoutManager llm = new LinearLayoutManager(getActivity(), mConfig.mOrientation, 1524143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar mConfig.mReverseLayout); 1534143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar llm.setStackFromEnd(mConfig.mStackFromEnd); 1544143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return llm; 1554143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1564143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 1574143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 1584143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar protected int getVerticalGravity(RecyclerView.LayoutManager layoutManager) { 1594143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mConfig.mOrientation == HORIZONTAL) { 1604143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return Gravity.TOP; 1614143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1624143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mConfig.mReverseLayout ^ mConfig.mStackFromEnd) { 1634143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return Gravity.BOTTOM; 1644143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1654143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return Gravity.TOP; 1664143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1674143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar 1684143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar @Override 1694143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar protected int getHorizontalGravity(RecyclerView.LayoutManager layoutManager) { 1704143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar boolean rtl = layoutManager.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL; 1714143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (mConfig.mOrientation == VERTICAL) { 1724143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (rtl) { 1734143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return Gravity.RIGHT; 1744143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1754143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return Gravity.LEFT; 1764143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1774143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar boolean end = mConfig.mReverseLayout ^ mConfig.mStackFromEnd; 1784143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar if (rtl ^ end) { 1794143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return Gravity.RIGHT; 1804143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1814143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar return Gravity.LEFT; 1824143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar } 1834143554adb9b31b700b6876a251a64419e6111e2Yigit Boyar} 184