diff options
| author | 2023-01-03 16:46:36 +0000 | |
|---|---|---|
| committer | 2023-01-08 23:25:41 +0000 | |
| commit | 4b033b4b42a6ac491c82134f7b3674a2cf7a61fb (patch) | |
| tree | 3893c0a6e483f618cf753a0170c3a1ab80a42875 | |
| parent | 8178dc203c13389fcfe5d1c838add1f80197aa4c (diff) | |
Flag guard modifier key remapping
Test: atest ModifierKeyRemappingTest
Test: atest KeyRemapperTests
Bug: 252812993
Change-Id: I3b5b071434675cb641d16ec52a9e45fe7d917b3e
| -rw-r--r-- | services/core/java/com/android/server/input/KeyRemapper.java | 19 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt | 86 |
2 files changed, 81 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/input/KeyRemapper.java b/services/core/java/com/android/server/input/KeyRemapper.java index 950e094a205d..7ba77698cb5d 100644 --- a/services/core/java/com/android/server/input/KeyRemapper.java +++ b/services/core/java/com/android/server/input/KeyRemapper.java @@ -21,6 +21,8 @@ import android.hardware.input.InputManager; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.util.ArrayMap; +import android.util.FeatureFlagUtils; import android.view.InputDevice; import com.android.internal.annotations.GuardedBy; @@ -65,16 +67,25 @@ final class KeyRemapper implements InputManager.InputDeviceListener { } public void remapKey(int fromKey, int toKey) { + if (!supportRemapping()) { + return; + } Message msg = Message.obtain(mHandler, MSG_REMAP_KEY, fromKey, toKey); mHandler.sendMessage(msg); } public void clearAllKeyRemappings() { + if (!supportRemapping()) { + return; + } Message msg = Message.obtain(mHandler, MSG_CLEAR_ALL_REMAPPING); mHandler.sendMessage(msg); } public Map<Integer, Integer> getKeyRemapping() { + if (!supportRemapping()) { + return new ArrayMap<>(); + } synchronized (mDataStore) { return mDataStore.getKeyRemapping(); } @@ -124,6 +135,9 @@ final class KeyRemapper implements InputManager.InputDeviceListener { @Override public void onInputDeviceAdded(int deviceId) { + if (!supportRemapping()) { + return; + } InputManager inputManager = Objects.requireNonNull( mContext.getSystemService(InputManager.class)); InputDevice inputDevice = inputManager.getInputDevice(deviceId); @@ -158,4 +172,9 @@ final class KeyRemapper implements InputManager.InputDeviceListener { } return false; } + + private boolean supportRemapping() { + return FeatureFlagUtils.isEnabled(mContext, + FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_MODIFIER_KEY); + } } diff --git a/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt b/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt index c22782c91bdf..705a5da9d60f 100644 --- a/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt +++ b/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt @@ -22,6 +22,7 @@ import android.hardware.input.IInputManager import android.hardware.input.InputManager import android.os.test.TestLooper import android.platform.test.annotations.Presubmit +import android.provider.Settings import android.view.InputDevice import android.view.KeyEvent import androidx.test.core.app.ApplicationProvider @@ -113,38 +114,75 @@ class KeyRemapperTests { } @Test - fun testKeyRemapping() { - val keyboard = createKeyboard(DEVICE_ID) - Mockito.`when`(iInputManager.getInputDevice(DEVICE_ID)).thenReturn(keyboard) - - for (i in REMAPPABLE_KEYS.indices) { - val fromKeyCode = REMAPPABLE_KEYS[i] - val toKeyCode = REMAPPABLE_KEYS[(i + 1) % REMAPPABLE_KEYS.size] - mKeyRemapper.remapKey(fromKeyCode, toKeyCode) + fun testKeyRemapping_whenRemappingEnabled() { + ModifierRemappingFlag(true).use { + val keyboard = createKeyboard(DEVICE_ID) + Mockito.`when`(iInputManager.getInputDevice(DEVICE_ID)).thenReturn(keyboard) + + for (i in REMAPPABLE_KEYS.indices) { + val fromKeyCode = REMAPPABLE_KEYS[i] + val toKeyCode = REMAPPABLE_KEYS[(i + 1) % REMAPPABLE_KEYS.size] + mKeyRemapper.remapKey(fromKeyCode, toKeyCode) + testLooper.dispatchNext() + } + + val remapping = mKeyRemapper.keyRemapping + val expectedSize = REMAPPABLE_KEYS.size + assertEquals("Remapping size should be $expectedSize", expectedSize, remapping.size) + + for (i in REMAPPABLE_KEYS.indices) { + val fromKeyCode = REMAPPABLE_KEYS[i] + val toKeyCode = REMAPPABLE_KEYS[(i + 1) % REMAPPABLE_KEYS.size] + assertEquals( + "Remapping should include mapping from $fromKeyCode to $toKeyCode", + toKeyCode, + remapping.getOrDefault(fromKeyCode, -1) + ) + } + + mKeyRemapper.clearAllKeyRemappings() testLooper.dispatchNext() + + assertEquals( + "Remapping size should be 0 after clearAllModifierKeyRemappings", + 0, + mKeyRemapper.keyRemapping.size + ) } + } - val remapping = mKeyRemapper.keyRemapping - val expectedSize = REMAPPABLE_KEYS.size - assertEquals("Remapping size should be $expectedSize", expectedSize, remapping.size) + @Test + fun testKeyRemapping_whenRemappingDisabled() { + ModifierRemappingFlag(false).use { + val keyboard = createKeyboard(DEVICE_ID) + Mockito.`when`(iInputManager.getInputDevice(DEVICE_ID)).thenReturn(keyboard) + + mKeyRemapper.remapKey(REMAPPABLE_KEYS[0], REMAPPABLE_KEYS[1]) + testLooper.dispatchAll() - for (i in REMAPPABLE_KEYS.indices) { - val fromKeyCode = REMAPPABLE_KEYS[i] - val toKeyCode = REMAPPABLE_KEYS[(i + 1) % REMAPPABLE_KEYS.size] + val remapping = mKeyRemapper.keyRemapping assertEquals( - "Remapping should include mapping from $fromKeyCode to $toKeyCode", - toKeyCode, - remapping.getOrDefault(fromKeyCode, -1) + "Remapping should not be done if modifier key remapping is disabled", + 0, + remapping.size ) } + } - mKeyRemapper.clearAllKeyRemappings() - testLooper.dispatchNext() + private inner class ModifierRemappingFlag constructor(enabled: Boolean) : AutoCloseable { + init { + Settings.Global.putString( + context.contentResolver, + "settings_new_keyboard_modifier_key", enabled.toString() + ) + } - assertEquals( - "Remapping size should be 0 after clearAllModifierKeyRemappings", - 0, - mKeyRemapper.keyRemapping.size - ) + override fun close() { + Settings.Global.putString( + context.contentResolver, + "settings_new_keyboard_modifier_key", + "" + ) + } } }
\ No newline at end of file |