From e48009919dde13fded7242549413b018daa64a04 Mon Sep 17 00:00:00 2001 From: "Liam, Lee Pong Lam" Date: Tue, 4 Jun 2024 00:34:49 +0000 Subject: [PATCH] [Launcher3] Hide keyboard when fastscroller scrolling down and keyboard shown Implement keyboard hiding logic: Hide keyboard when scrolling down (y > mLastY) unless already requested (mRequestedHideKeyboard). Track hide request state to prevent redundant calls. New added logic: Only hide keyobard while dragging the scrollbar result video: https://photos.app.goo.gl/e4dYUUiUN3BujNUz9 Bug: 333967597 Flag: EXEMPT bugfix Test: Manual Change-Id: Id672763c69cbb37aeb7a1fd3f17eb168de9f49b4 --- .../views/RecyclerViewFastScroller.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java index df8f635525..fa17b7bcfe 100644 --- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java +++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java @@ -109,6 +109,13 @@ public class RecyclerViewFastScroller extends View { private float mLastTouchY; private boolean mIsDragging; + /** + * Tracks whether a keyboard hide request has been sent due to downward scrolling. + *

+ * Set to true when scrolling down and reset when scrolling up to prevents redundant hide + * requests during continuous downward scrolls. + */ + private boolean mRequestedHideKeyboard; private boolean mIsThumbDetached; private final boolean mCanThumbDetach; private boolean mIgnoreDragGesture; @@ -127,6 +134,7 @@ public class RecyclerViewFastScroller extends View { protected FastScrollRecyclerView mRv; private RecyclerView.OnScrollListener mOnScrollListener; + private final ActivityContext mActivityContext; private int mDownX; private int mDownY; @@ -163,7 +171,7 @@ public class RecyclerViewFastScroller extends View { mDeltaThreshold = res.getDisplayMetrics().density * SCROLL_DELTA_THRESHOLD_DP; mScrollbarLeftOffsetTouchDelegate = res.getDisplayMetrics().density * SCROLLBAR_LEFT_OFFSET_TOUCH_DELEGATE_DP; - + mActivityContext = ActivityContext.lookupContext(context); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RecyclerViewFastScroller, defStyleAttr, 0); mCanThumbDetach = ta.getBoolean(R.styleable.RecyclerViewFastScroller_canThumbDetach, false); @@ -248,6 +256,7 @@ public class RecyclerViewFastScroller extends View { mDownX = x; mDownY = mLastY = y; mDownTimeStampMillis = ev.getDownTime(); + mRequestedHideKeyboard = false; if ((Math.abs(mDy) < mDeltaThreshold && mRv.getScrollState() != SCROLL_STATE_IDLE)) { @@ -260,6 +269,7 @@ public class RecyclerViewFastScroller extends View { } break; case MotionEvent.ACTION_MOVE: + boolean isScrollingDown = y > mLastY; mLastY = y; int absDeltaY = Math.abs(y - mDownY); int absDeltaX = Math.abs(x - mDownX); @@ -275,6 +285,14 @@ public class RecyclerViewFastScroller extends View { } } if (mIsDragging) { + if (isScrollingDown) { + if (!mRequestedHideKeyboard) { + mActivityContext.hideKeyboard(); + } + mRequestedHideKeyboard = true; + } else { + mRequestedHideKeyboard = false; + } updateFastScrollSectionNameAndThumbOffset(y); } break; @@ -294,7 +312,6 @@ public class RecyclerViewFastScroller extends View { } private void calcTouchOffsetAndPrepToFastScroll(int downY, int lastY) { - ActivityContext.lookupContext(getContext()).hideKeyboard(); mIsDragging = true; if (mCanThumbDetach) { mIsThumbDetached = true;