Merge "Invalidate autofill session on IME disconnect" into tm-dev
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
index 9195b68..86969ce 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
@@ -247,6 +247,7 @@
     private final ServiceConnection mVisibleConnection = new ServiceConnection() {
         @Override public void onBindingDied(ComponentName name) {
             synchronized (ImfLock.class) {
+                mService.invalidateAutofillSessionLocked();
                 if (mVisibleBound) {
                     unbindVisibleConnection();
                 }
@@ -257,6 +258,9 @@
         }
 
         @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 ea2b157..1a1c265 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -313,6 +313,15 @@
     @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;
 
@@ -2176,6 +2185,7 @@
             InlineSuggestionsRequestInfo requestInfo, IInlineSuggestionsRequestCallback callback,
             boolean touchExplorationEnabled) {
         clearPendingInlineSuggestionsRequestLocked();
+        mInlineSuggestionsRequestCallback = callback;
         final InputMethodInfo imi = mMethodMap.get(getSelectedMethodIdLocked());
         try {
             if (userId == mSettings.getCurrentUserId()
@@ -2797,6 +2807,7 @@
             if (DEBUG) {
                 Slog.d(TAG, "Avoiding IME startup and unbinding current input method.");
             }
+            invalidateAutofillSessionLocked();
             mBindingController.unbindCurrentMethod();
             return InputBindResult.NO_EDITOR;
         }
@@ -2835,6 +2846,17 @@
     }
 
     @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,
             @StartInputFlags int startInputFlags,