diff options
-rw-r--r-- | res/layout/all_apps_container.xml | 1 | ||||
-rw-r--r-- | res/layout/widgets_view.xml | 1 | ||||
-rw-r--r-- | res/values/styles.xml | 7 | ||||
-rw-r--r-- | src/com/android/launcher3/allapps/AllAppsRecyclerView.java | 19 | ||||
-rw-r--r-- | src/com/android/launcher3/allapps/AllAppsRecyclerViewContainerView.java | 40 | ||||
-rw-r--r-- | src/com/android/launcher3/widget/WidgetsRecyclerView.java | 13 |
6 files changed, 79 insertions, 2 deletions
diff --git a/res/layout/all_apps_container.xml b/res/layout/all_apps_container.xml index 0b624e6a5..0221a568b 100644 --- a/res/layout/all_apps_container.xml +++ b/res/layout/all_apps_container.xml @@ -27,6 +27,7 @@ <!-- DO NOT CHANGE THE ID --> <com.android.launcher3.allapps.AllAppsRecyclerView android:id="@+id/apps_list_view" + android:theme="@style/Theme.Light.CustomOverscroll" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal|top" diff --git a/res/layout/widgets_view.xml b/res/layout/widgets_view.xml index 161c2686d..755634f82 100644 --- a/res/layout/widgets_view.xml +++ b/res/layout/widgets_view.xml @@ -40,6 +40,7 @@ <!-- DO NOT CHANGE THE ID --> <com.android.launcher3.widget.WidgetsRecyclerView android:id="@+id/widgets_list_view" + android:theme="@style/Theme.Dark.CustomOverscroll" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" diff --git a/res/values/styles.xml b/res/values/styles.xml index 1496da994..7d60cbe0a 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -18,6 +18,13 @@ --> <resources> + <style name="Theme.Light.CustomOverscroll" parent="@android:style/Theme.DeviceDefault"> + <item name="android:colorEdgeEffect">@color/folder_edge_effect_color</item> + </style> + + <style name="Theme.Dark.CustomOverscroll" parent="@android:style/Theme.DeviceDefault"> + <item name="android:colorEdgeEffect">@color/workspace_edge_effect_color</item> + </style> <style name="Icon"> <item name="android:layout_width">match_parent</item> 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); @@ -57,6 +61,13 @@ public class AllAppsRecyclerViewContainerView extends FrameLayout } @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) { mTouchFeedbackView.setBitmap(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); + } + } + } } diff --git a/src/com/android/launcher3/widget/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/WidgetsRecyclerView.java index 3101f3327..61e63cdb7 100644 --- a/src/com/android/launcher3/widget/WidgetsRecyclerView.java +++ b/src/com/android/launcher3/widget/WidgetsRecyclerView.java @@ -17,6 +17,7 @@ package com.android.launcher3.widget; import android.content.Context; +import android.graphics.Canvas; import android.graphics.Color; import android.support.v7.widget.LinearLayoutManager; import android.util.AttributeSet; @@ -73,6 +74,18 @@ public class WidgetsRecyclerView extends BaseRecyclerView { public void setWidgets(WidgetsModel widgets) { mWidgets = widgets; } + + /** + * 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); + } /** * Maps the touch (from 0..1) to the adapter position that should be visible. |