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