129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar/* 229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * Copyright (C) 2016 The Android Open Source Project 329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * 429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * you may not use this file except in compliance with the License. 629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * You may obtain a copy of the License at 729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * 829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * 1029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * Unless required by applicable law or agreed to in writing, software 1129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 1229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * See the License for the specific language governing permissions and 1429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar * limitations under the License. 1529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar */ 1629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarpackage android.support.v7.widget; 1729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 1829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport static android.support.v7.widget.LinearLayoutManager.HORIZONTAL; 1929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport static android.support.v7.widget.LinearLayoutManager.VERTICAL; 2029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 2129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport static org.junit.Assert.assertEquals; 2229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport static org.junit.Assert.assertTrue; 2329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 2429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport android.graphics.Rect; 2529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport android.view.View; 2629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport android.view.ViewGroup; 2729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 2829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport org.junit.Test; 2929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport org.junit.runner.RunWith; 3029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport org.junit.runners.Parameterized; 3129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 3229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport java.util.ArrayList; 3329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarimport java.util.List; 3429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 3529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar@RunWith(Parameterized.class) 3629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyarpublic class GridLayoutManagerCustomSizeInScrollDirectionTest extends BaseGridLayoutManagerTest { 3729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar @Parameterized.Parameters(name = "addDecorOffsets:{1} addMargins:{2} config:{0}") 3829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar public static List<Object[]> getParams() { 3929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar List<Object[]> params = new ArrayList<>(); 4029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar Boolean[] options = new Boolean[]{true, false}; 4129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar for (boolean addMargins : options) { 4229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar for (boolean addDecorOffsets : options) { 4329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar params.add(new Object[] { 4429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar new Config(3, HORIZONTAL, false), addDecorOffsets, addMargins}); 4529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar params.add(new Object[] { 4629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar new Config(3, VERTICAL, false), addDecorOffsets, addMargins}); 4729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 4829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 4929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar return params; 5029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 5129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 5229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar private final boolean mAddDecorOffsets; 5329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar private final boolean mAddMargins; 5429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar private final Config mConfig; 5529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 5629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar public GridLayoutManagerCustomSizeInScrollDirectionTest(Config config, boolean addDecorOffsets, 5729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar boolean addMargins) { 5829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar mConfig = config; 5929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar mAddDecorOffsets = addDecorOffsets; 6029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar mAddMargins = addMargins; 6129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 6229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 6329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar @Test 6429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar public void customSizeInScrollDirectionTest() throws Throwable { 6529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final int decorOffset = mAddDecorOffsets ? 7 : 0; 6629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final int margin = mAddMargins ? 11 : 0; 6729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final int[] sizePerPosition = new int[]{3, 5, 9, 21, 3, 5, 9, 6, 9, 1}; 6829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final int[] expectedSizePerPosition = new int[]{9, 9, 9, 21, 3, 5, 9, 9, 9, 1}; 6929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 7029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final GridTestAdapter testAdapter = new GridTestAdapter(10) { 7129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar @Override 7229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar public void onBindViewHolder(TestViewHolder holder, 7329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar int position) { 7429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar super.onBindViewHolder(holder, position); 7529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) 7629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar holder.itemView.getLayoutParams(); 7729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar if (layoutParams == null) { 7829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar layoutParams = new ViewGroup.MarginLayoutParams( 7929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar ViewGroup.LayoutParams.WRAP_CONTENT, 8029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar ViewGroup.LayoutParams.WRAP_CONTENT); 8129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar holder.itemView.setLayoutParams(layoutParams); 8229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 8329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final int size = sizePerPosition[position]; 8429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar if (mConfig.mOrientation == HORIZONTAL) { 8529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar layoutParams.width = size; 8629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar layoutParams.leftMargin = margin; 8729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar layoutParams.rightMargin = margin; 8829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } else { 8929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar layoutParams.height = size; 9029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar layoutParams.topMargin = margin; 9129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar layoutParams.bottomMargin = margin; 9229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 9329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 9429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar }; 9529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar testAdapter.setFullSpan(3, 5); 9629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final RecyclerView rv = setupBasic(mConfig, testAdapter); 9729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar if (mAddDecorOffsets) { 9829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar rv.addItemDecoration(new RecyclerView.ItemDecoration() { 9929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar @Override 10029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar public void getItemOffsets(Rect outRect, View view, RecyclerView parent, 10129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar RecyclerView.State state) { 10229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar if (mConfig.mOrientation == HORIZONTAL) { 10329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar outRect.set(decorOffset, 0, decorOffset, 0); 10429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } else { 10529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar outRect.set(0, decorOffset, 0, decorOffset); 10629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 10729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 10829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar }); 10929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 11029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar waitForFirstLayout(rv); 11129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar 11229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar assertTrue("[test sanity] some views should be laid out", 11329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar mRecyclerView.getChildCount() > 0); 11429f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar for (int i = 0; i < mRecyclerView.getChildCount(); i++) { 11529f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar View child = mRecyclerView.getChildAt(i); 11629f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar final int size = mConfig.mOrientation == HORIZONTAL ? child.getWidth() 11729f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar : child.getHeight(); 11829f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar assertEquals("child " + i + " should have the size specified in its layout params", 11929f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar expectedSizePerPosition[i], size); 12029f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 12129f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar checkForMainThreadException(); 12229f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar } 12329f43aa1bb825a46fd7cf161a0cd1d5353aaf821Yigit Boyar} 124