1f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes/*
2f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * Copyright (C) 2015 The Android Open Source Project
3f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes *
4f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * you may not use this file except in compliance with the License.
6f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * You may obtain a copy of the License at
7f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes *
8f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
9f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes *
10f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * Unless required by applicable law or agreed to in writing, software
11f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * See the License for the specific language governing permissions and
14f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes * limitations under the License.
15f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes */
16f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
17f129f1b050d2542a91fe8175eac30183beb07b41Chris Banespackage android.support.v7.widget;
18f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
19f129f1b050d2542a91fe8175eac30183beb07b41Chris Banesimport android.content.Context;
20f129f1b050d2542a91fe8175eac30183beb07b41Chris Banesimport android.support.v4.view.NestedScrollingParent;
21f129f1b050d2542a91fe8175eac30183beb07b41Chris Banesimport android.support.v4.view.ViewCompat;
22f129f1b050d2542a91fe8175eac30183beb07b41Chris Banesimport android.util.Log;
23f129f1b050d2542a91fe8175eac30183beb07b41Chris Banesimport android.view.View;
24f129f1b050d2542a91fe8175eac30183beb07b41Chris Banesimport android.widget.FrameLayout;
25f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
26f129f1b050d2542a91fe8175eac30183beb07b41Chris Banespublic class TestedFrameLayout extends FrameLayout implements NestedScrollingParent {
27f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
28f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    static final int TEST_NESTED_SCROLL_MODE_IGNORE = 0;
29f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    static final int TEST_NESTED_SCROLL_MODE_CONSUME = 1;
30f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
31f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    private int mNestedScrollMode;
32f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    private int mNestedFlingMode;
33d4c72f08279df548fbc4d556fe1a8b3500fafdbcChris Banes    private boolean mNestedStopNestedScrollCalled;
34f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
35f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public TestedFrameLayout(Context context) {
36f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        super(context);
37f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
38f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
39f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
40f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
41f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        // Always start nested scroll
42f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        return mNestedFlingMode == TEST_NESTED_SCROLL_MODE_CONSUME
43f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes                || mNestedScrollMode == TEST_NESTED_SCROLL_MODE_CONSUME;
44f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
45f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
46f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
47f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
48f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        Log.d("TestedFrameLayout", "onNestedPreFling: " + mNestedFlingMode);
49f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
50f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        return mNestedFlingMode == TEST_NESTED_SCROLL_MODE_CONSUME;
51f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
52f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
53f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
54f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
55f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        if (mNestedScrollMode == TEST_NESTED_SCROLL_MODE_CONSUME) {
56f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes            // We consume all scroll deltas
57f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes            consumed[0] = dx;
58f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes            consumed[1] = dy;
59f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        }
60f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
61f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
62f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
63f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed,
64f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes            int dyUnconsumed) {
65f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        // ignore
66f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
67f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
68f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
69f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) {
70f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        // ignore
71f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        return false;
72f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
73f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
74f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
75f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public void onNestedScrollAccepted(View child, View target, int axes) {
76f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        // ignore
77f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
78f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
79f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
80f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public int getNestedScrollAxes() {
81f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        // We can scroll in both direction
82f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        return ViewCompat.SCROLL_AXIS_HORIZONTAL | ViewCompat.SCROLL_AXIS_VERTICAL;
83f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
84f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
85f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    @Override
86f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public void onStopNestedScroll(View target) {
87d4c72f08279df548fbc4d556fe1a8b3500fafdbcChris Banes        mNestedStopNestedScrollCalled = true;
88d4c72f08279df548fbc4d556fe1a8b3500fafdbcChris Banes    }
89d4c72f08279df548fbc4d556fe1a8b3500fafdbcChris Banes
90d4c72f08279df548fbc4d556fe1a8b3500fafdbcChris Banes    public boolean stopNestedScrollCalled() {
91d4c72f08279df548fbc4d556fe1a8b3500fafdbcChris Banes        return mNestedStopNestedScrollCalled;
92f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
93f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
94f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public void setNestedScrollMode(int mode) {
95f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        mNestedScrollMode = mode;
96f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
97f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes
98f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    public void setNestedFlingMode(int mode) {
99f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes        mNestedFlingMode = mode;
100f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes    }
101f129f1b050d2542a91fe8175eac30183beb07b41Chris Banes}
102