From 956374833a55b61d66dd9135db32a873fe491091 Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Tue, 5 Jul 2022 14:20:50 +0800 Subject: [PATCH] Improve API annotation for InputMethodManager Annotate null-ness for APIs and parameter for InputMethodManager, IInputMethodManagerInvoker and IInputMethodManager.aidl. This is a annotation improvement without any user visible changes. Bug: 237959367 Test: presubmit Change-Id: I426fb9ca9009f0f91a4d2d6a39094ea9c20671f7 --- core/api/current.txt | 14 ++--- .../IInputMethodManagerInvoker.java | 63 ++++++++++++------- .../view/inputmethod/InputMethodManager.java | 19 ++++-- .../internal/view/IInputMethodManager.aidl | 26 ++++---- 4 files changed, 73 insertions(+), 49 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 2269354cda510..93bbd8267d25f 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -53240,11 +53240,11 @@ package android.view.inputmethod { public final class InputMethodManager { method public void dispatchKeyEventFromInputMethod(@Nullable android.view.View, @NonNull android.view.KeyEvent); method public void displayCompletions(android.view.View, android.view.inputmethod.CompletionInfo[]); - method public android.view.inputmethod.InputMethodSubtype getCurrentInputMethodSubtype(); - method public java.util.List getEnabledInputMethodList(); - method public java.util.List getEnabledInputMethodSubtypeList(android.view.inputmethod.InputMethodInfo, boolean); - method public java.util.List getInputMethodList(); - method public android.view.inputmethod.InputMethodSubtype getLastInputMethodSubtype(); + method @Nullable public android.view.inputmethod.InputMethodSubtype getCurrentInputMethodSubtype(); + method @NonNull public java.util.List getEnabledInputMethodList(); + method @NonNull public java.util.List getEnabledInputMethodSubtypeList(@Nullable android.view.inputmethod.InputMethodInfo, boolean); + method @NonNull public java.util.List getInputMethodList(); + method @Nullable public android.view.inputmethod.InputMethodSubtype getLastInputMethodSubtype(); method public java.util.Map> getShortcutInputMethodsAndSubtypes(); method @Deprecated public void hideSoftInputFromInputMethod(android.os.IBinder, int); method public boolean hideSoftInputFromWindow(android.os.IBinder, int); @@ -53260,12 +53260,12 @@ package android.view.inputmethod { method @Deprecated public boolean isWatchingCursor(android.view.View); method public void restartInput(android.view.View); method public void sendAppPrivateCommand(android.view.View, String, android.os.Bundle); - method @Deprecated public void setAdditionalInputMethodSubtypes(String, android.view.inputmethod.InputMethodSubtype[]); + method @Deprecated public void setAdditionalInputMethodSubtypes(@NonNull String, @NonNull android.view.inputmethod.InputMethodSubtype[]); method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setCurrentInputMethodSubtype(android.view.inputmethod.InputMethodSubtype); method @Deprecated public void setInputMethod(android.os.IBinder, String); method @Deprecated public void setInputMethodAndSubtype(@NonNull android.os.IBinder, String, android.view.inputmethod.InputMethodSubtype); method @Deprecated public boolean shouldOfferSwitchingToNextInputMethod(android.os.IBinder); - method public void showInputMethodAndSubtypeEnabler(String); + method public void showInputMethodAndSubtypeEnabler(@Nullable String); method public void showInputMethodPicker(); method public boolean showSoftInput(android.view.View, int); method public boolean showSoftInput(android.view.View, int, android.os.ResultReceiver); diff --git a/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java b/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java index 3111fe0cb8754..489e70242a950 100644 --- a/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java +++ b/core/java/android/view/inputmethod/IInputMethodManagerInvoker.java @@ -18,10 +18,13 @@ package android.view.inputmethod; import android.annotation.AnyThread; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.UserIdInt; import android.os.IBinder; import android.os.RemoteException; import android.os.ResultReceiver; +import android.view.WindowManager; +import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.window.ImeOnBackInvokedDispatcher; import com.android.internal.inputmethod.DirectBootAwareness; @@ -54,8 +57,8 @@ final class IInputMethodManagerInvoker { } @AnyThread - void addClient(IInputMethodClient client, IRemoteInputConnection fallbackInputConnection, - int untrustedDisplayId) { + void addClient(@NonNull IInputMethodClient client, + @NonNull IRemoteInputConnection fallbackInputConnection, int untrustedDisplayId) { try { mTarget.addClient(client, fallbackInputConnection, untrustedDisplayId); } catch (RemoteException e) { @@ -64,6 +67,7 @@ final class IInputMethodManagerInvoker { } @AnyThread + @NonNull List getInputMethodList(@UserIdInt int userId) { try { return mTarget.getInputMethodList(userId); @@ -73,6 +77,7 @@ final class IInputMethodManagerInvoker { } @AnyThread + @NonNull List getAwareLockedInputMethodList(@UserIdInt int userId, @DirectBootAwareness int directBootAwareness) { try { @@ -83,6 +88,7 @@ final class IInputMethodManagerInvoker { } @AnyThread + @NonNull List getEnabledInputMethodList(@UserIdInt int userId) { try { return mTarget.getEnabledInputMethodList(userId); @@ -92,7 +98,8 @@ final class IInputMethodManagerInvoker { } @AnyThread - List getEnabledInputMethodSubtypeList(String imiId, + @NonNull + List getEnabledInputMethodSubtypeList(@Nullable String imiId, boolean allowsImplicitlySelectedSubtypes) { try { return mTarget.getEnabledInputMethodSubtypeList(imiId, @@ -103,6 +110,7 @@ final class IInputMethodManagerInvoker { } @AnyThread + @Nullable InputMethodSubtype getLastInputMethodSubtype() { try { return mTarget.getLastInputMethodSubtype(); @@ -112,8 +120,9 @@ final class IInputMethodManagerInvoker { } @AnyThread - boolean showSoftInput(IInputMethodClient client, IBinder windowToken, - int flags, ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) { + boolean showSoftInput(@NonNull IInputMethodClient client, @Nullable IBinder windowToken, + int flags, @Nullable ResultReceiver resultReceiver, + @SoftInputShowHideReason int reason) { try { return mTarget.showSoftInput(client, windowToken, flags, resultReceiver, reason); } catch (RemoteException e) { @@ -122,8 +131,9 @@ final class IInputMethodManagerInvoker { } @AnyThread - boolean hideSoftInput(IInputMethodClient client, IBinder windowToken, - int flags, ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) { + boolean hideSoftInput(@NonNull IInputMethodClient client, @Nullable IBinder windowToken, + int flags, @Nullable ResultReceiver resultReceiver, + @SoftInputShowHideReason int reason) { try { return mTarget.hideSoftInput(client, windowToken, flags, resultReceiver, reason); } catch (RemoteException e) { @@ -132,13 +142,14 @@ final class IInputMethodManagerInvoker { } @AnyThread + @NonNull InputBindResult startInputOrWindowGainedFocus(@StartInputReason int startInputReason, - IInputMethodClient client, IBinder windowToken, - @StartInputFlags int startInputFlags, - @android.view.WindowManager.LayoutParams.SoftInputModeFlags int softInputMode, - int windowFlags, EditorInfo editorInfo, IRemoteInputConnection remoteInputConnection, - IRemoteAccessibilityInputConnection remoteAccessibilityInputConnection, - int unverifiedTargetSdkVersion, ImeOnBackInvokedDispatcher imeDispatcher) { + @NonNull IInputMethodClient client, @Nullable IBinder windowToken, + @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode, + @WindowManager.LayoutParams.Flags int windowFlags, @Nullable EditorInfo editorInfo, + @Nullable IRemoteInputConnection remoteInputConnection, + @Nullable IRemoteAccessibilityInputConnection remoteAccessibilityInputConnection, + int unverifiedTargetSdkVersion, @NonNull ImeOnBackInvokedDispatcher imeDispatcher) { try { return mTarget.startInputOrWindowGainedFocus(startInputReason, client, windowToken, startInputFlags, softInputMode, windowFlags, editorInfo, remoteInputConnection, @@ -149,7 +160,8 @@ final class IInputMethodManagerInvoker { } @AnyThread - void showInputMethodPickerFromClient(IInputMethodClient client, int auxiliarySubtypeMode) { + void showInputMethodPickerFromClient(@NonNull IInputMethodClient client, + int auxiliarySubtypeMode) { try { mTarget.showInputMethodPickerFromClient(client, auxiliarySubtypeMode); } catch (RemoteException e) { @@ -158,8 +170,8 @@ final class IInputMethodManagerInvoker { } @AnyThread - void showInputMethodPickerFromSystem(IInputMethodClient client, int auxiliarySubtypeMode, - int displayId) { + void showInputMethodPickerFromSystem(@NonNull IInputMethodClient client, + int auxiliarySubtypeMode, int displayId) { try { mTarget.showInputMethodPickerFromSystem(client, auxiliarySubtypeMode, displayId); } catch (RemoteException e) { @@ -168,7 +180,8 @@ final class IInputMethodManagerInvoker { } @AnyThread - void showInputMethodAndSubtypeEnablerFromClient(IInputMethodClient client, String imeId) { + void showInputMethodAndSubtypeEnablerFromClient(@NonNull IInputMethodClient client, + @Nullable String imeId) { try { mTarget.showInputMethodAndSubtypeEnablerFromClient(client, imeId); } catch (RemoteException e) { @@ -186,6 +199,7 @@ final class IInputMethodManagerInvoker { } @AnyThread + @Nullable InputMethodSubtype getCurrentInputMethodSubtype() { try { return mTarget.getCurrentInputMethodSubtype(); @@ -195,7 +209,8 @@ final class IInputMethodManagerInvoker { } @AnyThread - void setAdditionalInputMethodSubtypes(String imeId, InputMethodSubtype[] subtypes) { + void setAdditionalInputMethodSubtypes(@NonNull String imeId, + @NonNull InputMethodSubtype[] subtypes) { try { mTarget.setAdditionalInputMethodSubtypes(imeId, subtypes); } catch (RemoteException e) { @@ -204,7 +219,7 @@ final class IInputMethodManagerInvoker { } @AnyThread - int getInputMethodWindowVisibleHeight(IInputMethodClient client) { + int getInputMethodWindowVisibleHeight(@NonNull IInputMethodClient client) { try { return mTarget.getInputMethodWindowVisibleHeight(client); } catch (RemoteException e) { @@ -213,8 +228,8 @@ final class IInputMethodManagerInvoker { } @AnyThread - void reportVirtualDisplayGeometryAsync(IInputMethodClient client, int childDisplayId, - float[] matrixValues) { + void reportVirtualDisplayGeometryAsync(@NonNull IInputMethodClient client, int childDisplayId, + @Nullable float[] matrixValues) { try { mTarget.reportVirtualDisplayGeometryAsync(client, childDisplayId, matrixValues); } catch (RemoteException e) { @@ -223,7 +238,7 @@ final class IInputMethodManagerInvoker { } @AnyThread - void reportPerceptibleAsync(IBinder windowToken, boolean perceptible) { + void reportPerceptibleAsync(@NonNull IBinder windowToken, boolean perceptible) { try { mTarget.reportPerceptibleAsync(windowToken, perceptible); } catch (RemoteException e) { @@ -232,7 +247,7 @@ final class IInputMethodManagerInvoker { } @AnyThread - void removeImeSurfaceFromWindowAsync(IBinder windowToken) { + void removeImeSurfaceFromWindowAsync(@NonNull IBinder windowToken) { try { mTarget.removeImeSurfaceFromWindowAsync(windowToken); } catch (RemoteException e) { @@ -241,7 +256,7 @@ final class IInputMethodManagerInvoker { } @AnyThread - void startStylusHandwriting(IInputMethodClient client) { + void startStylusHandwriting(@NonNull IInputMethodClient client) { try { mTarget.startStylusHandwriting(client); } catch (RemoteException e) { diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index f84309444dbff..52947a54e167a 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -637,7 +637,7 @@ public final class InputMethodManager { * {@link android.view.WindowInsetsController}. * @hide */ - public void reportPerceptible(IBinder windowToken, boolean perceptible) { + public void reportPerceptible(@NonNull IBinder windowToken, boolean perceptible) { mServiceInvoker.reportPerceptibleAsync(windowToken, perceptible); } @@ -1396,6 +1396,7 @@ public final class InputMethodManager { * * @return {@link List} of {@link InputMethodInfo}. */ + @NonNull public List getInputMethodList() { // We intentionally do not use UserHandle.getCallingUserId() here because for system // services InputMethodManagerInternal.getInputMethodListAsUser() should be used @@ -1474,6 +1475,7 @@ public final class InputMethodManager { * * @return {@link List} of {@link InputMethodInfo}. */ + @NonNull public List getEnabledInputMethodList() { // We intentionally do not use UserHandle.getCallingUserId() here because for system // services InputMethodManagerInternal.getEnabledInputMethodListAsUser() should be used @@ -1498,12 +1500,14 @@ public final class InputMethodManager { * *

On multi user environment, this API returns a result for the calling process user.

* - * @param imi An input method info whose subtypes list will be returned. + * @param imi The {@link InputMethodInfo} whose subtypes list will be returned. If {@code null}, + * returns enabled subtypes for the currently selected {@link InputMethodInfo}. * @param allowsImplicitlySelectedSubtypes A boolean flag to allow to return the implicitly * selected subtypes. If an input method info doesn't have enabled subtypes, the framework * will implicitly enable subtypes according to the current system language. */ - public List getEnabledInputMethodSubtypeList(InputMethodInfo imi, + @NonNull + public List getEnabledInputMethodSubtypeList(@Nullable InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes) { return mServiceInvoker.getEnabledInputMethodSubtypeList( imi == null ? null : imi.getId(), @@ -2606,7 +2610,7 @@ public final class InputMethodManager { * @param windowToken The client window token that requests the IME to remove its surface. * @hide */ - public void removeImeSurface(IBinder windowToken) { + public void removeImeSurface(@NonNull IBinder windowToken) { synchronized (mH) { mServiceInvoker.removeImeSurfaceFromWindowAsync(windowToken); } @@ -3238,7 +3242,7 @@ public final class InputMethodManager { * @param imiId An input method, whose subtypes settings will be shown. If imiId is null, * subtypes of all input methods will be shown. */ - public void showInputMethodAndSubtypeEnabler(String imiId) { + public void showInputMethodAndSubtypeEnabler(@Nullable String imiId) { mServiceInvoker.showInputMethodAndSubtypeEnablerFromClient(mClient, imiId); } @@ -3247,6 +3251,7 @@ public final class InputMethodManager { * the current input method. This method returns null when the current input method doesn't * have any input method subtype. */ + @Nullable public InputMethodSubtype getCurrentInputMethodSubtype() { return mServiceInvoker.getCurrentInputMethodSubtype(); } @@ -3481,10 +3486,12 @@ public final class InputMethodManager { * of "Additional Subtype" may be completely dropped in a future version of Android. */ @Deprecated - public void setAdditionalInputMethodSubtypes(String imiId, InputMethodSubtype[] subtypes) { + public void setAdditionalInputMethodSubtypes(@NonNull String imiId, + @NonNull InputMethodSubtype[] subtypes) { mServiceInvoker.setAdditionalInputMethodSubtypes(imiId, subtypes); } + @Nullable public InputMethodSubtype getLastInputMethodSubtype() { return mServiceInvoker.getLastInputMethodSubtype(); } diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 7eb9579f9505c..dd9fcb07283a4 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -49,14 +49,14 @@ interface IInputMethodManager { + "android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)") List getEnabledInputMethodList(int userId); - List getEnabledInputMethodSubtypeList(in String imiId, + List getEnabledInputMethodSubtypeList(in @nullable String imiId, boolean allowsImplicitlySelectedSubtypes); - InputMethodSubtype getLastInputMethodSubtype(); + @nullable InputMethodSubtype getLastInputMethodSubtype(); - boolean showSoftInput(in IInputMethodClient client, IBinder windowToken, int flags, - in ResultReceiver resultReceiver, int reason); - boolean hideSoftInput(in IInputMethodClient client, IBinder windowToken, int flags, - in ResultReceiver resultReceiver, int reason); + boolean showSoftInput(in IInputMethodClient client, @nullable IBinder windowToken, int flags, + in @nullable ResultReceiver resultReceiver, int reason); + boolean hideSoftInput(in IInputMethodClient client, @nullable IBinder windowToken, int flags, + in @nullable ResultReceiver resultReceiver, int reason); // If windowToken is null, this just does startInput(). Otherwise this reports that a window // has gained focus, and if 'editorInfo' is non-null then also does startInput. @@ -65,11 +65,12 @@ interface IInputMethodManager { + "android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, conditional = true)") InputBindResult startInputOrWindowGainedFocus( /* @StartInputReason */ int startInputReason, - in IInputMethodClient client, in IBinder windowToken, + in IInputMethodClient client, in @nullable IBinder windowToken, /* @StartInputFlags */ int startInputFlags, /* @android.view.WindowManager.LayoutParams.SoftInputModeFlags */ int softInputMode, - int windowFlags, in EditorInfo editorInfo, in IRemoteInputConnection inputConnection, - in IRemoteAccessibilityInputConnection remoteAccessibilityInputConnection, + /* @android.view.WindowManager.LayoutParams.Flags */ int windowFlags, + in @nullable EditorInfo editorInfo, in @nullable IRemoteInputConnection inputConnection, + in @nullable IRemoteAccessibilityInputConnection remoteAccessibilityInputConnection, int unverifiedTargetSdkVersion, in ImeOnBackInvokedDispatcher imeDispatcher); void showInputMethodPickerFromClient(in IInputMethodClient client, @@ -80,20 +81,21 @@ interface IInputMethodManager { void showInputMethodPickerFromSystem(in IInputMethodClient client, int auxiliarySubtypeMode, int displayId); - void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client, String topId); + void showInputMethodAndSubtypeEnablerFromClient(in IInputMethodClient client, + @nullable String topId); @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.TEST_INPUT_METHOD)") boolean isInputMethodPickerShownForTest(); - InputMethodSubtype getCurrentInputMethodSubtype(); + @nullable InputMethodSubtype getCurrentInputMethodSubtype(); void setAdditionalInputMethodSubtypes(String id, in InputMethodSubtype[] subtypes); // This is kept due to @UnsupportedAppUsage. // TODO(Bug 113914148): Consider removing this. int getInputMethodWindowVisibleHeight(in IInputMethodClient client); oneway void reportVirtualDisplayGeometryAsync(in IInputMethodClient parentClient, - int childDisplayId, in float[] matrixValues); + int childDisplayId, in @nullable float[] matrixValues); oneway void reportPerceptibleAsync(in IBinder windowToken, boolean perceptible);