diff options
author | Sihua Ma <sihua@google.com> | 2022-12-08 17:38:59 -0800 |
---|---|---|
committer | Sihua Ma <sihua@google.com> | 2023-01-04 15:47:07 -0800 |
commit | db7f098bc15b77ee8ef58b7ed685614ff947e5c7 (patch) | |
tree | eae3898122c68b51931f0fe39c694c4ecb11b3ea | |
parent | 2da05f367dbe145d6cab58febfb9d5b76d0fcee8 (diff) | |
download | Launcher3-db7f098bc15b77ee8ef58b7ed685614ff947e5c7.tar.gz |
Re-enable the fast scroll in widget picker
Fix: 258299457
Test: Manual
Change-Id: Ic069f5304827de40be88b80590f5c6c7d88b13b2
-rw-r--r-- | src/com/android/launcher3/widget/picker/WidgetsFullSheet.java | 46 | ||||
-rw-r--r-- | src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java | 12 |
2 files changed, 56 insertions, 2 deletions
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java index 220d1c1d55..38cdb4b500 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java +++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java @@ -169,6 +169,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet private View mSearchBarContainer; private WidgetsSearchBar mSearchBar; private TextView mHeaderTitle; + private @Nullable WidgetsRecyclerView mCurrentTouchEventRecyclerView; public WidgetsFullSheet(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @@ -642,6 +643,51 @@ public class WidgetsFullSheet extends BaseWidgetSheet return sheet; } + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return isTouchOnScrollbar(ev) || super.onInterceptTouchEvent(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + return maybeHandleTouchEvent(ev) || super.onTouchEvent(ev); + } + + private boolean maybeHandleTouchEvent(MotionEvent ev) { + boolean isEventHandled = false; + + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mCurrentTouchEventRecyclerView = isTouchOnScrollbar(ev) ? getRecyclerView() : null; + } + + if (mCurrentTouchEventRecyclerView != null) { + final float offsetX = mContent.getX(); + final float offsetY = mContent.getY(); + ev.offsetLocation(-offsetX, -offsetY); + isEventHandled = mCurrentTouchEventRecyclerView.dispatchTouchEvent(ev); + ev.offsetLocation(offsetX, offsetY); + } + + if (ev.getAction() == MotionEvent.ACTION_UP + || ev.getAction() == MotionEvent.ACTION_CANCEL) { + mCurrentTouchEventRecyclerView = null; + } + + return isEventHandled; + } + + private boolean isTouchOnScrollbar(MotionEvent ev) { + final float offsetX = mContent.getX(); + final float offsetY = mContent.getY(); + WidgetsRecyclerView rv = getRecyclerView(); + + ev.offsetLocation(-offsetX, -offsetY); + boolean isOnScrollBar = rv != null && rv.getScrollbar() != null && rv.isHitOnScrollBar(ev); + ev.offsetLocation(offsetX, offsetY); + + return isOnScrollBar; + } + /** Gets the {@link WidgetsRecyclerView} which shows all widgets in {@link WidgetsFullSheet}. */ @VisibleForTesting public static WidgetsRecyclerView getWidgetsView(Launcher launcher) { diff --git a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java index 5969e3e154..698e76498a 100644 --- a/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java +++ b/src/com/android/launcher3/widget/picker/WidgetsRecyclerView.java @@ -127,8 +127,7 @@ public class WidgetsRecyclerView extends FastScrollRecyclerView implements OnIte @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { if (e.getAction() == MotionEvent.ACTION_DOWN) { - mTouchDownOnScroller = - mScrollbar.isHitInParent(e.getX(), e.getY(), mFastScrollerOffset); + mTouchDownOnScroller = isHitOnScrollBar(e); } if (mTouchDownOnScroller) { final boolean result = mScrollbar.handleTouchEvent(e, mFastScrollerOffset); @@ -144,6 +143,15 @@ public class WidgetsRecyclerView extends FastScrollRecyclerView implements OnIte } } + /** + * Detects whether a {@code MotionEvent} is on the scroll bar + * @param e The {@code MotionEvent} on the screen + * @return {@code true} if the motion is on the scroll bar + */ + boolean isHitOnScrollBar(MotionEvent e) { + return mScrollbar.isHitInParent(e.getX(), e.getY(), mFastScrollerOffset); + } + @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } |