From ebe1734a67dff9ab46f3c6cce328a86b714ce620 Mon Sep 17 00:00:00 2001 From: Hyunyoung Song Date: Wed, 6 May 2015 17:49:33 -0700 Subject: Make drag and drop also work when the widget tray is still in scroll mode. b/20698514 Change-Id: Ic075f0016d5e00bbdec193bbcd2e311da1957388 --- .../launcher3/AppsContainerRecyclerView.java | 17 +++- .../widget/WidgetsContainerRecyclerView.java | 80 +++++++++++++++++++ .../android/launcher3/widget/WidgetsRowView.java | 90 ---------------------- 3 files changed, 96 insertions(+), 91 deletions(-) create mode 100644 src/com/android/launcher3/widget/WidgetsContainerRecyclerView.java delete mode 100644 src/com/android/launcher3/widget/WidgetsRowView.java (limited to 'src/com') diff --git a/src/com/android/launcher3/AppsContainerRecyclerView.java b/src/com/android/launcher3/AppsContainerRecyclerView.java index f8897128e..da81f58a4 100644 --- a/src/com/android/launcher3/AppsContainerRecyclerView.java +++ b/src/com/android/launcher3/AppsContainerRecyclerView.java @@ -40,6 +40,11 @@ public class AppsContainerRecyclerView extends RecyclerView implements RecyclerView.OnItemTouchListener { private static final float FAST_SCROLL_OVERLAY_Y_OFFSET_FACTOR = 1.5f; + private static final int SCROLL_DELTA_THRESHOLD = 6; + + /** Keeps the last known scrolling delta/velocity along y-axis. */ + private int mDy = 0; + private float mDeltaThreshold; private AlphabeticalAppsList mApps; private int mNumAppsPerRow; @@ -92,6 +97,7 @@ public class AppsContainerRecyclerView extends RecyclerView mScrollbarInset = res.getDimensionPixelSize(R.dimen.apps_view_fast_scroll_scrubber_touch_inset); setFastScrollerAlpha(getFastScrollerAlpha()); + mDeltaThreshold = getResources().getDisplayMetrics().density * SCROLL_DELTA_THRESHOLD; } /** @@ -132,6 +138,7 @@ public class AppsContainerRecyclerView extends RecyclerView @Override protected void onFinishInflate() { + super.onFinishInflate(); addOnItemTouchListener(this); } @@ -142,6 +149,11 @@ public class AppsContainerRecyclerView extends RecyclerView drawFastScrollerPopup(canvas); } + @Override + public void onScrolled(int dx, int dy) { + mDy = dy; + } + /** * We intercept the touch handling only to support fast scrolling when initiated from the * scroll bar. Otherwise, we fall back to the default RecyclerView touch handling. @@ -175,7 +187,10 @@ public class AppsContainerRecyclerView extends RecyclerView // Keep track of the down positions mDownX = mLastX = x; mDownY = mLastY = y; - stopScroll(); + if ((Math.abs(mDy) < mDeltaThreshold && + getScrollState() != RecyclerView.SCROLL_STATE_IDLE)) { + stopScroll(); + } break; case MotionEvent.ACTION_MOVE: // Check if we are scrolling diff --git a/src/com/android/launcher3/widget/WidgetsContainerRecyclerView.java b/src/com/android/launcher3/widget/WidgetsContainerRecyclerView.java new file mode 100644 index 000000000..56791c041 --- /dev/null +++ b/src/com/android/launcher3/widget/WidgetsContainerRecyclerView.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.widget; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.MotionEvent; + +/** + * The widgets recycler view container. + *

+ * Overwritten to NOT intercept a touch sequence that started when the {@link RecycleView} + * scrolling slowing down below the internally defined threshold. + */ +public class WidgetsContainerRecyclerView extends RecyclerView + implements RecyclerView.OnItemTouchListener { + + private static final int SCROLL_DELTA_THRESHOLD = 6; + + /** Keeps the last known scrolling delta/velocity along y-axis. */ + private int mDy = 0; + private float mDeltaThreshold; + + public WidgetsContainerRecyclerView(Context context) { + this(context, null); + } + + public WidgetsContainerRecyclerView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public WidgetsContainerRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + mDeltaThreshold = getResources().getDisplayMetrics().density * SCROLL_DELTA_THRESHOLD; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + addOnItemTouchListener(this); + } + + @Override + public void onScrolled(int dx, int dy) { + mDy = dy; + } + + @Override + public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + if ((Math.abs(mDy) < mDeltaThreshold && + getScrollState() != RecyclerView.SCROLL_STATE_IDLE)) { + // now the touch events are being passed to the {@link WidgetCell} until the + // touch sequence goes over the touch slop. + stopScroll(); + } + } + return false; + } + + @Override + public void onTouchEvent(RecyclerView rv, MotionEvent ev) { + // Do nothing. + } +} \ No newline at end of file diff --git a/src/com/android/launcher3/widget/WidgetsRowView.java b/src/com/android/launcher3/widget/WidgetsRowView.java deleted file mode 100644 index 54667384b..000000000 --- a/src/com/android/launcher3/widget/WidgetsRowView.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.launcher3.widget; - -import android.content.Context; -import android.view.MotionEvent; -import android.widget.FrameLayout; -import android.widget.HorizontalScrollView; -import android.widget.TextView; - -import com.android.launcher3.R; - -/** - * Layout used for widget tray rows for each app. For performance, this view can be replaced with - * a {@link RecyclerView} in the future if we settle on scrollable single row for the widgets. - * If we decide on collapsable grid, then HorizontalScrollView can be replaced with a - * {@link GridLayout}. - */ -public class WidgetsRowView extends HorizontalScrollView { - static final String TAG = "WidgetsRow"; - - private Runnable mOnLayoutListener; - private String mAppName; - - public WidgetsRowView(Context context, String appName) { - super(context, null, 0); - mAppName = appName; - } - - /** - * Clears all the key listeners for the individual widgets. - */ - public void resetChildrenOnKeyListeners() { - int childCount = getChildCount(); - for (int j = 0; j < childCount; ++j) { - getChildAt(j).setOnKeyListener(null); - } - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - TextView tv = (TextView) findViewById(R.id.widget_name); - tv.setText(mAppName); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mOnLayoutListener = null; - } - - public void setOnLayoutListener(Runnable r) { - mOnLayoutListener = r; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); - if (mOnLayoutListener != null) { - mOnLayoutListener.run(); - } - } - - @Override - public boolean onTouchEvent(MotionEvent event) { - boolean result = super.onTouchEvent(event); - return result; - } - - public static class LayoutParams extends FrameLayout.LayoutParams { - public LayoutParams(int width, int height) { - super(width, height); - } - } -} -- cgit v1.2.3