Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 450c8dfe authored by Justin Ghan's avatar Justin Ghan
Browse files

Fix handwriting delegation when delegate already has input connection

Bug: 272520612
Test: atest android.view.stylus.HandwritingInitiatorTest
Change-Id: Ib6dd1d991f93b8309afc8a6ed3dc44fcc35c9f5c
parent aca621c2
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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);
+25 −1
Original line number Diff line number Diff line
@@ -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);