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