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

Commit 36960ee2 authored by Feng Cao's avatar Feng Cao
Browse files

Introduces the Bundle to inline suggestions APIs to encode custom UI styling information.

* The bundle will be generated/consumed by the support library.
* More API documentation and example usage will be added later once we have the support library impl ready.
* The old style resource name approach doesn't work due to the potential mismatch in the support library version across the host IME and the platform renderer service, and the non-static nature of the public attribute int id in the support lib.
* The Bundle added to the onCreateInlineSuggestionsRequest() is intended for the platform/ExtServices to communicate the UI versions it supports.
* The Bundle added to the InlinePresentationSpec is intended for the IME to communicate the custom styles for the chosen UI versions.

Test: manual verification, and also atest CtsInputMethodTestCases:InlineSuggestionInfoTest CtsInputMethodTestCases:InlineSuggestionTest CtsInputMethodTestCases:InlineSuggestionsRequestTest CtsInputMethodTestCases:InlineSuggestionsResponseTest
Bug: 146454892

Change-Id: Id7fea32a7550fb924fec811b376790474a7b92eb
parent da0c5df4
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -23166,7 +23166,7 @@ package android.inputmethodservice {
    method public void onConfigureWindow(android.view.Window, boolean, boolean);
    method public android.view.View onCreateCandidatesView();
    method public android.view.View onCreateExtractTextView();
    method @Nullable public android.view.inputmethod.InlineSuggestionsRequest onCreateInlineSuggestionsRequest();
    method @Nullable public android.view.inputmethod.InlineSuggestionsRequest onCreateInlineSuggestionsRequest(@NonNull android.os.Bundle);
    method public android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodImpl onCreateInputMethodInterface();
    method public android.inputmethodservice.AbstractInputMethodService.AbstractInputMethodSessionImpl onCreateInputMethodSessionInterface();
    method public android.view.View onCreateInputView();
@@ -56486,7 +56486,7 @@ package android.view.inline {
    method public int describeContents();
    method @NonNull public android.util.Size getMaxSize();
    method @NonNull public android.util.Size getMinSize();
    method @Nullable public String getStyle();
    method @Nullable public android.os.Bundle getStyle();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.view.inline.InlinePresentationSpec> CREATOR;
  }
@@ -56494,7 +56494,7 @@ package android.view.inline {
  public static final class InlinePresentationSpec.Builder {
    ctor public InlinePresentationSpec.Builder(@NonNull android.util.Size, @NonNull android.util.Size);
    method @NonNull public android.view.inline.InlinePresentationSpec build();
    method @NonNull public android.view.inline.InlinePresentationSpec.Builder setStyle(@Nullable String);
    method @NonNull public android.view.inline.InlinePresentationSpec.Builder setStyle(@Nullable android.os.Bundle);
  }
}
+1 −0
Original line number Diff line number Diff line
@@ -10187,6 +10187,7 @@ package android.service.autofill {
  public abstract class InlineSuggestionRenderService extends android.app.Service {
    ctor public InlineSuggestionRenderService();
    method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
    method @Nullable public android.os.Bundle onGetInlineSuggestionsRendererInfo();
    method @Nullable public android.view.View onRenderSuggestion(@NonNull android.service.autofill.InlinePresentation, int, int);
    field public static final String SERVICE_INTERFACE = "android.service.autofill.InlineSuggestionRenderService";
  }
+1 −0
Original line number Diff line number Diff line
@@ -3145,6 +3145,7 @@ package android.service.autofill {
  public abstract class InlineSuggestionRenderService extends android.app.Service {
    ctor public InlineSuggestionRenderService();
    method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
    method @Nullable public android.os.Bundle onGetInlineSuggestionsRendererInfo();
    method @Nullable public android.view.View onRenderSuggestion(@NonNull android.service.autofill.InlinePresentation, int, int);
    field public static final String SERVICE_INTERFACE = "android.service.autofill.InlineSuggestionRenderService";
  }
+6 −7
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package android.inputmethodservice;
import android.annotation.BinderThread;
import android.annotation.MainThread;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Binder;
@@ -29,7 +28,6 @@ import android.os.RemoteException;
import android.os.ResultReceiver;
import android.util.Log;
import android.view.InputChannel;
import android.view.autofill.AutofillId;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputBinding;
import android.view.inputmethod.InputConnection;
@@ -46,6 +44,7 @@ import com.android.internal.view.IInputContext;
import com.android.internal.view.IInputMethod;
import com.android.internal.view.IInputMethodSession;
import com.android.internal.view.IInputSessionCallback;
import com.android.internal.view.InlineSuggestionsRequestInfo;
import com.android.internal.view.InputConnectionWrapper;

import java.io.FileDescriptor;
@@ -233,8 +232,9 @@ class IInputMethodWrapper extends IInputMethod.Stub
                return;
            case DO_CREATE_INLINE_SUGGESTIONS_REQUEST:
                args = (SomeArgs) msg.obj;
                inputMethod.onCreateInlineSuggestionsRequest((ComponentName) args.arg1,
                        (AutofillId) args.arg2, (IInlineSuggestionsRequestCallback) args.arg3);
                inputMethod.onCreateInlineSuggestionsRequest(
                        (InlineSuggestionsRequestInfo) args.arg1,
                        (IInlineSuggestionsRequestCallback) args.arg2);
                return;

        }
@@ -279,11 +279,10 @@ class IInputMethodWrapper extends IInputMethod.Stub

    @BinderThread
    @Override
    public void onCreateInlineSuggestionsRequest(ComponentName componentName, AutofillId autofillId,
    public void onCreateInlineSuggestionsRequest(InlineSuggestionsRequestInfo requestInfo,
            IInlineSuggestionsRequestCallback cb) {
        mCaller.executeOrSendMessage(
                mCaller.obtainMessageOOO(DO_CREATE_INLINE_SUGGESTIONS_REQUEST, componentName,
                        autofillId, cb));
                mCaller.obtainMessageOO(DO_CREATE_INLINE_SUGGESTIONS_REQUEST, requestInfo, cb));
    }

    @BinderThread
+16 −11
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.Dialog;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
@@ -74,7 +73,6 @@ import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.animation.AnimationUtils;
import android.view.autofill.AutofillId;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.CursorAnchorInfo;
import android.view.inputmethod.EditorInfo;
@@ -99,6 +97,7 @@ 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.InlineSuggestionsRequestInfo;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -526,12 +525,13 @@ public class InputMethodService extends AbstractInputMethodService {
         */
        @MainThread
        @Override
        public void onCreateInlineSuggestionsRequest(ComponentName componentName,
                AutofillId autofillId, IInlineSuggestionsRequestCallback cb) {
        public void onCreateInlineSuggestionsRequest(
                @NonNull InlineSuggestionsRequestInfo requestInfo,
                @NonNull IInlineSuggestionsRequestCallback cb) {
            if (DEBUG) {
                Log.d(TAG, "InputMethodService received onCreateInlineSuggestionsRequest()");
            }
            handleOnCreateInlineSuggestionsRequest(componentName, cb);
            handleOnCreateInlineSuggestionsRequest(requestInfo, cb);
        }

        /**
@@ -742,11 +742,14 @@ public class InputMethodService extends AbstractInputMethodService {

    // TODO(b/137800469): Add detailed docs explaining the inline suggestions process.
    /**
     * Returns an {@link InlineSuggestionsRequest} to be sent to Autofill.
     * This method should be implemented by subclass which supports displaying autofill inline
     * suggestion.
     *
     * <p>Should be implemented by subclasses.</p>
     * @param uiExtras the extras that contain the UI renderer related information
     * @return an {@link InlineSuggestionsRequest} to be sent to Autofill.
     */
    public @Nullable InlineSuggestionsRequest onCreateInlineSuggestionsRequest() {
    @Nullable
    public InlineSuggestionsRequest onCreateInlineSuggestionsRequest(@NonNull Bundle uiExtras) {
        return null;
    }

@@ -764,7 +767,8 @@ public class InputMethodService extends AbstractInputMethodService {
    }

    @MainThread
    private void handleOnCreateInlineSuggestionsRequest(@NonNull ComponentName componentName,
    private void handleOnCreateInlineSuggestionsRequest(
            @NonNull InlineSuggestionsRequestInfo requestInfo,
            @NonNull IInlineSuggestionsRequestCallback callback) {
        if (!mInputStarted) {
            try {
@@ -779,8 +783,9 @@ public class InputMethodService extends AbstractInputMethodService {
        if (mInlineSuggestionSession != null) {
            mInlineSuggestionSession.invalidateSession();
        }
        mInlineSuggestionSession = new InlineSuggestionSession(componentName, callback,
                this::getEditorInfoPackageName, this::onCreateInlineSuggestionsRequest,
        mInlineSuggestionSession = new InlineSuggestionSession(requestInfo.getComponentName(),
                callback, this::getEditorInfoPackageName,
                () -> onCreateInlineSuggestionsRequest(requestInfo.getUiExtras()),
                this::getHostInputToken, this::onInlineSuggestionsResponse);
    }

Loading