From 243fdd7cdf262b341b4f66177af27eec4f5cde45 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 22 Jun 2015 19:48:07 -0700 Subject: Working around overscroll issues in AllApps. - For the time being, we are going to do custom drawing to ensure that we get the touch events in the right order, while still allowing the recycler view to draw the overscroll effect on top of the prediction bar. Bug: 21335369 Change-Id: I6bf64e5c1e9aa634a953223a5decf74942e4fb57 --- .../launcher3/allapps/AllAppsRecyclerView.java | 19 ++++++++-- .../allapps/AllAppsRecyclerViewContainerView.java | 40 ++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) (limited to 'src/com/android/launcher3/allapps') diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java index a17f0e35d..c83c6cfd9 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java @@ -16,10 +16,12 @@ package com.android.launcher3.allapps; import android.content.Context; +import android.graphics.Canvas; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; +import android.view.ContextThemeWrapper; import android.view.View; import com.android.launcher3.BaseRecyclerView; import com.android.launcher3.BaseRecyclerViewFastScrollBar; @@ -70,8 +72,9 @@ public class AllAppsRecyclerView extends BaseRecyclerView public AllAppsRecyclerView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); - mLauncher = (Launcher) context; - setOverScrollMode(View.OVER_SCROLL_NEVER); + // We have a theme on this view, so we need to coerce the base activity context from that + ContextThemeWrapper ctx = (ContextThemeWrapper) context; + mLauncher = (Launcher) ctx.getBaseContext(); } /** @@ -125,6 +128,18 @@ public class AllAppsRecyclerView extends BaseRecyclerView return 0; } + /** + * We need to override the draw to ensure that we don't draw the overscroll effect beyond the + * background bounds. + */ + @Override + protected void dispatchDraw(Canvas canvas) { + canvas.clipRect(mBackgroundPadding.left, mBackgroundPadding.top, + getWidth() - mBackgroundPadding.right, + getHeight() - mBackgroundPadding.bottom); + super.dispatchDraw(canvas); + } + @Override protected void onFinishInflate() { super.onFinishInflate(); diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java index 8a8afde51..1c51ab763 100644 --- a/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java +++ b/src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java @@ -17,7 +17,9 @@ package com.android.launcher3.allapps; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.Canvas; import android.util.AttributeSet; +import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import com.android.launcher3.BubbleTextView; @@ -25,6 +27,7 @@ import com.android.launcher3.BubbleTextView.BubbleTextShadowHandler; import com.android.launcher3.ClickShadowView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Launcher; +import com.android.launcher3.R; /** * A container for RecyclerView to allow for the click shadow view to be shown behind an icon that @@ -34,6 +37,7 @@ public class AllAppsRecyclerViewContainerView extends FrameLayout implements BubbleTextShadowHandler { private final ClickShadowView mTouchFeedbackView; + private View mPredictionBarView; public AllAppsRecyclerViewContainerView(Context context) { this(context, null); @@ -56,6 +60,13 @@ public class AllAppsRecyclerViewContainerView extends FrameLayout addView(mTouchFeedbackView, size, size); } + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mPredictionBarView = findViewById(R.id.prediction_bar); + } + @Override public void setPressedIcon(BubbleTextView icon, Bitmap background) { if (icon == null || background == null) { @@ -66,4 +77,33 @@ public class AllAppsRecyclerViewContainerView extends FrameLayout mTouchFeedbackView.animateShadow(); } } + + /** + * This allows us to have custom drawing order, while keeping touch handling in correct z-order. + */ + @Override + protected void dispatchDraw(Canvas canvas) { + final long drawingTime = getDrawingTime(); + + // Draw the click feedback first (since it is always on the bottom) + if (mTouchFeedbackView != null && mTouchFeedbackView.getVisibility() == View.VISIBLE) { + drawChild(canvas, mTouchFeedbackView, drawingTime); + } + + // Then draw the prediction bar, since it needs to be "under" the recycler view to get the + // right edge effect to be drawn over it + if (mPredictionBarView != null && mPredictionBarView.getVisibility() == View.VISIBLE) { + drawChild(canvas, mPredictionBarView, drawingTime); + } + + // Draw the remaining views + int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + View v = getChildAt(i); + if (v != mTouchFeedbackView && v != mPredictionBarView && + v.getVisibility() == View.VISIBLE) { + drawChild(canvas, v, drawingTime); + } + } + } } -- cgit v1.2.3