Fixed deadlock in InlineSuggestionSession.

* by using the same lock from the autofill Session

Test: manual
Test: atest android.autofillservice.cts.inline
Bug: 151580124

Change-Id: Ia34b1d0ea85c24eddf1cf1b89d07c331bb411023
diff --git a/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java b/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java
index 3376f2b..5de8171 100644
--- a/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java
+++ b/services/autofill/java/com/android/server/autofill/InlineSuggestionSession.java
@@ -62,7 +62,7 @@
  * side flow.
  *
  * <p>
- * This class is thread safe.
+ * This class should hold the same lock as {@link Session} as they call into each other.
  */
 final class InlineSuggestionSession {
 
@@ -105,12 +105,12 @@
     private boolean mImeInputViewStarted = false;
 
     InlineSuggestionSession(InputMethodManagerInternal inputMethodManagerInternal,
-            int userId, ComponentName componentName, Handler handler) {
+            int userId, ComponentName componentName, Handler handler, Object lock) {
         mInputMethodManagerInternal = inputMethodManagerInternal;
         mUserId = userId;
         mComponentName = componentName;
         mHandler = handler;
-        mLock = new Object();
+        mLock = lock;
         mImeStatusListener = new ImeStatusListener() {
             @Override
             public void onInputMethodStartInputView(AutofillId imeFieldId) {
@@ -261,29 +261,27 @@
             mHandler = handler;
             mTimeoutCallback = () -> {
                 Log.w(TAG, "Timed out waiting for IME callback InlineSuggestionsRequest.");
-                synchronized (mLock) {
-                    completeIfNotLocked(null);
-                }
+                completeIfNot(null);
             };
             mHandler.postDelayed(mTimeoutCallback, INLINE_REQUEST_TIMEOUT_MS);
         }
 
-        private void completeIfNotLocked(@Nullable ImeResponse response) {
-            if (mResponse.isDone()) {
-                return;
+        private void completeIfNot(@Nullable ImeResponse response) {
+            synchronized (mLock) {
+                if (mResponse.isDone()) {
+                    return;
+                }
+                mResponse.complete(response);
+                mRequestConsumer.accept(response == null ? null : response.mRequest);
+                mHandler.removeCallbacks(mTimeoutCallback);
             }
-            mResponse.complete(response);
-            mRequestConsumer.accept(response == null ? null : response.mRequest);
-            mHandler.removeCallbacks(mTimeoutCallback);
         }
 
         @BinderThread
         @Override
         public void onInlineSuggestionsUnsupported() throws RemoteException {
             if (sDebug) Log.d(TAG, "onInlineSuggestionsUnsupported() called.");
-            synchronized (mLock) {
-                completeIfNotLocked(null);
-            }
+            completeIfNot(null);
         }
 
         @BinderThread
@@ -302,13 +300,9 @@
                 mImeStatusListener.onInputMethodFinishInputView(imeFieldId);
             }
             if (request != null && callback != null) {
-                synchronized (mLock) {
-                    completeIfNotLocked(new ImeResponse(request, callback));
-                }
+                completeIfNot(new ImeResponse(request, callback));
             } else {
-                synchronized (mLock) {
-                    completeIfNotLocked(null);
-                }
+                completeIfNot(null);
             }
         }
 
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 50646638..de31118 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -756,7 +756,7 @@
         setClientLocked(client);
 
         mInlineSuggestionSession = new InlineSuggestionSession(inputMethodManagerInternal, userId,
-                componentName, handler);
+                componentName, handler, mLock);
 
         mMetricsLogger.write(newLogMaker(MetricsEvent.AUTOFILL_SESSION_STARTED)
                 .addTaggedData(MetricsEvent.FIELD_AUTOFILL_FLAGS, flags));