diff options
| author | 2025-02-05 13:20:04 -0800 | |
|---|---|---|
| committer | 2025-02-05 13:20:04 -0800 | |
| commit | 225b4dc7463d2eb3b3efd7e2a4cc64bc44da0483 (patch) | |
| tree | 832bdb0b736cc91b1261bd87baaeb45125b2e0cd | |
| parent | fbfc15f0c36bd49ab17d2ab0ab44994c9cef0e95 (diff) | |
| parent | 5aefade7285b6524106d67ff5d6538371a624d20 (diff) | |
Merge "Restore initial config and await secure setting" into main
| -rw-r--r-- | core/java/android/inputmethodservice/InputMethodService.java | 14 | ||||
| -rw-r--r-- | services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java | 390 |
2 files changed, 229 insertions, 175 deletions
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 4c9e73c8b21f..a528ba4b16bf 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -1725,10 +1725,22 @@ public class InputMethodService extends AbstractInputMethodService { return "SettingsObserver{mShowImeWithHardKeyboard=" + mShowImeWithHardKeyboard + "}"; } } + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private SettingsObserver mSettingsObserver; /** + * Checks whether the IME should be shown when a hardware keyboard is connected, as configured + * through {@link Settings.Secure#SHOW_IME_WITH_HARD_KEYBOARD}, for testing purposes only. + * + * @hide + */ + @VisibleForTesting + public final boolean getShouldShowImeWithHardKeyboardForTesting() { + return mSettingsObserver.shouldShowImeWithHardKeyboard(); + } + + /** * You can call this to customize the theme used by your IME's window. * This theme should typically be one that derives from * {@link android.R.style#Theme_InputMethod}, which is the default theme @@ -4454,7 +4466,7 @@ public class InputMethodService extends AbstractInputMethodService { * * @hide */ - @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) + @VisibleForTesting public final boolean isImeNavigationBarShownForTesting() { return mNavigationBarController.isShown(); } diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java index 27adec003355..0f4e39511796 100644 --- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java +++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java @@ -134,19 +134,18 @@ public class InputMethodServiceTest { .that(mInputMethodService.getCurrentInputViewStarted()).isFalse(); }); // Save the original value of show_ime_with_hard_keyboard from Settings. - mShowImeWithHardKeyboardEnabled = Settings.Secure.getInt( - mInputMethodService.getContentResolver(), - Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0) != 0; + mShowImeWithHardKeyboardEnabled = + mInputMethodService.getShouldShowImeWithHardKeyboardForTesting(); } @After public void tearDown() throws Exception { mUiDevice.unfreezeRotation(); - executeShellCommand("ime disable " + mInputMethodId); // Change back the original value of show_ime_with_hard_keyboard in Settings. executeShellCommand(mShowImeWithHardKeyboardEnabled ? ENABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD : DISABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD); + executeShellCommand("ime disable " + mInputMethodId); } /** @@ -321,26 +320,30 @@ public class InputMethodServiceTest { public void testOnEvaluateInputViewShown_showImeWithHardKeyboard() { setShowImeWithHardKeyboard(true /* enabled */); - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> assertWithMessage("InputView should show with visible hardware keyboard") - .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> assertWithMessage("InputView should show without hardware keyboard") - .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; - eventually(() -> assertWithMessage("InputView should show with hidden hardware keyboard") - .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should show with visible hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should show without hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; + eventually(() -> + assertWithMessage("InputView should show with hidden hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -351,27 +354,30 @@ public class InputMethodServiceTest { public void testOnEvaluateInputViewShown_disableShowImeWithHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> - assertWithMessage("InputView should not show with visible hardware keyboard") - .that(mInputMethodService.onEvaluateInputViewShown()).isFalse()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - eventually(() -> assertWithMessage("InputView should show without hardware keyboard") - .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); - - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; - eventually(() -> assertWithMessage("InputView should show with hidden hardware keyboard") - .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should not show with visible hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isFalse()); + + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + eventually(() -> + assertWithMessage("InputView should show without hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; + eventually(() -> + assertWithMessage("InputView should show with hidden hardware keyboard") + .that(mInputMethodService.onEvaluateInputViewShown()).isTrue()); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -382,27 +388,34 @@ public class InputMethodServiceTest { public void testShowSoftInput_disableShowImeWithHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_NO; - - // When InputMethodService#onEvaluateInputViewShown() returns false, the IME should not be - // shown no matter what the show flag is. - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - false /* expected */, - false /* inputViewStarted */); - assertWithMessage("IME is not shown after SHOW_IMPLICIT") - .that(mInputMethodService.isInputViewShown()).isFalse(); + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO; + + // When InputMethodService#onEvaluateInputViewShown() returns false, the IME should + // not be shown no matter what the show flag is. + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager( + InputMethodManager.SHOW_IMPLICIT)).isTrue(), + false /* expected */, + false /* inputViewStarted */); + assertWithMessage("IME is not shown after SHOW_IMPLICIT") + .that(mInputMethodService.isInputViewShown()).isFalse(); - verifyInputViewStatusOnMainSync( - () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - false /* expected */, - false /* inputViewStarted */); - assertWithMessage("IME is not shown after SHOW_EXPLICIT") - .that(mInputMethodService.isInputViewShown()).isFalse(); + verifyInputViewStatusOnMainSync( + () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)) + .isTrue(), + false /* expected */, + false /* inputViewStarted */); + assertWithMessage("IME is not shown after SHOW_EXPLICIT") + .that(mInputMethodService.isInputViewShown()).isFalse(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -509,17 +522,22 @@ public class InputMethodServiceTest { public void testShowSoftInputExplicitly_withHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -535,18 +553,24 @@ public class InputMethodServiceTest { public void testShowSoftInputImplicitly_withHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - false /* expected */, - false /* inputViewStarted */); - assertWithMessage("IME is not shown") - .that(mInputMethodService.isInputViewShown()).isFalse(); + verifyInputViewStatusOnMainSync(() ->assertThat( + mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)) + .isTrue(), + false /* expected */, + false /* inputViewStarted */); + assertWithMessage("IME is not shown") + .that(mInputMethodService.isInputViewShown()).isFalse(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -557,34 +581,37 @@ public class InputMethodServiceTest { public void testShowSoftInputExplicitly_thenConfigurationChanged() { setShowImeWithHardKeyboard(false /* enabled */); - // Start with no hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Start with no hardware keyboard. + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync( - () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + verifyInputViewStatusOnMainSync( + () -> assertThat(mActivity.showImeWithInputMethodManager(0 /* flags */)) + .isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - // Simulate connecting a hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - // Simulate a fake configuration change to avoid triggering the recreation of TestActivity. - mInputMethodService.getResources().getConfiguration().orientation = - Configuration.ORIENTATION_LANDSCAPE; + // Simulate a fake configuration change to avoid the recreation of TestActivity. + config.orientation = Configuration.ORIENTATION_LANDSCAPE; - verifyInputViewStatusOnMainSync(() -> mInputMethodService.onConfigurationChanged( - mInputMethodService.getResources().getConfiguration()), - true /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is still shown after a configuration change") - .that(mInputMethodService.isInputViewShown()).isTrue(); + verifyInputViewStatusOnMainSync( + () -> mInputMethodService.onConfigurationChanged(config), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is still shown after a configuration change") + .that(mInputMethodService.isInputViewShown()).isTrue(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -601,39 +628,43 @@ public class InputMethodServiceTest { public void testShowSoftInputImplicitly_thenConfigurationChanged() { setShowImeWithHardKeyboard(false /* enabled */); - // Start with no hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_NOKEYS; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Start with no hardware keyboard. + config.keyboard = Configuration.KEYBOARD_NOKEYS; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager( + InputMethodManager.SHOW_IMPLICIT)).isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - // Simulate connecting a hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.HARDKEYBOARDHIDDEN_YES; - - // Simulate a fake configuration change to avoid triggering the recreation of TestActivity. - mInputMethodService.getResources().getConfiguration().orientation = - Configuration.ORIENTATION_LANDSCAPE; - - // Normally, IMS#onFinishInputView will be called when finishing the input view by the user. - // But if IMS#hideWindow is called when receiving a new configuration change, we don't - // expect that it's user-driven to finish the lifecycle of input view with - // IMS#onFinishInputView, because the input view will be re-initialized according to the - // last #mShowInputRequested state. So in this case we treat the input view as still alive. - verifyInputViewStatusOnMainSync(() -> mInputMethodService.onConfigurationChanged( - mInputMethodService.getResources().getConfiguration()), - true /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is not shown after a configuration change") - .that(mInputMethodService.isInputViewShown()).isFalse(); + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; + + // Simulate a fake configuration change to avoid the recreation of TestActivity. + config.orientation = Configuration.ORIENTATION_LANDSCAPE; + + // Normally, IMS#onFinishInputView will be called when finishing the input view by + // the user. But if IMS#hideWindow is called when receiving a new configuration change, + // we don't expect that it's user-driven to finish the lifecycle of input view with + // IMS#onFinishInputView, because the input view will be re-initialized according + // to the last #mShowInputRequested state. So in this case we treat the input view as + // still alive. + verifyInputViewStatusOnMainSync( + () -> mInputMethodService.onConfigurationChanged(config), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is not shown after a configuration change") + .that(mInputMethodService.isInputViewShown()).isFalse(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -645,36 +676,42 @@ public class InputMethodServiceTest { public void testShowSoftInputExplicitly_thenShowSoftInputImplicitly_withHardKeyboard() { setShowImeWithHardKeyboard(false /* enabled */); - // Simulate connecting a hardware keyboard. - mInputMethodService.getResources().getConfiguration().keyboard = - Configuration.KEYBOARD_QWERTY; - mInputMethodService.getResources().getConfiguration().hardKeyboardHidden = - Configuration.HARDKEYBOARDHIDDEN_YES; + final var config = mInputMethodService.getResources().getConfiguration(); + final var initialConfig = new Configuration(config); + try { + // Simulate connecting a hardware keyboard. + config.keyboard = Configuration.KEYBOARD_QWERTY; + config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_YES; - // Explicit show request. - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), - true /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); + // Explicit show request. + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager(0 /* flags */)).isTrue(), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is shown").that(mInputMethodService.isInputViewShown()).isTrue(); - // Implicit show request. - verifyInputViewStatusOnMainSync(() -> assertThat( - mActivity.showImeWithInputMethodManager(InputMethodManager.SHOW_IMPLICIT)).isTrue(), - false /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is still shown") - .that(mInputMethodService.isInputViewShown()).isTrue(); + // Implicit show request. + verifyInputViewStatusOnMainSync(() -> assertThat( + mActivity.showImeWithInputMethodManager( + InputMethodManager.SHOW_IMPLICIT)).isTrue(), + false /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is still shown") + .that(mInputMethodService.isInputViewShown()).isTrue(); - // Simulate a fake configuration change to avoid triggering the recreation of TestActivity. - // This should now consider the implicit show request, but keep the state from the - // explicit show request, and thus not hide the IME. - verifyInputViewStatusOnMainSync(() -> mInputMethodService.onConfigurationChanged( - mInputMethodService.getResources().getConfiguration()), - true /* expected */, - true /* inputViewStarted */); - assertWithMessage("IME is still shown after a configuration change") - .that(mInputMethodService.isInputViewShown()).isTrue(); + // Simulate a fake configuration change to avoid the recreation of TestActivity. + // This should now consider the implicit show request, but keep the state from the + // explicit show request, and thus not hide the IME. + verifyInputViewStatusOnMainSync( + () -> mInputMethodService.onConfigurationChanged(config), + true /* expected */, + true /* inputViewStarted */); + assertWithMessage("IME is still shown after a configuration change") + .that(mInputMethodService.isInputViewShown()).isTrue(); + } finally { + mInputMethodService.getResources() + .updateConfiguration(initialConfig, null /* metrics */, null /* compat */); + } } /** @@ -1112,16 +1149,21 @@ public class InputMethodServiceTest { } /** - * Sets the value of show_ime_with_hard_keyboard, only if it is different to the default value. + * Sets the value of {@link Settings.Secure#SHOW_IME_WITH_HARD_KEYBOARD}, only if it is + * different to the current value, and waits for the update to take effect. * - * @param enabled the value to be set. + * @param enable the value to be set. */ - private void setShowImeWithHardKeyboard(boolean enabled) { - if (mShowImeWithHardKeyboardEnabled != enabled) { - executeShellCommand(enabled + private void setShowImeWithHardKeyboard(boolean enable) { + final boolean currentEnabled = + mInputMethodService.getShouldShowImeWithHardKeyboardForTesting(); + if (currentEnabled != enable) { + executeShellCommand(enable ? ENABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD : DISABLE_SHOW_IME_WITH_HARD_KEYBOARD_CMD); - mInstrumentation.waitForIdleSync(); + eventually(() -> assertWithMessage("showImeWithHardKeyboard updated") + .that(mInputMethodService.getShouldShowImeWithHardKeyboardForTesting()) + .isEqualTo(enable)); } } |