Fix handwriting delegation when delegate already has input connection
Bug: 272520612 Test: atest android.view.stylus.HandwritingInitiatorTest Change-Id: Ib6dd1d991f93b8309afc8a6ed3dc44fcc35c9f5c
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user