summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vaibhav Devmurari <vdevmurari@google.com> 2023-01-03 16:46:36 +0000
committer Vaibhav Devmurari <vdevmurari@google.com> 2023-01-08 23:25:41 +0000
commit4b033b4b42a6ac491c82134f7b3674a2cf7a61fb (patch)
tree3893c0a6e483f618cf753a0170c3a1ab80a42875
parent8178dc203c13389fcfe5d1c838add1f80197aa4c (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.java19
-rw-r--r--services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt86
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