Merge "Allow setImeWindowStatus with null startInputToken"
diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java
index 7a5e670..a541a4c 100644
--- a/core/java/android/view/WindowManagerInternal.java
+++ b/core/java/android/view/WindowManagerInternal.java
@@ -296,9 +296,12 @@
      *                         to corresponding API calls.  Note that this state is not guaranteed
      *                         to be synchronized with state in WindowManagerService.
      * @param targetWindowToken token to identify the target window that the IME is associated with.
+     *                          {@code null} when application, system, or the IME itself decided to
+     *                          change its window visibility before being associated with any target
+     *                          window.
      */
-    public abstract void updateInputMethodWindowStatus(IBinder imeToken, boolean imeWindowVisible,
-            IBinder targetWindowToken);
+    public abstract void updateInputMethodWindowStatus(@NonNull IBinder imeToken,
+            boolean imeWindowVisible, @Nullable IBinder targetWindowToken);
 
     /**
       * Returns true when the hardware keyboard is available.
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index e6f6e57..8442c11 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -2033,10 +2033,6 @@
     @Override
     public void setImeWindowStatus(IBinder token, IBinder startInputToken, int vis,
             int backDisposition) {
-        if (startInputToken == null) {
-            throw new InvalidParameterException("startInputToken cannot be null");
-        }
-
         if (!calledWithValidToken(token)) {
             return;
         }
@@ -2044,15 +2040,13 @@
         final StartInputInfo info;
         synchronized (mMethodMap) {
             info = mStartInputMap.get(startInputToken);
-            if (info == null) {
-                throw new InvalidParameterException("Unknown startInputToken=" + startInputToken);
-            }
             mImeWindowVis = vis;
             mBackDisposition = backDisposition;
             updateSystemUiLocked(token, vis, backDisposition);
         }
-        mWindowManagerInternal.updateInputMethodWindowStatus(info.mImeToken,
-                (vis & InputMethodService.IME_VISIBLE) != 0, info.mTargetWindow);
+        mWindowManagerInternal.updateInputMethodWindowStatus(token,
+                (vis & InputMethodService.IME_VISIBLE) != 0,
+                token != null ? info.mTargetWindow : null);
     }
 
     private void updateSystemUi(IBinder token, int vis, int backDisposition) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index ad8fb8c..5653113 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -7864,8 +7864,8 @@
         }
 
         @Override
-        public void updateInputMethodWindowStatus(IBinder imeToken, boolean imeWindowVisible,
-                IBinder targetWindowToken) {
+        public void updateInputMethodWindowStatus(@NonNull IBinder imeToken,
+                boolean imeWindowVisible, @Nullable IBinder targetWindowToken) {
             // TODO (b/34628091): Use this method to address the window animation issue.
             if (DEBUG_INPUT_METHOD) {
                 Slog.w(TAG_WM, "updateInputMethodWindowStatus: imeToken=" + imeToken