Introduce IInputMethodManager.InitParams

IInputMethod#initializeInternal() is a hot-spot where we keep adding
new parameters recently.  Introducing a dedicated parameter object
would allow us to add further parameters with fewer lines of changes.

This is a mechanical refactoring. There should be no developer
observable behavior change.

Bug: 234882948
Test: presubmit
Change-Id: I98a5424385804ec190885ba53973935f9db66b88
diff --git a/core/java/android/inputmethodservice/IInputMethodWrapper.java b/core/java/android/inputmethodservice/IInputMethodWrapper.java
index 849690d..e960df1 100644
--- a/core/java/android/inputmethodservice/IInputMethodWrapper.java
+++ b/core/java/android/inputmethodservice/IInputMethodWrapper.java
@@ -40,7 +40,6 @@
 import com.android.internal.inputmethod.CancellationGroup;
 import com.android.internal.inputmethod.IInlineSuggestionsRequestCallback;
 import com.android.internal.inputmethod.IInputMethod;
-import com.android.internal.inputmethod.IInputMethodPrivilegedOperations;
 import com.android.internal.inputmethod.IInputMethodSession;
 import com.android.internal.inputmethod.IInputMethodSessionCallback;
 import com.android.internal.inputmethod.IRemoteInputConnection;
@@ -172,17 +171,9 @@
                 args.recycle();
                 return;
             }
-            case DO_INITIALIZE_INTERNAL: {
-                SomeArgs args = (SomeArgs) msg.obj;
-                try {
-                    inputMethod.initializeInternal((IBinder) args.arg1,
-                            (IInputMethodPrivilegedOperations) args.arg2, msg.arg1,
-                            (boolean) args.arg3, msg.arg2);
-                } finally {
-                    args.recycle();
-                }
+            case DO_INITIALIZE_INTERNAL:
+                inputMethod.initializeInternal((IInputMethod.InitParams) msg.obj);
                 return;
-            }
             case DO_SET_INPUT_CONTEXT: {
                 inputMethod.bindInput((InputBinding)msg.obj);
                 return;
@@ -293,11 +284,8 @@
 
     @BinderThread
     @Override
-    public void initializeInternal(IBinder token, IInputMethodPrivilegedOperations privOps,
-            int configChanges, boolean stylusHwSupported,
-            @InputMethodNavButtonFlags int navButtonFlags) {
-        mCaller.executeOrSendMessage(mCaller.obtainMessageIIOOO(DO_INITIALIZE_INTERNAL,
-                configChanges, navButtonFlags, token, privOps, stylusHwSupported));
+    public void initializeInternal(@NonNull IInputMethod.InitParams params) {
+        mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_INITIALIZE_INTERNAL, params));
     }
 
     @BinderThread
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java
index 3a87975..c02f870 100644
--- a/core/java/android/inputmethodservice/InputMethodService.java
+++ b/core/java/android/inputmethodservice/InputMethodService.java
@@ -145,7 +145,6 @@
 import com.android.internal.inputmethod.IInlineSuggestionsRequestCallback;
 import com.android.internal.inputmethod.IInputContentUriToken;
 import com.android.internal.inputmethod.IInputMethod;
-import com.android.internal.inputmethod.IInputMethodPrivilegedOperations;
 import com.android.internal.inputmethod.IRemoteInputConnection;
 import com.android.internal.inputmethod.ImeTracing;
 import com.android.internal.inputmethod.InlineSuggestionsRequestInfo;
@@ -699,23 +698,21 @@
          */
         @MainThread
         @Override
