1909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov/*
2909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * Copyright (C) 2016 The Android Open Source Project
3909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov *
4909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License");
5909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * you may not use this file except in compliance with the License.
6909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * You may obtain a copy of the License at
7909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov *
8909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov *      http://www.apache.org/licenses/LICENSE-2.0
9909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov *
10909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * Unless required by applicable law or agreed to in writing, software
11909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS,
12909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * See the License for the specific language governing permissions and
14909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov * limitations under the License.
15909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov */
16909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
17909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovpackage android.support.design.widget;
18909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
191a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banesimport android.os.Build;
20123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikovimport android.support.annotation.CallSuper;
21123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikovimport android.support.annotation.IdRes;
22909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.support.annotation.LayoutRes;
23909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.support.annotation.StringRes;
24909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.support.design.test.R;
25909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.support.design.testutils.Shakespeare;
26909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.support.test.InstrumentationRegistry;
27123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikovimport android.support.test.espresso.action.CoordinatesProvider;
28123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikovimport android.support.test.espresso.action.GeneralSwipeAction;
29123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikovimport android.support.test.espresso.action.Press;
30123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikovimport android.support.test.espresso.action.Swipe;
311a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banesimport android.support.v4.view.ViewCompat;
32909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.support.v7.app.AppCompatActivity;
33909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.support.v7.widget.Toolbar;
34909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.text.TextUtils;
35123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikovimport android.view.View;
36909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport android.widget.TextView;
37909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
38909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport static android.support.design.testutils.TestUtilsActions.setText;
39909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport static android.support.design.testutils.TestUtilsActions.setTitle;
40909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport static android.support.test.espresso.Espresso.onView;
41909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovimport static android.support.test.espresso.matcher.ViewMatchers.withId;
42909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
431a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banesimport static org.junit.Assert.assertEquals;
441a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes
45909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikovpublic abstract class AppBarLayoutBaseTest extends BaseDynamicCoordinatorLayoutTest {
46909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
47909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov    protected AppBarLayout mAppBar;
48909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
49909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov    protected CollapsingToolbarLayout mCollapsingToolbar;
50909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
51909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov    protected Toolbar mToolbar;
52909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
53909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov    protected TextView mTextView;
54909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
551a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes    protected float mDefaultElevationValue;
561a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes
57c530cc115fddab8e1d9645b322424dd45f9ecd0dKirill Grouchnikov    protected static void performVerticalSwipeUpGesture(@IdRes int containerId, final int swipeX,
58123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov            final int swipeStartY, final int swipeAmountY) {
59123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov        onView(withId(containerId)).perform(new GeneralSwipeAction(
60123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                Swipe.SLOW,
61123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                new CoordinatesProvider() {
62123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    @Override
63123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    public float[] calculateCoordinates(View view) {
64123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                        return new float[] { swipeX, swipeStartY };
65123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    }
66123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                },
67123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                new CoordinatesProvider() {
68123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    @Override
69123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    public float[] calculateCoordinates(View view) {
70123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                        return new float[] { swipeX, swipeStartY - swipeAmountY };
71123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    }
72123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                }, Press.FINGER));
73123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov    }
74123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov
75123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov    protected static void performVerticalSwipeDownGesture(@IdRes int containerId, final int swipeX,
76123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov            final int swipeStartY, final int swipeAmountY) {
77123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov        onView(withId(containerId)).perform(new GeneralSwipeAction(
78123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                Swipe.SLOW,
79123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                new CoordinatesProvider() {
80123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    @Override
81123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    public float[] calculateCoordinates(View view) {
82123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                        return new float[] { swipeX, swipeStartY };
83123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    }
84123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                },
85123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                new CoordinatesProvider() {
86123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    @Override
87123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    public float[] calculateCoordinates(View view) {
88123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                        return new float[] { swipeX, swipeStartY + swipeAmountY };
89123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                    }
90123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov                }, Press.FINGER));
91123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov    }
92123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov
93123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov    @CallSuper
94909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov    protected void configureContent(final @LayoutRes int layoutResId,
95909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov            final @StringRes int titleResId) {
96909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        onView(withId(R.id.coordinator_stub)).perform(inflateViewStub(layoutResId));
97909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
98909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        mAppBar = (AppBarLayout) mCoordinatorLayout.findViewById(R.id.app_bar);
99909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        mCollapsingToolbar =
100909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov                (CollapsingToolbarLayout) mAppBar.findViewById(R.id.collapsing_app_bar);
101123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov        mToolbar = (Toolbar) mAppBar.findViewById(R.id.toolbar);
102909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
103909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        final AppCompatActivity activity = mActivityTestRule.getActivity();
104909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
105909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov            @Override
106909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov            public void run() {
107909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov                activity.setSupportActionBar(mToolbar);
108909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov            }
109909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        });
110909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
111123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov        final CharSequence activityTitle = activity.getString(titleResId);
112123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov        activity.setTitle(activityTitle);
113909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        if (mCollapsingToolbar != null) {
114123544eaa855a7734be92dd35901233a222f64a8Kirill Grouchnikov            onView(withId(R.id.collapsing_app_bar)).perform(setTitle(activityTitle));
115909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        }
116909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov
117909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        TextView dialog = (TextView) mCoordinatorLayout.findViewById(R.id.textview_dialogue);
118909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        if (dialog != null) {
119909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov            onView(withId(R.id.textview_dialogue)).perform(
120909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov                    setText(TextUtils.concat(Shakespeare.DIALOGUE)));
121909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov        }
1221a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes
1231a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes        mDefaultElevationValue = mAppBar.getResources()
1246092f109a639c48d3da401ebfebefdbe37322301Chris Banes                .getDimension(R.dimen.design_appbar_elevation);
1251a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes    }
1261a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes
1271a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes    protected void assertAppBarElevation(float expectedValue) {
1281a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes        if (Build.VERSION.SDK_INT >= 21) {
1291a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes            assertEquals(expectedValue, ViewCompat.getElevation(mAppBar), 0.05f);
1301a8e4886abbc35e479cddb7b4acd601cede2fd8aChris Banes        }
131909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov    }
132909009864c27baf78efb766990e507a16a1cf359Kirill Grouchnikov}
133