Fix some issues in FrameworkInputMethodSystemServerTests

- Fix wrong src path in InputMethodSystemServerTests/Android.bp by CL[1]
- In IMMS, Make ImeTrackerService by CL[2] can inject a test looper, in
  case InputMethodManagerServiceTestBase#setUp got exception by null
  looper queue.
- Remove unused test method IMMS#getVisibilityStateComputer().
- Add ImfLock block in IMMS#getVisibilityApplier for fixing linter
  check.
- Fix a potential NPE when calling mImeTrackerService.onImmsUpdate that
  the statsToken may null during testing.
- Remove duplicate calls in testApplyImeVisibility_throwForInvalidState.
- Add missed showFlag parameters in testPerformShowIme.
- Fix verifyShowSoftInput logic when no need to verify showFlags cases
- Add a regression unit test In ImeVisibilityStateComputerTest for
  Bug 265439883:
  testComputeState_lastImeRequestedVisible_preserved_When_StateUnChanged

 [1]: I84f1a1b25eef4a757d8da27807285e08417458b4
 [2]: I432bab2de58a9df2c421bb00946ab211de445660

Bug: 246309664
Bug: 240359838
Test: atest FrameworkInputMethodSystemServerTests all passed
Change-Id: I0890641868f9200c613af0d6ee7014e4c7b1e7ed
diff --git a/services/tests/InputMethodSystemServerTests/Android.bp b/services/tests/InputMethodSystemServerTests/Android.bp
index 70a5c3f..05a8b11 100644
--- a/services/tests/InputMethodSystemServerTests/Android.bp
+++ b/services/tests/InputMethodSystemServerTests/Android.bp
@@ -28,7 +28,7 @@
     ],
 
     srcs: [
-        "src/server/**/*.java",
+        "src/com/android/server/inputmethod/**/*.java",
     ],
 
     static_libs: [
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java
index 73d04c6..720f486 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java
@@ -65,19 +65,24 @@
 
     @Test
     public void testPerformShowIme() throws Exception {
-        mVisibilityApplier.performShowIme(mWindowToken, null, null, SHOW_SOFT_INPUT);
+        synchronized (ImfLock.class) {
+            mVisibilityApplier.performShowIme(mWindowToken, null /* statsToken */,
+                    InputMethodManager.SHOW_IMPLICIT, null, SHOW_SOFT_INPUT);
+        }
         verifyShowSoftInput(false, true, InputMethodManager.SHOW_IMPLICIT);
     }
 
     @Test
     public void testPerformHideIme() throws Exception {
-        mVisibilityApplier.performHideIme(mWindowToken, null, null, HIDE_SOFT_INPUT);
+        synchronized (ImfLock.class) {
+            mVisibilityApplier.performHideIme(mWindowToken, null /* statsToken */, null,
+                    HIDE_SOFT_INPUT);
+        }
         verifyHideSoftInput(false, true);
     }
 
     @Test
     public void testApplyImeVisibility_throwForInvalidState() {
-        mVisibilityApplier.applyImeVisibility(mWindowToken, null, STATE_INVALID);
         assertThrows(IllegalArgumentException.class,
                 () -> mVisibilityApplier.applyImeVisibility(mWindowToken, null, STATE_INVALID));
     }
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/ImeVisibilityStateComputerTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/ImeVisibilityStateComputerTest.java
index 8415fe1..a1b9b98 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/ImeVisibilityStateComputerTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/ImeVisibilityStateComputerTest.java
@@ -30,6 +30,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.os.Binder;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.view.inputmethod.InputMethodManager;
@@ -177,9 +178,28 @@
         assertThat(state.getImeDisplayId()).isEqualTo(FALLBACK_DISPLAY_ID);
     }
 
-    private void initImeTargetWindowState(IBinder windowToken) {
+    @Test
+    public void testComputeState_lastImeRequestedVisible_preserved_When_StateUnChanged() {
+        // Assume the last IME targeted window has requested IME visible
+        final IBinder lastImeTargetWindowToken = new Binder();
+        mInputMethodManagerService.mLastImeTargetWindow = lastImeTargetWindowToken;
+        mComputer.requestImeVisibility(lastImeTargetWindowToken, true);
+        final ImeTargetWindowState lastState = mComputer.getWindowStateOrNull(
+                lastImeTargetWindowToken);
+        assertThat(lastState.isRequestedImeVisible()).isTrue();
+
+        // Verify when focusing the next window with STATE_UNCHANGED flag, the last IME
+        // visibility state will be preserved to the current window state.
+        final ImeTargetWindowState stateWithUnChangedFlag = initImeTargetWindowState(mWindowToken);
+        mComputer.computeState(stateWithUnChangedFlag, true /* allowVisible */);
+        assertThat(stateWithUnChangedFlag.isRequestedImeVisible()).isEqualTo(
+                lastState.isRequestedImeVisible());
+    }
+
+    private ImeTargetWindowState initImeTargetWindowState(IBinder windowToken) {
         final ImeTargetWindowState state = new ImeTargetWindowState(SOFT_INPUT_STATE_UNCHANGED,
                 0, true, true, true);
         mComputer.setWindowState(windowToken, state);
+        return state;
     }
 }
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
index 804bb49..dbdffd0 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
@@ -71,6 +71,8 @@
 
 /** Base class for testing {@link InputMethodManagerService}. */
 public class InputMethodManagerServiceTestBase {
+    private static final int NO_VERIFY_SHOW_FLAGS = -1;
+
     protected static final String TEST_SELECTED_IME_ID = "test.ime";
     protected static final String TEST_EDITOR_PKG_NAME = "test.editor";
     protected static final String TEST_FOCUSED_WINDOW_NAME = "test.editor/activity";
@@ -239,7 +241,7 @@
 
     protected void verifyShowSoftInput(boolean setVisible, boolean showSoftInput)
             throws RemoteException {
-        verifyShowSoftInput(setVisible, showSoftInput, anyInt());
+        verifyShowSoftInput(setVisible, showSoftInput, NO_VERIFY_SHOW_FLAGS);
     }
 
     protected void verifyShowSoftInput(boolean setVisible, boolean showSoftInput, int showFlags)
@@ -249,7 +251,8 @@
                     .setCurrentMethodVisible();
         }
         verify(mMockInputMethod, times(showSoftInput ? 1 : 0))
-                .showSoftInput(any(), any(), eq(showFlags), any());
+                .showSoftInput(any(), any(),
+                        showFlags != NO_VERIFY_SHOW_FLAGS ? eq(showFlags) : anyInt(), any());
     }
 
     protected void verifyHideSoftInput(boolean setNotVisible, boolean hideSoftInput)