Merge "Make sure view has focus before starting handwriting" into udc-dev

This commit is contained in:
Justin Ghan
2023-03-13 15:30:14 +00:00
committed by Android (Google) Code Review
2 changed files with 35 additions and 7 deletions

View File

@@ -170,6 +170,9 @@ public class HandwritingInitiator {
findBestCandidateView(mState.mStylusDownX, mState.mStylusDownY);
if (candidateView != null) {
if (candidateView == getConnectedView()) {
if (!candidateView.hasFocus()) {
requestFocusWithoutReveal(candidateView);
}
startHandwriting(candidateView);
} else if (candidateView.getHandwritingDelegatorCallback() != null) {
String delegatePackageName =
@@ -181,13 +184,7 @@ public class HandwritingInitiator {
candidateView, delegatePackageName);
candidateView.getHandwritingDelegatorCallback().run();
} else {
if (candidateView.getRevealOnFocusHint()) {
candidateView.setRevealOnFocusHint(false);
candidateView.requestFocus();
candidateView.setRevealOnFocusHint(true);
} else {
candidateView.requestFocus();
}
requestFocusWithoutReveal(candidateView);
}
}
}
@@ -380,6 +377,16 @@ public class HandwritingInitiator {
return false;
}
private static void requestFocusWithoutReveal(View view) {
if (view.getRevealOnFocusHint()) {
view.setRevealOnFocusHint(false);
view.requestFocus();
view.setRevealOnFocusHint(true);
} else {
view.requestFocus();
}
}
/**
* Given the location of the stylus event, return the best candidate view to initialize
* handwriting mode.

View File

@@ -336,6 +336,27 @@ public class HandwritingInitiatorTest {
verify(mTestView1, times(1)).requestFocus();
}
@Test
public void onTouchEvent_focusView_inputConnectionAlreadyBuilt_stylusMoveOnce_withinHWArea() {
mHandwritingInitiator.onInputConnectionCreated(mTestView1);
final int x1 = (sHwArea1.left + sHwArea1.right) / 2;
final int y1 = (sHwArea1.top + sHwArea1.bottom) / 2;
MotionEvent stylusEvent1 = createStylusEvent(ACTION_DOWN, x1, y1, 0);
mHandwritingInitiator.onTouchEvent(stylusEvent1);
final int x2 = x1 + mHandwritingSlop * 2;
final int y2 = y1;
MotionEvent stylusEvent2 = createStylusEvent(ACTION_MOVE, x2, y2, 0);
mHandwritingInitiator.onTouchEvent(stylusEvent2);
// View has input connection but not focus, so HandwritingInitiator will request focus
// before starting handwriting.
verify(mTestView1).requestFocus();
verify(mHandwritingInitiator).startHandwriting(mTestView1);
}
@Test
public void onTouchEvent_focusView_stylusMoveOnce_withinExtendedHWArea() {
final int x1 = sHwArea1.left - HW_BOUNDS_OFFSETS_LEFT_PX / 2;