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