diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java index c4ff4ac6c981c..9a0809d71fa67 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java @@ -275,6 +275,7 @@ final class InputMethodBindingController { private final ServiceConnection mVisibleConnection = new ServiceConnection() { @Override public void onBindingDied(ComponentName name) { synchronized (ImfLock.class) { + mService.invalidateAutofillSessionLocked(); if (mVisibleBound) { unbindVisibleConnection(); } @@ -285,6 +286,9 @@ final class InputMethodBindingController { } @Override public void onServiceDisconnected(ComponentName name) { + synchronized (ImfLock.class) { + mService.invalidateAutofillSessionLocked(); + } } }; diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 05b1dd245cd3c..5c62e9b2ffc91 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -312,6 +312,15 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub @Nullable private CreateInlineSuggestionsRequest mPendingInlineSuggestionsRequest; + /** + * A callback into the autofill service obtained from the latest call to + * {@link #onCreateInlineSuggestionsRequestLocked}, which can be used to invalidate an + * autofill session in case the IME process dies. + */ + @GuardedBy("ImfLock.class") + @Nullable + private IInlineSuggestionsRequestCallback mInlineSuggestionsRequestCallback; + @UserIdInt private int mLastSwitchUserId; @@ -2169,6 +2178,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub InlineSuggestionsRequestInfo requestInfo, IInlineSuggestionsRequestCallback callback, boolean touchExplorationEnabled) { clearPendingInlineSuggestionsRequestLocked(); + mInlineSuggestionsRequestCallback = callback; final InputMethodInfo imi = mMethodMap.get(getSelectedMethodIdLocked()); try { if (userId == mSettings.getCurrentUserId() @@ -2788,6 +2798,7 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub if (DEBUG) { Slog.d(TAG, "Avoiding IME startup and unbinding current input method."); } + invalidateAutofillSessionLocked(); mBindingController.unbindCurrentMethod(); return InputBindResult.NO_EDITOR; } @@ -2825,6 +2836,17 @@ public final class InputMethodManagerService extends IInputMethodManager.Stub return mBindingController.bindCurrentMethod(); } + @GuardedBy("ImfLock.class") + void invalidateAutofillSessionLocked() { + if (mInlineSuggestionsRequestCallback != null) { + try { + mInlineSuggestionsRequestCallback.onInlineSuggestionsSessionInvalidated(); + } catch (RemoteException e) { + Slog.e(TAG, "Cannot invalidate autofill session.", e); + } + } + } + @GuardedBy("ImfLock.class") private boolean shouldPreventImeStartupLocked( @NonNull String selectedMethodId,