diff --git a/core/java/android/view/HandwritingInitiator.java b/core/java/android/view/HandwritingInitiator.java index a47783cdacfe7..6b604422ffbaa 100644 --- a/core/java/android/view/HandwritingInitiator.java +++ b/core/java/android/view/HandwritingInitiator.java @@ -204,6 +204,16 @@ public class HandwritingInitiator { mConnectionCount = 0; } + /** + * Notify HandwritingInitiator that a delegate view (see {@link View#isHandwritingDelegate}) + * gained focus. + */ + public void onDelegateViewFocused(@NonNull View view) { + if (view == getConnectedView()) { + tryAcceptStylusHandwritingDelegation(view); + } + } + /** * Notify HandwritingInitiator that a new InputConnection is created. * The caller of this method should guarantee that each onInputConnectionCreated call diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 800fc97d03a6e..aec3487910d84 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -8324,6 +8324,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, onFocusLost(); } else if (hasWindowFocus()) { notifyFocusChangeToImeFocusController(true /* hasFocus */); + + if (mIsHandwritingDelegate) { + ViewRootImpl viewRoot = getViewRootImpl(); + if (viewRoot != null) { + viewRoot.getHandwritingInitiator().onDelegateViewFocused(this); + } + } } invalidate(true); diff --git a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java index 1ec2613dd1011..fccb177dad4fd 100644 --- a/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java +++ b/core/tests/coretests/src/android/view/stylus/HandwritingInitiatorTest.java @@ -24,6 +24,7 @@ import static android.view.stylus.HandwritingTestUtil.createView; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -224,7 +225,7 @@ public class HandwritingInitiatorTest { } @Test - public void onTouchEvent_startHandwriting_delegate() { + public void onTouchEvent_tryAcceptDelegation_delegatorCallbackCreatesInputConnection() { View delegateView = new View(mContext); delegateView.setIsHandwritingDelegate(true); @@ -244,6 +245,29 @@ public class HandwritingInitiatorTest { verify(mHandwritingInitiator, times(1)).tryAcceptStylusHandwritingDelegation(delegateView); } + @Test + public void onTouchEvent_tryAcceptDelegation_delegatorCallbackFocusesDelegate() { + View delegateView = new View(mContext); + delegateView.setIsHandwritingDelegate(true); + mHandwritingInitiator.onInputConnectionCreated(delegateView); + reset(mHandwritingInitiator); + + mTestView1.setHandwritingDelegatorCallback( + () -> mHandwritingInitiator.onDelegateViewFocused(delegateView)); + + 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); + + verify(mHandwritingInitiator, times(1)).tryAcceptStylusHandwritingDelegation(delegateView); + } + @Test public void onTouchEvent_notStartHandwriting_whenHandwritingNotAvailable() { final Rect rect = new Rect(600, 600, 900, 900);