diff options
Diffstat (limited to 'core/java/android/inputmethodservice/InputMethodService.java')
| -rw-r--r-- | core/java/android/inputmethodservice/InputMethodService.java | 129 |
1 files changed, 15 insertions, 114 deletions
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index a95938b5db2d..b1aa67e9f7ed 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -22,8 +22,6 @@ import static android.view.ViewRootImpl.NEW_INSETS_MODE_NONE; import static android.view.WindowInsets.Type.navigationBars; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; -import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; - import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.AnyThread; @@ -51,7 +49,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.os.Looper; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.SystemClock; @@ -102,13 +99,11 @@ import com.android.internal.inputmethod.IInputMethodPrivilegedOperations; import com.android.internal.inputmethod.InputMethodPrivilegedOperations; import com.android.internal.inputmethod.InputMethodPrivilegedOperationsRegistry; import com.android.internal.view.IInlineSuggestionsRequestCallback; -import com.android.internal.view.IInlineSuggestionsResponseCallback; import java.io.FileDescriptor; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.lang.ref.WeakReference; import java.util.Collections; /** @@ -450,7 +445,7 @@ public class InputMethodService extends AbstractInputMethodService { final int[] mTmpLocation = new int[2]; @Nullable - private InlineSuggestionsRequestInfo mInlineSuggestionsRequestInfo = null; + private InlineSuggestionSession mInlineSuggestionSession; private boolean mAutomotiveHideNavBarForKeyboard; private boolean mIsAutomotive; @@ -465,8 +460,6 @@ public class InputMethodService extends AbstractInputMethodService { */ private IBinder mCurShowInputToken; - private final Handler mHandler = new Handler(Looper.getMainLooper(), null, true); - final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = info -> { onComputeInsets(mTmpInsets); if (isExtractViewShown()) { @@ -538,7 +531,7 @@ public class InputMethodService extends AbstractInputMethodService { if (DEBUG) { Log.d(TAG, "InputMethodService received onCreateInlineSuggestionsRequest()"); } - handleOnCreateInlineSuggestionsRequest(componentName, autofillId, cb); + handleOnCreateInlineSuggestionsRequest(componentName, cb); } /** @@ -770,40 +763,9 @@ public class InputMethodService extends AbstractInputMethodService { return false; } - /** - * Sends an {@link InlineSuggestionsRequest} obtained from - * {@link #onCreateInlineSuggestionsRequest()} to the current Autofill Session through - * {@link IInlineSuggestionsRequestCallback#onInlineSuggestionsRequest}. - */ - private void makeInlineSuggestionsRequest() { - if (mInlineSuggestionsRequestInfo == null) { - Log.w(TAG, "makeInlineSuggestionsRequest() called with null requestInfo cache"); - return; - } - - final IInlineSuggestionsRequestCallback requestCallback = - mInlineSuggestionsRequestInfo.mCallback; - try { - final InlineSuggestionsRequest request = onCreateInlineSuggestionsRequest(); - if (request == null) { - Log.w(TAG, "onCreateInlineSuggestionsRequest() returned null request"); - requestCallback.onInlineSuggestionsUnsupported(); - } else { - request.setHostInputToken(getHostInputToken()); - final IInlineSuggestionsResponseCallback inlineSuggestionsResponseCallback = - new InlineSuggestionsResponseCallbackImpl(this, - mInlineSuggestionsRequestInfo.mComponentName, - mInlineSuggestionsRequestInfo.mFocusedId); - requestCallback.onInlineSuggestionsRequest(request, - inlineSuggestionsResponseCallback); - } - } catch (RemoteException e) { - Log.w(TAG, "makeInlinedSuggestionsRequest() remote exception:" + e); - } - } - + @MainThread private void handleOnCreateInlineSuggestionsRequest(@NonNull ComponentName componentName, - @NonNull AutofillId autofillId, @NonNull IInlineSuggestionsRequestCallback callback) { + @NonNull IInlineSuggestionsRequestCallback callback) { if (!mInputStarted) { try { Log.w(TAG, "onStartInput() not called yet"); @@ -814,24 +776,20 @@ public class InputMethodService extends AbstractInputMethodService { return; } - mInlineSuggestionsRequestInfo = new InlineSuggestionsRequestInfo(componentName, autofillId, - callback); - - makeInlineSuggestionsRequest(); + if (mInlineSuggestionSession != null) { + mInlineSuggestionSession.invalidateSession(); + } + mInlineSuggestionSession = new InlineSuggestionSession(componentName, callback, + this::getEditorInfoPackageName, this::onCreateInlineSuggestionsRequest, + this::getHostInputToken, this::onInlineSuggestionsResponse); } - private void handleOnInlineSuggestionsResponse(@NonNull ComponentName componentName, - @NonNull AutofillId autofillId, @NonNull InlineSuggestionsResponse response) { - if (!mInlineSuggestionsRequestInfo.validate(componentName)) { - if (DEBUG) { - Log.d(TAG, - "Response component=" + componentName + " differs from request component=" - + mInlineSuggestionsRequestInfo.mComponentName - + ", ignoring response"); - } - return; + @Nullable + private String getEditorInfoPackageName() { + if (mInputEditorInfo != null) { + return mInputEditorInfo.packageName; } - onInlineSuggestionsResponse(response); + return null; } /** @@ -864,63 +822,6 @@ public class InputMethodService extends AbstractInputMethodService { } /** - * Internal implementation of {@link IInlineSuggestionsResponseCallback}. - */ - private static final class InlineSuggestionsResponseCallbackImpl - extends IInlineSuggestionsResponseCallback.Stub { - private final WeakReference<InputMethodService> mInputMethodService; - - private final ComponentName mRequestComponentName; - private final AutofillId mRequestAutofillId; - - private InlineSuggestionsResponseCallbackImpl(InputMethodService inputMethodService, - ComponentName componentName, AutofillId autofillId) { - mInputMethodService = new WeakReference<>(inputMethodService); - mRequestComponentName = componentName; - mRequestAutofillId = autofillId; - } - - @Override - public void onInlineSuggestionsResponse(InlineSuggestionsResponse response) - throws RemoteException { - final InputMethodService service = mInputMethodService.get(); - if (service != null) { - service.mHandler.sendMessage(obtainMessage( - InputMethodService::handleOnInlineSuggestionsResponse, service, - mRequestComponentName, mRequestAutofillId, response)); - } - } - } - - /** - * Information about incoming requests from Autofill Frameworks for inline suggestions. - */ - private static final class InlineSuggestionsRequestInfo { - final ComponentName mComponentName; - final AutofillId mFocusedId; - final IInlineSuggestionsRequestCallback mCallback; - - InlineSuggestionsRequestInfo(ComponentName componentName, AutofillId focusedId, - IInlineSuggestionsRequestCallback callback) { - this.mComponentName = componentName; - this.mFocusedId = focusedId; - this.mCallback = callback; - } - - /** - * Returns whether the cached {@link ComponentName} matches the passed in activity. - */ - public boolean validate(ComponentName componentName) { - final boolean result = componentName.equals(mComponentName); - if (DEBUG && !result) { - Log.d(TAG, "Cached request info ComponentName=" + mComponentName - + " differs from received ComponentName=" + componentName); - } - return result; - } - } - - /** * Concrete implementation of * {@link AbstractInputMethodService.AbstractInputMethodSessionImpl} that provides * all of the standard behavior for an input method session. |
