1ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler/*
2ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * Copyright (C) 2017 The Android Open Source Project
3ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler *
4ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * Licensed under the Apache License, Version 2.0 (the "License");
5ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * you may not use this file except in compliance with the License.
6ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * You may obtain a copy of the License at
7ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler *
8ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler *      http://www.apache.org/licenses/LICENSE-2.0
9ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler *
10ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * Unless required by applicable law or agreed to in writing, software
11ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * distributed under the License is distributed on an "AS IS" BASIS,
12ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * See the License for the specific language governing permissions and
14ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler * limitations under the License.
15ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler */
16ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschlerpackage com.android.launcher3.allapps;
17ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
187185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyalimport static com.android.launcher3.anim.Interpolators.LINEAR;
197185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal
202153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschlerimport android.animation.ValueAnimator;
213d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschlerimport android.content.Context;
22ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschlerimport android.graphics.Point;
23ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschlerimport android.graphics.Rect;
24ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschlerimport android.support.annotation.NonNull;
25ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschlerimport android.support.annotation.Nullable;
26ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschlerimport android.support.v7.widget.RecyclerView;
273d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschlerimport android.util.AttributeSet;
28ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschlerimport android.view.MotionEvent;
29ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschlerimport android.view.View;
302153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschlerimport android.view.ViewGroup;
31426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyalimport android.widget.LinearLayout;
32ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
33ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschlerimport com.android.launcher3.R;
347185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyalimport com.android.launcher3.anim.PropertySetter;
35ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
36426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyalpublic class FloatingHeaderView extends LinearLayout implements
373d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        ValueAnimator.AnimatorUpdateListener {
38ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
39ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    private final Rect mClip = new Rect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
402153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0);
41ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    private final Point mTempOffset = new Point();
423d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
433d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        @Override
443d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
453d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        }
463d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler
473d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        @Override
483d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        public void onScrolled(RecyclerView rv, int dx, int dy) {
49527051aaba435f7750c293012f13dc84ca300978Mario Bertschler            if (rv != mCurrentRV) {
503d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler                return;
513d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler            }
523d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler
533d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler            if (mAnimator.isStarted()) {
543d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler                mAnimator.cancel();
553d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler            }
56ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
57527051aaba435f7750c293012f13dc84ca300978Mario Bertschler            int current = -mCurrentRV.getCurrentScrollY();
583d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler            moved(current);
593d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler            apply();
603d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        }
613d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    };
623d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler
637185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    protected ViewGroup mTabLayout;
642d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler    private AllAppsRecyclerView mMainRV;
652d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler    private AllAppsRecyclerView mWorkRV;
66527051aaba435f7750c293012f13dc84ca300978Mario Bertschler    private AllAppsRecyclerView mCurrentRV;
67ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    private ViewGroup mParent;
68527051aaba435f7750c293012f13dc84ca300978Mario Bertschler    private boolean mHeaderCollapsed;
69ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    private int mSnappedScrolledY;
70ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    private int mTranslationY;
717185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal
727185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    private boolean mAllowTouchForwarding;
73ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    private boolean mForwardToRecyclerView;
74ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
75dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal    protected boolean mTabsHidden;
76426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal    protected int mMaxTranslation;
771a637bee188aadb4283f1d5fa255c39b7a9fd2f3Mario Bertschler    private boolean mMainRVActive = true;
78426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal
793d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    public FloatingHeaderView(@NonNull Context context) {
803d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        this(context, null);
813d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    }
823d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler
833d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    public FloatingHeaderView(@NonNull Context context, @Nullable AttributeSet attrs) {
843d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        super(context, attrs);
853d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    }
863d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler
873d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    @Override
883d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler    protected void onFinishInflate() {
893d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        super.onFinishInflate();
903d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler        mTabLayout = findViewById(R.id.tabs);
912153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    }
922153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler
93426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal    public void setup(AllAppsContainerView.AdapterHolder[] mAH, boolean tabsHidden) {
94dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal        mTabsHidden = tabsHidden;
95426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal        mTabLayout.setVisibility(tabsHidden ? View.GONE : View.VISIBLE);
96527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        mMainRV = setupRV(mMainRV, mAH[AllAppsContainerView.AdapterHolder.MAIN].recyclerView);
97527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        mWorkRV = setupRV(mWorkRV, mAH[AllAppsContainerView.AdapterHolder.WORK].recyclerView);
98527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        mParent = (ViewGroup) mMainRV.getParent();
99d460c084eb4751436e7ebd9c3025defca7b236a3Mario Bertschler        setMainActive(mMainRVActive || mWorkRV == null);
1007185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        reset(false);
1012153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    }
1022153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler
1032d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler    private AllAppsRecyclerView setupRV(AllAppsRecyclerView old, AllAppsRecyclerView updated) {
1042d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler        if (old != updated && updated != null ) {
1053d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler            updated.addOnScrollListener(mOnScrollListener);
1062d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler        }
1072d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler        return updated;
1082d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler    }
1092d3157a0bf660e925ef662d007ce9c4d4f2e7eccMario Bertschler
110ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    public void setMainActive(boolean active) {
111527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        mCurrentRV = active ? mMainRV : mWorkRV;
1121a637bee188aadb4283f1d5fa255c39b7a9fd2f3Mario Bertschler        mMainRVActive = active;
113ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    }
114ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
115426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal    public int getMaxTranslation() {
116dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal        if (mMaxTranslation == 0 && mTabsHidden) {
117dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal            return getResources().getDimensionPixelSize(R.dimen.all_apps_search_bar_bottom_padding);
118dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal        } else if (mMaxTranslation > 0 && mTabsHidden) {
119dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal            return mMaxTranslation + getPaddingTop();
120dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal        } else {
121dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal            return mMaxTranslation;
122dbd6bb348c1c10e34d7488a741845648e1f7e88cSunny Goyal        }
1232153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    }
1242153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler
1252153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    private boolean canSnapAt(int currentScrollY) {
126426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal        return Math.abs(currentScrollY) <= mMaxTranslation;
127ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    }
128ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
129ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    private void moved(final int currentScrollY) {
130527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        if (mHeaderCollapsed) {
131ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            if (currentScrollY <= mSnappedScrolledY) {
1322153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler                if (canSnapAt(currentScrollY)) {
1332153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler                    mSnappedScrolledY = currentScrollY;
1342153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler                }
135ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            } else {
136527051aaba435f7750c293012f13dc84ca300978Mario Bertschler                mHeaderCollapsed = false;
137ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            }
138ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            mTranslationY = currentScrollY;
139527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        } else if (!mHeaderCollapsed) {
140ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            mTranslationY = currentScrollY - mSnappedScrolledY - mMaxTranslation;
141ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
142ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            // update state vars
143ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            if (mTranslationY >= 0) { // expanded: must not move down further
144ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler                mTranslationY = 0;
145ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler                mSnappedScrolledY = currentScrollY - mMaxTranslation;
146ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            } else if (mTranslationY <= -mMaxTranslation) { // hide or stay hidden
147527051aaba435f7750c293012f13dc84ca300978Mario Bertschler                mHeaderCollapsed = true;
148dd2424296a5639cdd707ebc2a7a830471aa4c3ddMario Bertschler                mSnappedScrolledY = -mMaxTranslation;
149ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            }
150ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler        }
151ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    }
152ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
153426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal    protected void applyScroll(int uncappedY, int currentY) { }
154426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal
155426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal    protected void apply() {
1562153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler        int uncappedTranslationY = mTranslationY;
157ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler        mTranslationY = Math.max(mTranslationY, -mMaxTranslation);
158426345bfc432ddcbb558d08239ec70a36cd40388Sunny Goyal        applyScroll(uncappedTranslationY, mTranslationY);
1592153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler        mTabLayout.setTranslationY(mTranslationY);
160ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler        mClip.top = mMaxTranslation + mTranslationY;
1612153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler        // clipping on a draw might cause additional redraw
162ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler        mMainRV.setClipBounds(mClip);
163ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler        if (mWorkRV != null) {
164ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler            mWorkRV.setClipBounds(mClip);
165ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler        }
166ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    }
167ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
1687185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    public void reset(boolean animate) {
1697185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        if (mAnimator.isStarted()) {
1707185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            mAnimator.cancel();
1717185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        }
1727185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        if (animate) {
1737185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            mAnimator.setIntValues(mTranslationY, 0);
1747185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            mAnimator.addUpdateListener(this);
1757185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            mAnimator.setDuration(150);
1767185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            mAnimator.start();
1777185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        } else {
1787185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            mTranslationY = 0;
1797185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            apply();
1807185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        }
181f66589db3501e34ff9d81dd1ded4464c5be39218Mario Bertschler        mHeaderCollapsed = false;
182f66589db3501e34ff9d81dd1ded4464c5be39218Mario Bertschler        mSnappedScrolledY = -mMaxTranslation;
18394cb9e5288eeaa65811fcd259e17c4c318288510Mario Bertschler        mCurrentRV.scrollToTop();
184ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    }
185ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
186ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    public boolean isExpanded() {
187527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        return !mHeaderCollapsed;
188ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler    }
189ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler
1902153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    @Override
1912153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    public void onAnimationUpdate(ValueAnimator animation) {
1922153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler        mTranslationY = (Integer) animation.getAnimatedValue();
1932153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler        apply();
1942153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler    }
1952153e1c814d571a3666a13df8e0919bb30fdd855Mario Bertschler
196ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    @Override
197ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    public boolean onInterceptTouchEvent(MotionEvent ev) {
1987185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        if (!mAllowTouchForwarding) {
1997185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            mForwardToRecyclerView = false;
2007185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal            return super.onInterceptTouchEvent(ev);
2017185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        }
202ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler        calcOffset(mTempOffset);
203ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler        ev.offsetLocation(mTempOffset.x, mTempOffset.y);
204527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        mForwardToRecyclerView = mCurrentRV.onInterceptTouchEvent(ev);
205ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler        ev.offsetLocation(-mTempOffset.x, -mTempOffset.y);
206ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler        return mForwardToRecyclerView || super.onInterceptTouchEvent(ev);
207ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    }
208ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler
209ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    @Override
210ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    public boolean onTouchEvent(MotionEvent event) {
211ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler        if (mForwardToRecyclerView) {
212ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler            // take this view's and parent view's (view pager) location into account
213ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler            calcOffset(mTempOffset);
214ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler            event.offsetLocation(mTempOffset.x, mTempOffset.y);
215ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler            try {
216527051aaba435f7750c293012f13dc84ca300978Mario Bertschler                return mCurrentRV.onTouchEvent(event);
217ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler            } finally {
218ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler                event.offsetLocation(-mTempOffset.x, -mTempOffset.y);
219ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler            }
220ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler        } else {
221ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler            return super.onTouchEvent(event);
222ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler        }
223ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    }
224ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler
225ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    private void calcOffset(Point p) {
226527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        p.x = getLeft() - mCurrentRV.getLeft() - mParent.getLeft();
227527051aaba435f7750c293012f13dc84ca300978Mario Bertschler        p.y = getTop() - mCurrentRV.getTop() - mParent.getTop();
228ea0eb4bb4bd7979c3bfbd0c03bee640da29d0c4aMario Bertschler    }
2297185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal
2307185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    public void setContentVisibility(boolean hasHeader, boolean hasContent, PropertySetter setter) {
2317185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        setter.setViewAlpha(this, hasContent ? 1 : 0, LINEAR);
2327185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        allowTouchForwarding(hasContent);
2337185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    }
2347185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal
2357185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    protected void allowTouchForwarding(boolean allow) {
2367185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        mAllowTouchForwarding = allow;
2377185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    }
2387185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal
2397185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    public boolean hasVisibleContent() {
2407185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal        return false;
2417185dd63eb8942dec65c2babeb39ee6ec64b4533Sunny Goyal    }
242de967a2355752c2653ed14a1d57a7a8c8c2eef57Sunny Goyal
243de967a2355752c2653ed14a1d57a7a8c8c2eef57Sunny Goyal    @Override
244de967a2355752c2653ed14a1d57a7a8c8c2eef57Sunny Goyal    public boolean hasOverlappingRendering() {
245de967a2355752c2653ed14a1d57a7a8c8c2eef57Sunny Goyal        return false;
246de967a2355752c2653ed14a1d57a7a8c8c2eef57Sunny Goyal    }
247ac9408a5cd7744a8dbc66a61114665ab6e4051deMario Bertschler}
2483d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler
2493d87ed17b36a382cbff447ed103b0771e0692ffbMario Bertschler
250