1b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu/*
2b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Copyright (C) 2016 The Android Open Source Project
3b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *
4b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Licensed under the Apache License, Version 2.0 (the "License");
5b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * you may not use this file except in compliance with the License.
6b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * You may obtain a copy of the License at
7b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *
8b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *      http://www.apache.org/licenses/LICENSE-2.0
9b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu *
10b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * Unless required by applicable law or agreed to in writing, software
11b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * distributed under the License is distributed on an "AS IS" BASIS,
12b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * See the License for the specific language governing permissions and
14b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * limitations under the License.
15b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu */
16b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gupackage android.support.v17.leanback.app;
17b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
183103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.mock;
193103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.timeout;
203103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.verify;
213103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport static org.mockito.Mockito.when;
223103f63e99d47573823957f7aa34308555873221Aurimas Liutikas
23b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.content.Intent;
243103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.test.InstrumentationRegistry;
25b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.support.test.rule.ActivityTestRule;
26b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport android.support.v17.leanback.R;
273103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.support.v17.leanback.testutils.PollingCheck;
283103f63e99d47573823957f7aa34308555873221Aurimas Liutikasimport android.view.View;
29b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
30b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport org.junit.Before;
31b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Guimport org.junit.Rule;
32b50e46706ac654b071942bd7f6ba059c14c9c29aDake Guimport org.junit.rules.TestName;
33b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
34b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu/**
35b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu * @hide from javadoc
36b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu */
37b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gupublic class GuidedStepFragmentTestBase {
38b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
39734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    private static final long TIMEOUT = 5000;
40b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
41b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu    @Rule public TestName mUnitTestName = new TestName();
42b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu
43b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    @Rule
443103f63e99d47573823957f7aa34308555873221Aurimas Liutikas    public ActivityTestRule<GuidedStepFragmentTestActivity> activityTestRule =
453103f63e99d47573823957f7aa34308555873221Aurimas Liutikas            new ActivityTestRule<>(GuidedStepFragmentTestActivity.class, false, false);
46b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
47b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    @Before
48b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    public void clearTests() {
49b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        GuidedStepTestFragment.clearTests();
50b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
51b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
52734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    public static class ExpandTransitionFinish extends PollingCheck.PollingCheckCondition {
53734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        GuidedStepTestFragment.Provider mProvider;
54734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
55734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        public ExpandTransitionFinish(GuidedStepTestFragment.Provider provider) {
56734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            mProvider = provider;
57734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        }
58734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
59734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        @Override
60734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        public boolean canPreProceed() {
61734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            return false;
62734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        }
63734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
64734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        @Override
65734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        public boolean canProceed() {
66734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            GuidedStepTestFragment fragment = mProvider.getFragment();
67b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            if (fragment != null && fragment.getView() != null) {
68734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                if (!fragment.getGuidedActionsStylist().isInExpandTransition()) {
69734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    // expand transition finishes
70734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    return true;
71b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu                }
72b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            }
73734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            return false;
74b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        }
75b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
76b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
77734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    public static void waitOnDestroy(GuidedStepTestFragment.Provider provider,
78734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            int times) {
79734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        verify(provider, timeout((int)TIMEOUT).times(times)).onDestroy();
80734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    }
81734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
82734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    public static class EnterTransitionFinish extends PollingCheck.PollingCheckCondition {
83734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        PollingCheck.ViewScreenPositionDetector mDector =
84734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                new PollingCheck.ViewScreenPositionDetector();
85734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
86734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        GuidedStepTestFragment.Provider mProvider;
87734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
88734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        public EnterTransitionFinish(GuidedStepTestFragment.Provider provider) {
89734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            mProvider = provider;
90734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        }
91734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        @Override
92734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        public boolean canProceed() {
93734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            GuidedStepTestFragment fragment = mProvider.getFragment();
94734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            if (fragment != null && fragment.getView() != null) {
95734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                View view = fragment.getView().findViewById(R.id.guidance_title);
96734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                if (view != null) {
97734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    if (mDector.isViewStableOnScreen(view)) {
98734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                        return true;
99734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                    }
100734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu                }
101b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu            }
102734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            return false;
103b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        }
104b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
105b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
106b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    public static void sendKey(int keyCode) {
107b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(keyCode);
108b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
109b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
110b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu    public String generateMethodTestName(String testName) {
111b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu        return mUnitTestName.getMethodName() + "_" + testName;
112b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu    }
113b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu
114b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    public GuidedStepFragmentTestActivity launchTestActivity(String firstTestName) {
115b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        Intent intent = new Intent();
116b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_TEST_NAME, firstTestName);
117b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        return activityTestRule.launchActivity(intent);
118b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
119b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
120734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    public GuidedStepFragmentTestActivity launchTestActivity(String firstTestName,
121734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu            boolean addAsRoot) {
122734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        Intent intent = new Intent();
123734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_TEST_NAME, firstTestName);
124734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_ADD_AS_ROOT, addAsRoot);
125734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu        return activityTestRule.launchActivity(intent);
126734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu    }
127734ed7bc9ea15c6238a089145b90fa8417f9f42dDake Gu
12826d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu    public GuidedStepFragmentTestActivity launchTestActivity(String firstTestName,
12926d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu            boolean addAsRoot, int layoutDirection) {
13026d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        Intent intent = new Intent();
13126d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_TEST_NAME, firstTestName);
13226d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_ADD_AS_ROOT, addAsRoot);
13326d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        intent.putExtra(GuidedStepFragmentTestActivity.EXTRA_LAYOUT_DIRECTION, layoutDirection);
13426d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu        return activityTestRule.launchActivity(intent);
13526d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu    }
13626d09ce0e088ef4c69538ead9e7ee79905a047feDake Gu
137b50e46706ac654b071942bd7f6ba059c14c9c29aDake Gu    public GuidedStepTestFragment.Provider mockProvider(String testName) {
138b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        GuidedStepTestFragment.Provider test = mock(GuidedStepTestFragment.Provider.class);
139b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        when(test.getActivity()).thenCallRealMethod();
140b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        when(test.getFragmentManager()).thenCallRealMethod();
141b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        when(test.getFragment()).thenCallRealMethod();
142b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        GuidedStepTestFragment.setupTest(testName, test);
143b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu        return test;
144b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu    }
145b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu}
146b8706fd99b0a3724ed8e0c4b97bf37f3cdf389daDake Gu
147