Scribe: Find candidate view in stylus down event

In the initial implementation, HandwritingInitiator looks for a
handwriting candidate view when a stylus motion has exceeded the touch
slop distance.

This updates the implementation to look for the handwriting candidate
view in the stylus down event. The overall resulting behaviour is
unchanged.

This is needed for an upcoming change to stop dispatching MotionEvents
to the view tree if they are for a stylus movement on a handwriting
candidate view, in order to prevent scrolling before handwriting is
initiated.

Bug: 228210945
Test: atest CtsInputMethodTestCases:android.view.inputmethod.cts.StylusHandwritingTest
Change-Id: I395c2ec4b16a3fd3cb56308da872ec959e93943e
This commit is contained in:
Justin Ghan
2022-04-27 16:24:10 -07:00
parent 9207ef88f7
commit 08a94de0de

View File

@@ -68,19 +68,9 @@ public class HandwritingInitiator {
*/
private final long mHandwritingTimeoutInMillis;
private State mState = new State();
private final State mState = new State();
private final HandwritingAreaTracker mHandwritingAreasTracker = new HandwritingAreaTracker();
/**
* Helper method to reset the internal state of this class.
* Calling this method will also prevent the following MotionEvents
* triggers handwriting until the next stylus ACTION_DOWN/ACTION_POINTER_DOWN
* arrives.
*/
private void reset() {
mState = new State();
}
/** The reference to the View that currently has the input connection. */
@Nullable
@VisibleForTesting
@@ -132,6 +122,8 @@ public class HandwritingInitiator {
mState.mStylusDownTimeInMillis = motionEvent.getEventTime();
mState.mStylusDownX = motionEvent.getX(actionIndex);
mState.mStylusDownY = motionEvent.getY(actionIndex);
mState.mStylusDownCandidateView = new WeakReference<>(
findBestCandidateView(mState.mStylusDownX, mState.mStylusDownY));
mState.mShouldInitHandwriting = true;
mState.mExceedTouchSlop = false;
break;
@@ -146,7 +138,7 @@ public class HandwritingInitiator {
case MotionEvent.ACTION_UP:
// If it's ACTION_CANCEL or ACTION_UP, all the pointers go up. There is no need to
// check whether the stylus we are tracking goes up.
reset();
mState.mShouldInitHandwriting = false;
break;
case MotionEvent.ACTION_MOVE:
// Either we've already tried to initiate handwriting, or the ongoing MotionEvent
@@ -158,7 +150,7 @@ public class HandwritingInitiator {
final long timeElapsed =
motionEvent.getEventTime() - mState.mStylusDownTimeInMillis;
if (timeElapsed > mHandwritingTimeoutInMillis) {
reset();
mState.mShouldInitHandwriting = false;
return;
}
@@ -167,8 +159,13 @@ public class HandwritingInitiator {
final float y = motionEvent.getY(pointerIndex);
if (largerThanTouchSlop(x, y, mState.mStylusDownX, mState.mStylusDownY)) {
mState.mExceedTouchSlop = true;
View candidateView =
findBestCandidateView(mState.mStylusDownX, mState.mStylusDownY);
View candidateView = mState.mStylusDownCandidateView.get();
if (candidateView == null || !candidateView.isAttachedToWindow()) {
// If there was no candidate view found in the stylus down event, or if that
// candidate view is no longer attached, search again for a candidate view.
candidateView = findBestCandidateView(mState.mStylusDownX,
mState.mStylusDownY);
}
if (candidateView != null) {
if (candidateView == getConnectedView()) {
startHandwriting(candidateView);
@@ -266,7 +263,7 @@ public class HandwritingInitiator {
mState.mStylusDownX, mState.mStylusDownY)) {
startHandwriting(connectedView);
} else {
reset();
mState.mShouldInitHandwriting = false;
}
}
@@ -274,7 +271,7 @@ public class HandwritingInitiator {
@VisibleForTesting
public void startHandwriting(@NonNull View view) {
mImm.startStylusHandwriting(view);
reset();
mState.mShouldInitHandwriting = false;
}
/**
@@ -464,6 +461,12 @@ public class HandwritingInitiator {
/** The initial location where the stylus pointer goes down. */
private float mStylusDownX = Float.NaN;
private float mStylusDownY = Float.NaN;
/**
* The best candidate view to initialize handwriting mode based on the initial location
* where the stylus pointer goes down, or null if the location was not within any candidate
* view's handwriting area.
*/
private WeakReference<View> mStylusDownCandidateView = new WeakReference<>(null);
}
/** The helper method to check if the given view is still active for handwriting. */