diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 449801da426cf..96b37bf0b4cb9 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3409,7 +3409,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyEvent.KEYCODE_SPACE: if (down && repeatCount == 0) { // Handle keyboard layout switching. (CTRL + SPACE) - if (KeyEvent.metaStateHasModifiers(metaState, KeyEvent.META_CTRL_ON)) { + if (KeyEvent.metaStateHasModifiers(metaState & ~KeyEvent.META_SHIFT_MASK, + KeyEvent.META_CTRL_ON)) { int direction = (metaState & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1; mWindowManagerFuncs.switchKeyboardLayout(event.getDeviceId(), direction); return true; diff --git a/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java b/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java index 369e8f14ff743..3ecbbfeed254a 100644 --- a/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/ModifierShortcutTests.java @@ -27,6 +27,7 @@ import static android.view.KeyEvent.KEYCODE_META_LEFT; import static android.view.KeyEvent.KEYCODE_N; import static android.view.KeyEvent.KEYCODE_P; import static android.view.KeyEvent.KEYCODE_S; +import static android.view.KeyEvent.KEYCODE_SHIFT_LEFT; import static android.view.KeyEvent.KEYCODE_SLASH; import static android.view.KeyEvent.KEYCODE_SPACE; import static android.view.KeyEvent.KEYCODE_TAB; @@ -35,10 +36,15 @@ import static android.view.KeyEvent.KEYCODE_Z; import android.content.Intent; import android.os.RemoteException; +import android.platform.test.annotations.Presubmit; import android.util.SparseArray; +import androidx.test.filters.SmallTest; + import org.junit.Test; +@Presubmit +@SmallTest public class ModifierShortcutTests extends ShortcutKeyTestBase { private static final SparseArray META_SHORTCUTS = new SparseArray<>(); static { @@ -82,7 +88,16 @@ public class ModifierShortcutTests extends ShortcutKeyTestBase { @Test public void testCtrlSpace() { sendKeyCombination(new int[]{KEYCODE_CTRL_LEFT, KEYCODE_SPACE}, 0); - mPhoneWindowManager.assertSwitchKeyboardLayout(); + mPhoneWindowManager.assertSwitchKeyboardLayout(1); + } + + /** + * CTRL + SHIFT + SPACE to switch keyboard layout backwards. + */ + @Test + public void testCtrlShiftSpace() { + sendKeyCombination(new int[]{KEYCODE_CTRL_LEFT, KEYCODE_SHIFT_LEFT, KEYCODE_SPACE}, 0); + mPhoneWindowManager.assertSwitchKeyboardLayout(-1); } /** @@ -91,7 +106,16 @@ public class ModifierShortcutTests extends ShortcutKeyTestBase { @Test public void testMetaSpace() { sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_SPACE}, 0); - mPhoneWindowManager.assertSwitchKeyboardLayout(); + mPhoneWindowManager.assertSwitchKeyboardLayout(1); + } + + /** + * META + SHIFT + SPACE to switch keyboard layout backwards. + */ + @Test + public void testMetaShiftSpace() { + sendKeyCombination(new int[]{KEYCODE_META_LEFT, KEYCODE_SHIFT_LEFT, KEYCODE_SPACE}, 0); + mPhoneWindowManager.assertSwitchKeyboardLayout(-1); } /** diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index 6e7e005fc0a38..6da9d0c606cff 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -415,9 +415,9 @@ class TestPhoneWindowManager { verify(mStatusBarManagerInternal).showRecentApps(anyBoolean()); } - void assertSwitchKeyboardLayout() { + void assertSwitchKeyboardLayout(int direction) { waitForIdle(); - verify(mWindowManagerFuncsImpl).switchKeyboardLayout(anyInt(), anyInt()); + verify(mWindowManagerFuncsImpl).switchKeyboardLayout(anyInt(), eq(direction)); } void assertTakeBugreport() {