1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.design.widget;
18
19import android.os.Build;
20import android.support.annotation.CallSuper;
21import android.support.annotation.IdRes;
22import android.support.annotation.LayoutRes;
23import android.support.annotation.StringRes;
24import android.support.design.test.R;
25import android.support.design.testutils.Shakespeare;
26import android.support.test.InstrumentationRegistry;
27import android.support.test.espresso.action.CoordinatesProvider;
28import android.support.test.espresso.action.GeneralSwipeAction;
29import android.support.test.espresso.action.Press;
30import android.support.test.espresso.action.Swipe;
31import android.support.v4.view.ViewCompat;
32import android.support.v7.app.AppCompatActivity;
33import android.support.v7.widget.Toolbar;
34import android.text.TextUtils;
35import android.view.View;
36import android.widget.TextView;
37
38import static android.support.design.testutils.TestUtilsActions.setText;
39import static android.support.design.testutils.TestUtilsActions.setTitle;
40import static android.support.test.espresso.Espresso.onView;
41import static android.support.test.espresso.matcher.ViewMatchers.withId;
42
43import static org.junit.Assert.assertEquals;
44
45public abstract class AppBarLayoutBaseTest extends BaseDynamicCoordinatorLayoutTest {
46
47    protected AppBarLayout mAppBar;
48
49    protected CollapsingToolbarLayout mCollapsingToolbar;
50
51    protected Toolbar mToolbar;
52
53    protected TextView mTextView;
54
55    protected float mDefaultElevationValue;
56
57    protected static void performVerticalSwipeUpGesture(@IdRes int containerId, final int swipeX,
58            final int swipeStartY, final int swipeAmountY) {
59        onView(withId(containerId)).perform(new GeneralSwipeAction(
60                Swipe.SLOW,
61                new CoordinatesProvider() {
62                    @Override
63                    public float[] calculateCoordinates(View view) {
64                        return new float[] { swipeX, swipeStartY };
65                    }
66                },
67                new CoordinatesProvider() {
68                    @Override
69                    public float[] calculateCoordinates(View view) {
70                        return new float[] { swipeX, swipeStartY - swipeAmountY };
71                    }
72                }, Press.FINGER));
73    }
74
75    protected static void performVerticalSwipeDownGesture(@IdRes int containerId, final int swipeX,
76            final int swipeStartY, final int swipeAmountY) {
77        onView(withId(containerId)).perform(new GeneralSwipeAction(
78                Swipe.SLOW,
79                new CoordinatesProvider() {
80                    @Override
81                    public float[] calculateCoordinates(View view) {
82                        return new float[] { swipeX, swipeStartY };
83                    }
84                },
85                new CoordinatesProvider() {
86                    @Override
87                    public float[] calculateCoordinates(View view) {
88                        return new float[] { swipeX, swipeStartY + swipeAmountY };
89                    }
90                }, Press.FINGER));
91    }
92
93    @CallSuper
94    protected void configureContent(final @LayoutRes int layoutResId,
95            final @StringRes int titleResId) {
96        onView(withId(R.id.coordinator_stub)).perform(inflateViewStub(layoutResId));
97
98        mAppBar = (AppBarLayout) mCoordinatorLayout.findViewById(R.id.app_bar);
99        mCollapsingToolbar =
100                (CollapsingToolbarLayout) mAppBar.findViewById(R.id.collapsing_app_bar);
101        mToolbar = (Toolbar) mAppBar.findViewById(R.id.toolbar);
102
103        final AppCompatActivity activity = mActivityTestRule.getActivity();
104        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
105            @Override
106            public void run() {
107                activity.setSupportActionBar(mToolbar);
108            }
109        });
110
111        final CharSequence activityTitle = activity.getString(titleResId);
112        activity.setTitle(activityTitle);
113        if (mCollapsingToolbar != null) {
114            onView(withId(R.id.collapsing_app_bar)).perform(setTitle(activityTitle));
115        }
116
117        TextView dialog = (TextView) mCoordinatorLayout.findViewById(R.id.textview_dialogue);
118        if (dialog != null) {
119            onView(withId(R.id.textview_dialogue)).perform(
120                    setText(TextUtils.concat(Shakespeare.DIALOGUE)));
121        }
122
123        mDefaultElevationValue = mAppBar.getResources()
124                .getDimension(R.dimen.design_appbar_elevation);
125    }
126
127    protected void assertAppBarElevation(float expectedValue) {
128        if (Build.VERSION.SDK_INT >= 21) {
129            assertEquals(expectedValue, ViewCompat.getElevation(mAppBar), 0.05f);
130        }
131    }
132}
133