Loading api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -54822,6 +54822,7 @@ package android.view.inputmethod { public final class InlineSuggestionsRequest implements android.os.Parcelable { method public int describeContents(); method @NonNull public String getHostPackageName(); method public int getMaxSuggestionCount(); method @NonNull public java.util.List<android.view.inline.InlinePresentationSpec> getPresentationSpecs(); method public void writeToParcel(@NonNull android.os.Parcel, int); core/java/android/view/inputmethod/InlineSuggestionsRequest.java +73 −9 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package android.view.inputmethod; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread; import android.os.Parcelable; import android.view.inline.InlinePresentationSpec; Loading Loading @@ -49,6 +51,21 @@ public final class InlineSuggestionsRequest implements Parcelable { */ private final @NonNull List<InlinePresentationSpec> mPresentationSpecs; /** * The package name of the app that requests for the inline suggestions and will host the * embedded suggestion views. The app does not have to set the value for the field because * it'll be set by the system for safety reasons. */ private @NonNull String mHostPackageName; /** * @hide * @see {@link #mHostPackageName}. */ public void setHostPackageName(@NonNull String hostPackageName) { mHostPackageName = hostPackageName; } private void onConstructed() { Preconditions.checkState(mMaxSuggestionCount >= mPresentationSpecs.size()); } Loading @@ -57,9 +74,15 @@ public final class InlineSuggestionsRequest implements Parcelable { return SUGGESTION_COUNT_UNLIMITED; } private static String defaultHostPackageName() { return ActivityThread.currentPackageName(); } /** @hide */ abstract static class BaseBuilder { abstract Builder setPresentationSpecs(@NonNull List<InlinePresentationSpec> value); abstract Builder setHostPackageName(@Nullable String value); } Loading @@ -80,11 +103,15 @@ public final class InlineSuggestionsRequest implements Parcelable { @DataClass.Generated.Member /* package-private */ InlineSuggestionsRequest( int maxSuggestionCount, @NonNull List<InlinePresentationSpec> presentationSpecs) { @NonNull List<InlinePresentationSpec> presentationSpecs, @NonNull String hostPackageName) { this.mMaxSuggestionCount = maxSuggestionCount; this.mPresentationSpecs = presentationSpecs; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mPresentationSpecs); this.mHostPackageName = hostPackageName; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mHostPackageName); onConstructed(); } Loading @@ -108,6 +135,16 @@ public final class InlineSuggestionsRequest implements Parcelable { return mPresentationSpecs; } /** * The package name of the app that requests for the inline suggestions and will host the * embedded suggestion views. The app does not have to set the value for the field because * it'll be set by the system for safety reasons. */ @DataClass.Generated.Member public @NonNull String getHostPackageName() { return mHostPackageName; } @Override @DataClass.Generated.Member public String toString() { Loading @@ -116,13 +153,14 @@ public final class InlineSuggestionsRequest implements Parcelable { return "InlineSuggestionsRequest { " + "maxSuggestionCount = " + mMaxSuggestionCount + ", " + "presentationSpecs = " + mPresentationSpecs + "presentationSpecs = " + mPresentationSpecs + ", " + "hostPackageName = " + mHostPackageName + " }"; } @Override @DataClass.Generated.Member public boolean equals(@android.annotation.Nullable Object o) { public boolean equals(@Nullable Object o) { // You can override field equality logic by defining either of the methods like: // boolean fieldNameEquals(InlineSuggestionsRequest other) { ... } // boolean fieldNameEquals(FieldType otherValue) { ... } Loading @@ -134,7 +172,8 @@ public final class InlineSuggestionsRequest implements Parcelable { //noinspection PointlessBooleanExpression return true && mMaxSuggestionCount == that.mMaxSuggestionCount && java.util.Objects.equals(mPresentationSpecs, that.mPresentationSpecs); && java.util.Objects.equals(mPresentationSpecs, that.mPresentationSpecs) && java.util.Objects.equals(mHostPackageName, that.mHostPackageName); } @Override Loading @@ -146,6 +185,7 @@ public final class InlineSuggestionsRequest implements Parcelable { int _hash = 1; _hash = 31 * _hash + mMaxSuggestionCount; _hash = 31 * _hash + java.util.Objects.hashCode(mPresentationSpecs); _hash = 31 * _hash + java.util.Objects.hashCode(mHostPackageName); return _hash; } Loading @@ -157,6 +197,7 @@ public final class InlineSuggestionsRequest implements Parcelable { dest.writeInt(mMaxSuggestionCount); dest.writeParcelableList(mPresentationSpecs, flags); dest.writeString(mHostPackageName); } @Override Loading @@ -173,11 +214,15 @@ public final class InlineSuggestionsRequest implements Parcelable { int maxSuggestionCount = in.readInt(); List<InlinePresentationSpec> presentationSpecs = new ArrayList<>(); in.readParcelableList(presentationSpecs, InlinePresentationSpec.class.getClassLoader()); String hostPackageName = in.readString(); this.mMaxSuggestionCount = maxSuggestionCount; this.mPresentationSpecs = presentationSpecs; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mPresentationSpecs); this.mHostPackageName = hostPackageName; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mHostPackageName); onConstructed(); } Loading Loading @@ -205,6 +250,7 @@ public final class InlineSuggestionsRequest implements Parcelable { private int mMaxSuggestionCount; private @NonNull List<InlinePresentationSpec> mPresentationSpecs; private @NonNull String mHostPackageName; private long mBuilderFieldsSet = 0L; Loading Loading @@ -260,22 +306,40 @@ public final class InlineSuggestionsRequest implements Parcelable { return this; } /** * The package name of the app that requests for the inline suggestions and will host the * embedded suggestion views. The app does not have to set the value for the field because * it'll be set by the system for safety reasons. */ @DataClass.Generated.Member @Override @NonNull Builder setHostPackageName(@NonNull String value) { checkNotUsed(); mBuilderFieldsSet |= 0x4; mHostPackageName = value; return this; } /** Builds the instance. This builder should not be touched after calling this! */ public @NonNull InlineSuggestionsRequest build() { checkNotUsed(); mBuilderFieldsSet |= 0x4; // Mark builder used mBuilderFieldsSet |= 0x8; // Mark builder used if ((mBuilderFieldsSet & 0x1) == 0) { mMaxSuggestionCount = defaultMaxSuggestionCount(); } if ((mBuilderFieldsSet & 0x4) == 0) { mHostPackageName = defaultHostPackageName(); } InlineSuggestionsRequest o = new InlineSuggestionsRequest( mMaxSuggestionCount, mPresentationSpecs); mPresentationSpecs, mHostPackageName); return o; } private void checkNotUsed() { if ((mBuilderFieldsSet & 0x4) != 0) { if ((mBuilderFieldsSet & 0x8) != 0) { throw new IllegalStateException( "This Builder should not be reused. Use a new Builder instance instead"); } Loading @@ -283,10 +347,10 @@ public final class InlineSuggestionsRequest implements Parcelable { } @DataClass.Generated( time = 1576637222199L, time = 1578948035951L, codegenVersion = "1.0.14", sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionsRequest.java", inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.view.inline.InlinePresentationSpec> mPresentationSpecs\nprivate void onConstructed()\nprivate static int defaultMaxSuggestionCount()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setPresentationSpecs(java.util.List<android.view.inline.InlinePresentationSpec>)\nclass BaseBuilder extends java.lang.Object implements []") inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.view.inline.InlinePresentationSpec> mPresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\npublic void setHostPackageName(java.lang.String)\nprivate void onConstructed()\nprivate static int defaultMaxSuggestionCount()\nprivate static java.lang.String defaultHostPackageName()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setPresentationSpecs(java.util.List<android.view.inline.InlinePresentationSpec>)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nclass BaseBuilder extends java.lang.Object implements []") @Deprecated private void __metadata() {} Loading services/autofill/java/com/android/server/autofill/Session.java +5 −1 Original line number Diff line number Diff line Loading @@ -162,6 +162,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState /** uid the session is for */ public final int uid; /** user id the session is for */ public final int userId; /** ID of the task associated with this session's activity */ public final int taskId; Loading Loading @@ -613,7 +616,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState int newState, int flags) { if (isInlineSuggestionsEnabled()) { mInlineSuggestionsRequestCallback = new InlineSuggestionsRequestCallbackImpl(); mInputMethodManagerInternal.onCreateInlineSuggestionsRequest( mInputMethodManagerInternal.onCreateInlineSuggestionsRequest(userId, mComponentName, mCurrentViewId, mInlineSuggestionsRequestCallback); } Loading Loading @@ -759,6 +762,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mFlags = flags; this.taskId = taskId; this.uid = uid; this.userId = userId; mStartTime = SystemClock.elapsedRealtime(); mService = service; mLock = lock; Loading services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java +6 −4 Original line number Diff line number Diff line Loading @@ -68,8 +68,9 @@ public abstract class InputMethodManagerInternal { * @param autofillId {@link AutofillId} of currently focused field. * @param cb {@link IInlineSuggestionsRequestCallback} used to pass back the request object. */ public abstract void onCreateInlineSuggestionsRequest(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb); public abstract void onCreateInlineSuggestionsRequest(@UserIdInt int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb); /** * Force switch to the enabled input method by {@code imeId} for current user. If the input Loading Loading @@ -107,8 +108,9 @@ public abstract class InputMethodManagerInternal { } @Override public void onCreateInlineSuggestionsRequest(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb) { public void onCreateInlineSuggestionsRequest(int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb) { } @Override Loading services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +52 −10 Original line number Diff line number Diff line Loading @@ -111,6 +111,7 @@ import android.view.WindowManager.LayoutParams; import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.view.autofill.AutofillId; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InlineSuggestionsRequest; import android.view.inputmethod.InputBinding; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionInspector; Loading Loading @@ -142,6 +143,7 @@ import com.android.internal.os.TransferPipe; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.view.IInlineSuggestionsRequestCallback; import com.android.internal.view.IInlineSuggestionsResponseCallback; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethod; import com.android.internal.view.IInputMethodClient; Loading Loading @@ -1790,15 +1792,18 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } @GuardedBy("mMethodMap") private void onCreateInlineSuggestionsRequestLocked(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { private void onCreateInlineSuggestionsRequestLocked(@UserIdInt int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { final InputMethodInfo imi = mMethodMap.get(mCurMethodId); try { if (imi != null && imi.isInlineSuggestionsEnabled() && mCurMethod != null) { if (userId == mSettings.getCurrentUserId() && imi != null && imi.isInlineSuggestionsEnabled() && mCurMethod != null) { executeOrSendMessage(mCurMethod, mCaller.obtainMessageOOOO(MSG_INLINE_SUGGESTIONS_REQUEST, mCurMethod, componentName, autofillId, callback)); componentName, autofillId, new InlineSuggestionsRequestCallbackDecorator(callback, imi.getPackageName()))); } else { callback.onInlineSuggestionsUnsupported(); } Loading @@ -1807,6 +1812,42 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } /** * The decorator which validates the host package name in the * {@link InlineSuggestionsRequest} argument to make sure it matches the IME package name. */ private static final class InlineSuggestionsRequestCallbackDecorator extends IInlineSuggestionsRequestCallback.Stub { @NonNull private final IInlineSuggestionsRequestCallback mCallback; @NonNull private final String mImePackageName; InlineSuggestionsRequestCallbackDecorator( @NonNull IInlineSuggestionsRequestCallback callback, @NonNull String imePackageName) { mCallback = callback; mImePackageName = imePackageName; } @Override public void onInlineSuggestionsUnsupported() throws RemoteException { mCallback.onInlineSuggestionsUnsupported(); } @Override public void onInlineSuggestionsRequest(InlineSuggestionsRequest request, IInlineSuggestionsResponseCallback callback) throws RemoteException { if (!mImePackageName.equals(request.getHostPackageName())) { throw new SecurityException( "Host package name in the provide request=[" + request.getHostPackageName() + "] doesn't match the IME package name=[" + mImePackageName + "]."); } mCallback.onInlineSuggestionsRequest(request, callback); } } /** * @param imiId if null, returns enabled subtypes for the current imi * @return enabled subtypes of the specified imi Loading Loading @@ -4471,10 +4512,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } private void onCreateInlineSuggestionsRequest(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { private void onCreateInlineSuggestionsRequest(@UserIdInt int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { synchronized (mMethodMap) { onCreateInlineSuggestionsRequestLocked(componentName, autofillId, callback); onCreateInlineSuggestionsRequestLocked(userId, componentName, autofillId, callback); } } Loading Loading @@ -4542,9 +4584,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } @Override public void onCreateInlineSuggestionsRequest(ComponentName componentName, public void onCreateInlineSuggestionsRequest(int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb) { mService.onCreateInlineSuggestionsRequest(componentName, autofillId, cb); mService.onCreateInlineSuggestionsRequest(userId, componentName, autofillId, cb); } @Override Loading Loading
api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -54822,6 +54822,7 @@ package android.view.inputmethod { public final class InlineSuggestionsRequest implements android.os.Parcelable { method public int describeContents(); method @NonNull public String getHostPackageName(); method public int getMaxSuggestionCount(); method @NonNull public java.util.List<android.view.inline.InlinePresentationSpec> getPresentationSpecs(); method public void writeToParcel(@NonNull android.os.Parcel, int);
core/java/android/view/inputmethod/InlineSuggestionsRequest.java +73 −9 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ package android.view.inputmethod; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread; import android.os.Parcelable; import android.view.inline.InlinePresentationSpec; Loading Loading @@ -49,6 +51,21 @@ public final class InlineSuggestionsRequest implements Parcelable { */ private final @NonNull List<InlinePresentationSpec> mPresentationSpecs; /** * The package name of the app that requests for the inline suggestions and will host the * embedded suggestion views. The app does not have to set the value for the field because * it'll be set by the system for safety reasons. */ private @NonNull String mHostPackageName; /** * @hide * @see {@link #mHostPackageName}. */ public void setHostPackageName(@NonNull String hostPackageName) { mHostPackageName = hostPackageName; } private void onConstructed() { Preconditions.checkState(mMaxSuggestionCount >= mPresentationSpecs.size()); } Loading @@ -57,9 +74,15 @@ public final class InlineSuggestionsRequest implements Parcelable { return SUGGESTION_COUNT_UNLIMITED; } private static String defaultHostPackageName() { return ActivityThread.currentPackageName(); } /** @hide */ abstract static class BaseBuilder { abstract Builder setPresentationSpecs(@NonNull List<InlinePresentationSpec> value); abstract Builder setHostPackageName(@Nullable String value); } Loading @@ -80,11 +103,15 @@ public final class InlineSuggestionsRequest implements Parcelable { @DataClass.Generated.Member /* package-private */ InlineSuggestionsRequest( int maxSuggestionCount, @NonNull List<InlinePresentationSpec> presentationSpecs) { @NonNull List<InlinePresentationSpec> presentationSpecs, @NonNull String hostPackageName) { this.mMaxSuggestionCount = maxSuggestionCount; this.mPresentationSpecs = presentationSpecs; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mPresentationSpecs); this.mHostPackageName = hostPackageName; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mHostPackageName); onConstructed(); } Loading @@ -108,6 +135,16 @@ public final class InlineSuggestionsRequest implements Parcelable { return mPresentationSpecs; } /** * The package name of the app that requests for the inline suggestions and will host the * embedded suggestion views. The app does not have to set the value for the field because * it'll be set by the system for safety reasons. */ @DataClass.Generated.Member public @NonNull String getHostPackageName() { return mHostPackageName; } @Override @DataClass.Generated.Member public String toString() { Loading @@ -116,13 +153,14 @@ public final class InlineSuggestionsRequest implements Parcelable { return "InlineSuggestionsRequest { " + "maxSuggestionCount = " + mMaxSuggestionCount + ", " + "presentationSpecs = " + mPresentationSpecs + "presentationSpecs = " + mPresentationSpecs + ", " + "hostPackageName = " + mHostPackageName + " }"; } @Override @DataClass.Generated.Member public boolean equals(@android.annotation.Nullable Object o) { public boolean equals(@Nullable Object o) { // You can override field equality logic by defining either of the methods like: // boolean fieldNameEquals(InlineSuggestionsRequest other) { ... } // boolean fieldNameEquals(FieldType otherValue) { ... } Loading @@ -134,7 +172,8 @@ public final class InlineSuggestionsRequest implements Parcelable { //noinspection PointlessBooleanExpression return true && mMaxSuggestionCount == that.mMaxSuggestionCount && java.util.Objects.equals(mPresentationSpecs, that.mPresentationSpecs); && java.util.Objects.equals(mPresentationSpecs, that.mPresentationSpecs) && java.util.Objects.equals(mHostPackageName, that.mHostPackageName); } @Override Loading @@ -146,6 +185,7 @@ public final class InlineSuggestionsRequest implements Parcelable { int _hash = 1; _hash = 31 * _hash + mMaxSuggestionCount; _hash = 31 * _hash + java.util.Objects.hashCode(mPresentationSpecs); _hash = 31 * _hash + java.util.Objects.hashCode(mHostPackageName); return _hash; } Loading @@ -157,6 +197,7 @@ public final class InlineSuggestionsRequest implements Parcelable { dest.writeInt(mMaxSuggestionCount); dest.writeParcelableList(mPresentationSpecs, flags); dest.writeString(mHostPackageName); } @Override Loading @@ -173,11 +214,15 @@ public final class InlineSuggestionsRequest implements Parcelable { int maxSuggestionCount = in.readInt(); List<InlinePresentationSpec> presentationSpecs = new ArrayList<>(); in.readParcelableList(presentationSpecs, InlinePresentationSpec.class.getClassLoader()); String hostPackageName = in.readString(); this.mMaxSuggestionCount = maxSuggestionCount; this.mPresentationSpecs = presentationSpecs; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mPresentationSpecs); this.mHostPackageName = hostPackageName; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mHostPackageName); onConstructed(); } Loading Loading @@ -205,6 +250,7 @@ public final class InlineSuggestionsRequest implements Parcelable { private int mMaxSuggestionCount; private @NonNull List<InlinePresentationSpec> mPresentationSpecs; private @NonNull String mHostPackageName; private long mBuilderFieldsSet = 0L; Loading Loading @@ -260,22 +306,40 @@ public final class InlineSuggestionsRequest implements Parcelable { return this; } /** * The package name of the app that requests for the inline suggestions and will host the * embedded suggestion views. The app does not have to set the value for the field because * it'll be set by the system for safety reasons. */ @DataClass.Generated.Member @Override @NonNull Builder setHostPackageName(@NonNull String value) { checkNotUsed(); mBuilderFieldsSet |= 0x4; mHostPackageName = value; return this; } /** Builds the instance. This builder should not be touched after calling this! */ public @NonNull InlineSuggestionsRequest build() { checkNotUsed(); mBuilderFieldsSet |= 0x4; // Mark builder used mBuilderFieldsSet |= 0x8; // Mark builder used if ((mBuilderFieldsSet & 0x1) == 0) { mMaxSuggestionCount = defaultMaxSuggestionCount(); } if ((mBuilderFieldsSet & 0x4) == 0) { mHostPackageName = defaultHostPackageName(); } InlineSuggestionsRequest o = new InlineSuggestionsRequest( mMaxSuggestionCount, mPresentationSpecs); mPresentationSpecs, mHostPackageName); return o; } private void checkNotUsed() { if ((mBuilderFieldsSet & 0x4) != 0) { if ((mBuilderFieldsSet & 0x8) != 0) { throw new IllegalStateException( "This Builder should not be reused. Use a new Builder instance instead"); } Loading @@ -283,10 +347,10 @@ public final class InlineSuggestionsRequest implements Parcelable { } @DataClass.Generated( time = 1576637222199L, time = 1578948035951L, codegenVersion = "1.0.14", sourceFile = "frameworks/base/core/java/android/view/inputmethod/InlineSuggestionsRequest.java", inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.view.inline.InlinePresentationSpec> mPresentationSpecs\nprivate void onConstructed()\nprivate static int defaultMaxSuggestionCount()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setPresentationSpecs(java.util.List<android.view.inline.InlinePresentationSpec>)\nclass BaseBuilder extends java.lang.Object implements []") inputSignatures = "public static final int SUGGESTION_COUNT_UNLIMITED\nprivate final int mMaxSuggestionCount\nprivate final @android.annotation.NonNull java.util.List<android.view.inline.InlinePresentationSpec> mPresentationSpecs\nprivate @android.annotation.NonNull java.lang.String mHostPackageName\npublic void setHostPackageName(java.lang.String)\nprivate void onConstructed()\nprivate static int defaultMaxSuggestionCount()\nprivate static java.lang.String defaultHostPackageName()\nclass InlineSuggestionsRequest extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genEqualsHashCode=true, genToString=true, genBuilder=true)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setPresentationSpecs(java.util.List<android.view.inline.InlinePresentationSpec>)\nabstract android.view.inputmethod.InlineSuggestionsRequest.Builder setHostPackageName(java.lang.String)\nclass BaseBuilder extends java.lang.Object implements []") @Deprecated private void __metadata() {} Loading
services/autofill/java/com/android/server/autofill/Session.java +5 −1 Original line number Diff line number Diff line Loading @@ -162,6 +162,9 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState /** uid the session is for */ public final int uid; /** user id the session is for */ public final int userId; /** ID of the task associated with this session's activity */ public final int taskId; Loading Loading @@ -613,7 +616,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState int newState, int flags) { if (isInlineSuggestionsEnabled()) { mInlineSuggestionsRequestCallback = new InlineSuggestionsRequestCallbackImpl(); mInputMethodManagerInternal.onCreateInlineSuggestionsRequest( mInputMethodManagerInternal.onCreateInlineSuggestionsRequest(userId, mComponentName, mCurrentViewId, mInlineSuggestionsRequestCallback); } Loading Loading @@ -759,6 +762,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState mFlags = flags; this.taskId = taskId; this.uid = uid; this.userId = userId; mStartTime = SystemClock.elapsedRealtime(); mService = service; mLock = lock; Loading
services/core/java/com/android/server/inputmethod/InputMethodManagerInternal.java +6 −4 Original line number Diff line number Diff line Loading @@ -68,8 +68,9 @@ public abstract class InputMethodManagerInternal { * @param autofillId {@link AutofillId} of currently focused field. * @param cb {@link IInlineSuggestionsRequestCallback} used to pass back the request object. */ public abstract void onCreateInlineSuggestionsRequest(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb); public abstract void onCreateInlineSuggestionsRequest(@UserIdInt int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb); /** * Force switch to the enabled input method by {@code imeId} for current user. If the input Loading Loading @@ -107,8 +108,9 @@ public abstract class InputMethodManagerInternal { } @Override public void onCreateInlineSuggestionsRequest(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb) { public void onCreateInlineSuggestionsRequest(int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb) { } @Override Loading
services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +52 −10 Original line number Diff line number Diff line Loading @@ -111,6 +111,7 @@ import android.view.WindowManager.LayoutParams; import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.view.autofill.AutofillId; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InlineSuggestionsRequest; import android.view.inputmethod.InputBinding; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionInspector; Loading Loading @@ -142,6 +143,7 @@ import com.android.internal.os.TransferPipe; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.view.IInlineSuggestionsRequestCallback; import com.android.internal.view.IInlineSuggestionsResponseCallback; import com.android.internal.view.IInputContext; import com.android.internal.view.IInputMethod; import com.android.internal.view.IInputMethodClient; Loading Loading @@ -1790,15 +1792,18 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } @GuardedBy("mMethodMap") private void onCreateInlineSuggestionsRequestLocked(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { private void onCreateInlineSuggestionsRequestLocked(@UserIdInt int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { final InputMethodInfo imi = mMethodMap.get(mCurMethodId); try { if (imi != null && imi.isInlineSuggestionsEnabled() && mCurMethod != null) { if (userId == mSettings.getCurrentUserId() && imi != null && imi.isInlineSuggestionsEnabled() && mCurMethod != null) { executeOrSendMessage(mCurMethod, mCaller.obtainMessageOOOO(MSG_INLINE_SUGGESTIONS_REQUEST, mCurMethod, componentName, autofillId, callback)); componentName, autofillId, new InlineSuggestionsRequestCallbackDecorator(callback, imi.getPackageName()))); } else { callback.onInlineSuggestionsUnsupported(); } Loading @@ -1807,6 +1812,42 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } /** * The decorator which validates the host package name in the * {@link InlineSuggestionsRequest} argument to make sure it matches the IME package name. */ private static final class InlineSuggestionsRequestCallbackDecorator extends IInlineSuggestionsRequestCallback.Stub { @NonNull private final IInlineSuggestionsRequestCallback mCallback; @NonNull private final String mImePackageName; InlineSuggestionsRequestCallbackDecorator( @NonNull IInlineSuggestionsRequestCallback callback, @NonNull String imePackageName) { mCallback = callback; mImePackageName = imePackageName; } @Override public void onInlineSuggestionsUnsupported() throws RemoteException { mCallback.onInlineSuggestionsUnsupported(); } @Override public void onInlineSuggestionsRequest(InlineSuggestionsRequest request, IInlineSuggestionsResponseCallback callback) throws RemoteException { if (!mImePackageName.equals(request.getHostPackageName())) { throw new SecurityException( "Host package name in the provide request=[" + request.getHostPackageName() + "] doesn't match the IME package name=[" + mImePackageName + "]."); } mCallback.onInlineSuggestionsRequest(request, callback); } } /** * @param imiId if null, returns enabled subtypes for the current imi * @return enabled subtypes of the specified imi Loading Loading @@ -4471,10 +4512,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } private void onCreateInlineSuggestionsRequest(ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { private void onCreateInlineSuggestionsRequest(@UserIdInt int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback callback) { synchronized (mMethodMap) { onCreateInlineSuggestionsRequestLocked(componentName, autofillId, callback); onCreateInlineSuggestionsRequestLocked(userId, componentName, autofillId, callback); } } Loading Loading @@ -4542,9 +4584,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } @Override public void onCreateInlineSuggestionsRequest(ComponentName componentName, public void onCreateInlineSuggestionsRequest(int userId, ComponentName componentName, AutofillId autofillId, IInlineSuggestionsRequestCallback cb) { mService.onCreateInlineSuggestionsRequest(componentName, autofillId, cb); mService.onCreateInlineSuggestionsRequest(userId, componentName, autofillId, cb); } @Override Loading