-        public final void initializeInternal(@NonNull IBinder token,
-                IInputMethodPrivilegedOperations privilegedOperations, int configChanges,
-                boolean stylusHwSupported, @InputMethodNavButtonFlags int navButtonFlags) {
+        public final void initializeInternal(@NonNull IInputMethod.InitParams params) {
             if (mDestroyed) {
                 Log.i(TAG, "The InputMethodService has already onDestroyed()."
                     + "Ignore the initialization.");
                 return;
             }
             Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.initializeInternal");
-            mConfigTracker.onInitialize(configChanges);
-            mPrivOps.set(privilegedOperations);
-            InputMethodPrivilegedOperationsRegistry.put(token, mPrivOps);
-            if (stylusHwSupported) {
+            mConfigTracker.onInitialize(params.configChanges);
+            mPrivOps.set(params.privilegedOperations);
+            InputMethodPrivilegedOperationsRegistry.put(params.token, mPrivOps);
+            if (params.stylusHandWritingSupported) {
                 mInkWindow = new InkWindow(mWindow.getContext());
             }
-            mNavigationBarController.onNavButtonFlagsChanged(navButtonFlags);
-            attachToken(token);
+            mNavigationBarController.onNavButtonFlagsChanged(params.navigationBarFlags);
+            attachToken(params.token);
             Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
         }
 
diff --git a/core/java/android/view/inputmethod/InputMethod.java b/core/java/android/view/inputmethod/InputMethod.java
index fc225fe..95add29 100644
--- a/core/java/android/view/inputmethod/InputMethod.java
+++ b/core/java/android/view/inputmethod/InputMethod.java
@@ -32,7 +32,6 @@
 
 import com.android.internal.inputmethod.IInlineSuggestionsRequestCallback;
 import com.android.internal.inputmethod.IInputMethod;
-import com.android.internal.inputmethod.IInputMethodPrivilegedOperations;
 import com.android.internal.inputmethod.InlineSuggestionsRequestInfo;
 import com.android.internal.inputmethod.InputMethodNavButtonFlags;
 
@@ -100,21 +99,12 @@
      * unique token for the session it has with the system service as well as
      * IPC endpoint to do some other privileged operations.
      *
-     * @param token special token for the system to identify
-     *              {@link InputMethodService}
-     * @param privilegedOperations IPC endpoint to do some privileged
-     *                             operations that are allowed only to the
-     *                             current IME.
-     * @param configChanges {@link InputMethodInfo#getConfigChanges()} declared by IME.
-     * @param stylusHwSupported {@link InputMethodInfo#supportsStylusHandwriting()} declared by IME.
-     * @param navButtonFlags The initial state of {@link InputMethodNavButtonFlags}.
+     * @param params Contains parameters to initialize the {@link InputMethodService}.
      * @hide
      */
     @MainThread
-    default void initializeInternal(IBinder token,
-            IInputMethodPrivilegedOperations privilegedOperations, int configChanges,
-            boolean stylusHwSupported, @InputMethodNavButtonFlags int navButtonFlags) {
-        attachToken(token);
+    default void initializeInternal(@NonNull IInputMethod.InitParams params) {
+        attachToken(params.token);
     }
 
     /**
diff --git a/core/java/com/android/internal/inputmethod/IInputMethod.aidl b/core/java/com/android/internal/inputmethod/IInputMethod.aidl
index 88983ce..8bab5c3 100644
--- a/core/java/com/android/internal/inputmethod/IInputMethod.aidl
+++ b/core/java/com/android/internal/inputmethod/IInputMethod.aidl
@@ -35,8 +35,16 @@
  * Top-level interface to an input method component (implemented in a Service).
  */
 oneway interface IInputMethod {
-    void initializeInternal(IBinder token, IInputMethodPrivilegedOperations privOps,
-             int configChanges, boolean stylusHwSupported, int navigationBarFlags);
+
+    parcelable InitParams {
+        IBinder token;
+        IInputMethodPrivilegedOperations privilegedOperations;
+        int configChanges;
+        boolean stylusHandWritingSupported;
+        int navigationBarFlags;
+    }
+
+    void initializeInternal(in InitParams params);
 
     void onCreateInlineSuggestionsRequest(in InlineSuggestionsRequestInfo requestInfo,
             in IInlineSuggestionsRequestCallback cb);
diff --git a/services/core/java/com/android/server/inputmethod/IInputMethodInvoker.java b/services/core/java/com/android/server/inputmethod/IInputMethodInvoker.java
index 5327d0f..6c75dbf 100644
--- a/services/core/java/com/android/server/inputmethod/IInputMethodInvoker.java
+++ b/services/core/java/com/android/server/inputmethod/IInputMethodInvoker.java
@@ -108,12 +108,17 @@
     }
 
     @AnyThread
-    void initializeInternal(IBinder token, IInputMethodPrivilegedOperations privOps,
-            int configChanges, boolean stylusHwSupported,
-            @InputMethodNavButtonFlags int navButtonFlags) {
+    void initializeInternal(IBinder token, IInputMethodPrivilegedOperations privilegedOperations,
+            int configChanges, boolean stylusHandWritingSupported,
+            @InputMethodNavButtonFlags int navigationBarFlags) {
+        final IInputMethod.InitParams params = new IInputMethod.InitParams();
+        params.token = token;
+        params.privilegedOperations = privilegedOperations;
+        params.configChanges = configChanges;
+        params.stylusHandWritingSupported = stylusHandWritingSupported;
+        params.navigationBarFlags = navigationBarFlags;
         try {
-            mTarget.initializeInternal(token, privOps, configChanges, stylusHwSupported,
-                    navButtonFlags);
+            mTarget.initializeInternal(params);
         } catch (RemoteException e) {
             logRemoteException(e);
         }