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

Commit a383f339 authored by lpeter's avatar lpeter Committed by Ahaan Ugale
Browse files

Change to drop down when the inline suggestions don't be shown in IME.

The current implementation has a problem where:
In the autofill side, there can be multiple autofill sessions existed
at the same time. But in the IME side, there is always only one
InlineSuggestionSession at any given time. It will cause the previous
autofill session to fail communication with IME.

It would better change to drop down UI when the autofill inline
suggestions don't be shown in IME.

How to reproduce this issue:
To add an input field with autofillable into the authentication activity
of InlineFillService. To tap on the input field of the authentication
activity during the authentication flow. After completing the
authentication, the inline suggestions won't be shown in IME.

BTW, if the input field is marked as non-autofillable, this issue won't
occur.

Manual verification:
1.Tested this patch with InlineFillService and it worked well.
2.Feng also helped to test this patch with the webview
(sort of randomly), and didn't find any broken case

Bug: 158877106
Test: atest CtsInputMethodTestCases
Test: atest CtsAutoFillServiceTestCases
Test: new CTS test Ie1d9055b0eabfcaa00861869467be8dcee25833e
Test: manual verification with InlineFillService
Test: Feng also helped to test this patch with the webview
Change-Id: Ib06edd823fa4478f34362164f3f7dd3544e51705
parent db6e1115
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -149,6 +149,11 @@ class InlineSuggestionSession {
     */
     */
    @MainThread
    @MainThread
    void invalidate() {
    void invalidate() {
        try {
            mCallback.onInlineSuggestionsSessionInvalidated();
        } catch (RemoteException e) {
            Log.w(TAG, "onInlineSuggestionsSessionInvalidated() remote exception:" + e);
        }
        if (mResponseCallback != null) {
        if (mResponseCallback != null) {
            consumeInlineSuggestionsResponse(EMPTY_RESPONSE);
            consumeInlineSuggestionsResponse(EMPTY_RESPONSE);
            mResponseCallback.invalidate();
            mResponseCallback.invalidate();
+3 −0
Original line number Original line Diff line number Diff line
@@ -58,4 +58,7 @@ oneway interface IInlineSuggestionsRequestCallback {
    //  #onFinishInput()} is called on the field specified by the earlier
    //  #onFinishInput()} is called on the field specified by the earlier
    //  {@link #onInputMethodStartInput(AutofillId)}.
    //  {@link #onInputMethodStartInput(AutofillId)}.
    void onInputMethodFinishInput();
    void onInputMethodFinishInput();

    // Indicates that the current IME changes inline suggestion session.
    void onInlineSuggestionsSessionInvalidated();
}
}
+31 −1
Original line number Original line Diff line number Diff line
@@ -103,6 +103,8 @@ final class AutofillInlineSuggestionsRequestSession {
    private boolean mDestroyed = false;
    private boolean mDestroyed = false;
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private boolean mPreviousHasNonPinSuggestionShow;
    private boolean mPreviousHasNonPinSuggestionShow;
    @GuardedBy("mLock")
    private boolean mImeSessionInvalidated = false;


    AutofillInlineSuggestionsRequestSession(
    AutofillInlineSuggestionsRequestSession(
            @NonNull InputMethodManagerInternal inputMethodManagerInternal, int userId,
            @NonNull InputMethodManagerInternal inputMethodManagerInternal, int userId,
@@ -157,7 +159,7 @@ final class AutofillInlineSuggestionsRequestSession {
            Slog.d(TAG,
            Slog.d(TAG,
                    "onInlineSuggestionsResponseLocked called for:" + inlineFillUi.getAutofillId());
                    "onInlineSuggestionsResponseLocked called for:" + inlineFillUi.getAutofillId());
        }
        }
        if (mImeRequest == null || mResponseCallback == null) {
        if (mImeRequest == null || mResponseCallback == null || mImeSessionInvalidated) {
            return false;
            return false;
        }
        }
        // TODO(b/151123764): each session should only correspond to one field.
        // TODO(b/151123764): each session should only correspond to one field.
@@ -191,6 +193,7 @@ final class AutofillInlineSuggestionsRequestSession {
        if (mDestroyed) {
        if (mDestroyed) {
            return;
            return;
        }
        }
        mImeSessionInvalidated = false;
        if (sDebug) Slog.d(TAG, "onCreateInlineSuggestionsRequestLocked called: " + mAutofillId);
        if (sDebug) Slog.d(TAG, "onCreateInlineSuggestionsRequestLocked called: " + mAutofillId);
        mInputMethodManagerInternal.onCreateInlineSuggestionsRequest(mUserId,
        mInputMethodManagerInternal.onCreateInlineSuggestionsRequest(mUserId,
                new InlineSuggestionsRequestInfo(mComponentName, mAutofillId, mUiExtras),
                new InlineSuggestionsRequestInfo(mComponentName, mAutofillId, mUiExtras),
@@ -291,6 +294,7 @@ final class AutofillInlineSuggestionsRequestSession {
                return;
                return;
            }
            }
            mImeRequestReceived = true;
            mImeRequestReceived = true;
            mImeSessionInvalidated = false;


            if (request != null && callback != null) {
            if (request != null && callback != null) {
                mImeRequest = request;
                mImeRequest = request;
@@ -346,6 +350,20 @@ final class AutofillInlineSuggestionsRequestSession {
        }
        }
    }
    }


    /**
     * Handles the IME session status received from the IME.
     *
     * <p> Should only be invoked in the {@link #mHandler} thread.
     */
    private void handleOnReceiveImeSessionInvalidated() {
        synchronized (mLock) {
            if (mDestroyed) {
                return;
            }
            mImeSessionInvalidated = true;
        }
    }

    private static final class InlineSuggestionsRequestCallbackImpl extends
    private static final class InlineSuggestionsRequestCallbackImpl extends
            IInlineSuggestionsRequestCallback.Stub {
            IInlineSuggestionsRequestCallback.Stub {


@@ -433,6 +451,18 @@ final class AutofillInlineSuggestionsRequestSession {
                        session, false, false));
                        session, false, false));
            }
            }
        }
        }

        @BinderThread
        @Override
        public void onInlineSuggestionsSessionInvalidated() throws RemoteException {
            if (sDebug) Slog.d(TAG, "onInlineSuggestionsSessionInvalidated() called.");
            final AutofillInlineSuggestionsRequestSession session = mSession.get();
            if (session != null) {
                session.mHandler.sendMessage(obtainMessage(
                        AutofillInlineSuggestionsRequestSession
                                ::handleOnReceiveImeSessionInvalidated, session));
            }
        }
    }
    }


    private static boolean match(@Nullable AutofillId autofillId,
    private static boolean match(@Nullable AutofillId autofillId,
+5 −0
Original line number Original line Diff line number Diff line
@@ -2128,6 +2128,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub
        public void onInputMethodFinishInput() throws RemoteException {
        public void onInputMethodFinishInput() throws RemoteException {
            mCallback.onInputMethodFinishInput();
            mCallback.onInputMethodFinishInput();
        }
        }

        @Override
        public void onInlineSuggestionsSessionInvalidated() throws RemoteException {
            mCallback.onInlineSuggestionsSessionInvalidated();
        }
    }
    }


    /**
    /**