diff options
2 files changed, 123 insertions, 1 deletions
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java new file mode 100644 index 000000000000..73d04c64bc63 --- /dev/null +++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.inputmethod; + +import static android.inputmethodservice.InputMethodService.IME_ACTIVE; + +import static com.android.internal.inputmethod.SoftInputShowHideReason.HIDE_SOFT_INPUT; +import static com.android.internal.inputmethod.SoftInputShowHideReason.SHOW_SOFT_INPUT; +import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_HIDE_IME; +import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_HIDE_IME_EXPLICIT; +import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_HIDE_IME_NOT_ALWAYS; +import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_INVALID; +import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_SHOW_IME; +import static com.android.server.inputmethod.ImeVisibilityStateComputer.STATE_SHOW_IME_IMPLICIT; + +import static org.junit.Assert.assertThrows; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +import android.os.RemoteException; +import android.view.inputmethod.InputMethodManager; + +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Test the behavior of {@link DefaultImeVisibilityApplier} when performing or applying the IME + * visibility state. + * + * Build/Install/Run: + * atest FrameworksInputMethodSystemServerTests:DefaultImeVisibilityApplierTest + */ +@RunWith(AndroidJUnit4.class) +public class DefaultImeVisibilityApplierTest extends InputMethodManagerServiceTestBase { + private DefaultImeVisibilityApplier mVisibilityApplier; + + @Before + public void setUp() throws RemoteException { + super.setUp(); + mVisibilityApplier = + (DefaultImeVisibilityApplier) mInputMethodManagerService.getVisibilityApplier(); + mInputMethodManagerService.mCurFocusedWindowClient = mock( + InputMethodManagerService.ClientState.class); + } + + @Test + public void testPerformShowIme() throws Exception { + mVisibilityApplier.performShowIme(mWindowToken, null, null, SHOW_SOFT_INPUT); + verifyShowSoftInput(false, true, InputMethodManager.SHOW_IMPLICIT); + } + + @Test + public void testPerformHideIme() throws Exception { + mVisibilityApplier.performHideIme(mWindowToken, null, 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)); + } + + @Test + public void testApplyImeVisibility_showIme() { + mVisibilityApplier.applyImeVisibility(mWindowToken, null, STATE_SHOW_IME); + verify(mMockWindowManagerInternal).showImePostLayout(eq(mWindowToken), any()); + } + + @Test + public void testApplyImeVisibility_hideIme() { + mVisibilityApplier.applyImeVisibility(mWindowToken, null, STATE_HIDE_IME); + verify(mMockWindowManagerInternal).hideIme(eq(mWindowToken), anyInt(), any()); + } + + @Test + public void testApplyImeVisibility_hideImeExplicit() throws Exception { + mInputMethodManagerService.mImeWindowVis = IME_ACTIVE; + mVisibilityApplier.applyImeVisibility(mWindowToken, null, STATE_HIDE_IME_EXPLICIT); + verifyHideSoftInput(true, true); + } + + @Test + public void testApplyImeVisibility_hideNotAlways() throws Exception { + mInputMethodManagerService.mImeWindowVis = IME_ACTIVE; + mVisibilityApplier.applyImeVisibility(mWindowToken, null, STATE_HIDE_IME_NOT_ALWAYS); + verifyHideSoftInput(true, true); + } + + @Test + public void testApplyImeVisibility_showImeImplicit() throws Exception { + mVisibilityApplier.applyImeVisibility(mWindowToken, null, STATE_SHOW_IME_IMPLICIT); + verifyShowSoftInput(true, true, InputMethodManager.SHOW_IMPLICIT); + } +} 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 cd992e2da133..804bb495bafe 100644 --- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java +++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java @@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -238,12 +239,17 @@ public class InputMethodManagerServiceTestBase { protected void verifyShowSoftInput(boolean setVisible, boolean showSoftInput) throws RemoteException { + verifyShowSoftInput(setVisible, showSoftInput, anyInt()); + } + + protected void verifyShowSoftInput(boolean setVisible, boolean showSoftInput, int showFlags) + throws RemoteException { synchronized (ImfLock.class) { verify(mMockInputMethodBindingController, times(setVisible ? 1 : 0)) .setCurrentMethodVisible(); } verify(mMockInputMethod, times(showSoftInput ? 1 : 0)) - .showSoftInput(any(), any(), anyInt(), any()); + .showSoftInput(any(), any(), eq(showFlags), any()); } protected void verifyHideSoftInput(boolean setNotVisible, boolean hideSoftInput) |