diff --git a/res/layout/widgets_view.xml b/res/layout/widgets_view.xml index 0800f59aa8..5cdf56048c 100644 --- a/res/layout/widgets_view.xml +++ b/res/layout/widgets_view.xml @@ -40,7 +40,7 @@ android:clipChildren="false" android:orientation="vertical"> - + * 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 54667384b2..0000000000 --- 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); - } - } -}