188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska/*
288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * Copyright (C) 2017 The Android Open Source Project
388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska *
488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * Licensed under the Apache License, Version 2.0 (the "License");
588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * you may not use this file except in compliance with the License.
688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * You may obtain a copy of the License at
788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska *
888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska *      http://www.apache.org/licenses/LICENSE-2.0
988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska *
1088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * Unless required by applicable law or agreed to in writing, software
1188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * distributed under the License is distributed on an "AS IS" BASIS,
1288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * See the License for the specific language governing permissions and
1488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska * limitations under the License.
1588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska */
1688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
179b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskapackage android.support.wear.widget;
1888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
1988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport static junit.framework.Assert.assertEquals;
2088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
2188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport android.app.Activity;
2288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport android.support.test.InstrumentationRegistry;
2388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport android.support.test.filters.MediumTest;
2488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport android.support.test.rule.ActivityTestRule;
2588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport android.support.test.runner.AndroidJUnit4;
269b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskaimport android.support.wear.test.R;
279b028c55b13889bf75b5dd43b5b0f4051834ae1dAga Madurskaimport android.support.wear.widget.util.WakeLockRule;
2888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport android.view.View;
2988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport android.widget.FrameLayout;
3088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
3188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport org.junit.Before;
3288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport org.junit.Rule;
3388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport org.junit.Test;
3488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport org.junit.runner.RunWith;
3588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
3688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskaimport java.util.concurrent.atomic.AtomicReference;
3788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
3888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska@MediumTest
3988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska@RunWith(AndroidJUnit4.class)
4088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurskapublic class WearableLinearLayoutManagerTest {
4188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
4288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    @Rule
4388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    public final WakeLockRule wakeLock = new WakeLockRule();
4488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
4588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    @Rule
4688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    public final ActivityTestRule<WearableRecyclerViewTestActivity> mActivityRule =
4788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            new ActivityTestRule<>(WearableRecyclerViewTestActivity.class, true, true);
4888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
4988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    WearableLinearLayoutManager mWearableLinearLayoutManagerUnderTest;
5088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
5188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    @Before
5288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    public void setUp() throws Throwable {
5388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        Activity activity = mActivityRule.getActivity();
5488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        CurvingLayoutCallback mCurvingCallback = new CurvingLayoutCallback(activity);
5588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        mCurvingCallback.setOffset(10);
5688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        mWearableLinearLayoutManagerUnderTest =
5788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                new WearableLinearLayoutManager(mActivityRule.getActivity(), mCurvingCallback);
5888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    }
5988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
6088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    @Test
6188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    public void testRoundOffsetting() throws Throwable {
6288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        ((CurvingLayoutCallback) mWearableLinearLayoutManagerUnderTest.getLayoutCallback())
6388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                .setRound(true);
6488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        final AtomicReference<WearableRecyclerView> wrvReference = new AtomicReference<>();
6588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        mActivityRule.runOnUiThread(new Runnable() {
6688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            @Override
6788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            public void run() {
6888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                WearableRecyclerView wrv =
6988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                        (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
7088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                // Set a fixed layout so that the test adapts to different device screens.
7188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                wrv.setLayoutParams(new FrameLayout.LayoutParams(390, 390));
7288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            }
7388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        });
7488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
7588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
7688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
7788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        mActivityRule.runOnUiThread(new Runnable() {
7888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            @Override
7988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            public void run() {
8088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                WearableRecyclerView wrv =
8188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                        (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
8288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                wrv.setLayoutManager(mWearableLinearLayoutManagerUnderTest);
8388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                wrvReference.set(wrv);
8488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            }
8588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        });
8688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
8788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
8888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        WearableRecyclerView wrv = wrvReference.get();
8988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
9088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child1 = wrv.getChildAt(0);
9188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child2 = wrv.getChildAt(1);
9288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child3 = wrv.getChildAt(2);
9388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child4 = wrv.getChildAt(3);
9488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child5 = wrv.getChildAt(4);
9588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
9688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        // The left position and the translation of the child is modified if the screen is round.
9788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        // Check if the 5th child is not null as some devices will not be able to display 5 views.
9888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(136, child1.getLeft());
9988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(-6.3, child1.getTranslationY(), 0.1);
10088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
10188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(91, child2.getLeft(), 1);
10288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(-15.21, child2.getTranslationY(), 0.1);
10388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
10488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(58, child3.getLeft(), 1);
10588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(-13.5, child3.getTranslationY(), 0.1);
10688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
10788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(42, child4.getLeft(), 1);
10888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(-4.5, child4.getTranslationY(), 0.1);
10988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
11088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        if (child5 != null) {
11188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            assertEquals(43, child5.getLeft(), 1);
11288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            assertEquals(6.7, child5.getTranslationY(), 0.1);
11388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        }
11488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    }
11588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
11688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    @Test
11788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    public void testStraightOffsetting() throws Throwable {
11888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        ((CurvingLayoutCallback) mWearableLinearLayoutManagerUnderTest.getLayoutCallback())
11988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                .setRound(
12088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                false);
12188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        final AtomicReference<WearableRecyclerView> wrvReference = new AtomicReference<>();
12288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        mActivityRule.runOnUiThread(new Runnable() {
12388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            @Override
12488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            public void run() {
12588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                WearableRecyclerView wrv =
12688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                        (WearableRecyclerView) mActivityRule.getActivity().findViewById(R.id.wrv);
12788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                wrv.setLayoutManager(mWearableLinearLayoutManagerUnderTest);
12888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska                wrvReference.set(wrv);
12988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            }
13088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        });
13188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
13288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        WearableRecyclerView wrv = wrvReference.get();
13388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
13488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child1 = wrv.getChildAt(0);
13588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child2 = wrv.getChildAt(1);
13688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child3 = wrv.getChildAt(2);
13788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child4 = wrv.getChildAt(3);
13888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        View child5 = wrv.getChildAt(4);
13988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
14088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        // The left position and the translation of the child is not modified if the screen is
14188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        // straight. Check if the 5th child is not null as some devices will not be able to display
14288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        // 5 views.
14388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0, child1.getLeft());
14488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0.0f, child1.getTranslationY(), 0);
14588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
14688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0, child2.getLeft());
14788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0.0f, child2.getTranslationY(), 0);
14888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
14988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0, child3.getLeft());
15088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0.0f, child3.getTranslationY(), 0);
15188e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
15288e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0, child4.getLeft());
15388e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        assertEquals(0.0f, child4.getTranslationY(), 0);
15488e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska
15588e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        if (child5 != null) {
15688e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            assertEquals(0, child5.getLeft());
15788e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska            assertEquals(0.0f, child5.getTranslationY(), 0);
15888e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska        }
15988e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska    }
16088e81a0c4edbbc6fec7a2d7362714c058f7ce619Aga Madurska}
161