From e5f23891c90d9bf0551a1608ea33499cb4f23e44 Mon Sep 17 00:00:00 2001 From: Vaibhav Devmurari Date: Mon, 20 Feb 2023 14:33:19 +0000 Subject: [PATCH] Support different layout for kbd with same Vendor and Product ID Some kbds can have same Product and vendor IDs but different kbd info like language tag and layout type. Need to allow separate configuration for each SKU type. Test: manual Bug: 259530132 Change-Id: I2f2461083e7f4cc8032f95b8883fbff9e62f1943 --- .../server/input/KeyboardLayoutManager.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/input/KeyboardLayoutManager.java b/services/core/java/com/android/server/input/KeyboardLayoutManager.java index 9e8b9f15a7c5d..5358185374e93 100644 --- a/services/core/java/com/android/server/input/KeyboardLayoutManager.java +++ b/services/core/java/com/android/server/input/KeyboardLayoutManager.java @@ -464,7 +464,7 @@ final class KeyboardLayoutManager implements InputManager.InputDeviceListener { return LocaleList.forLanguageTags(languageTags.replace('|', ',')); } - private static String getLayoutDescriptor(@NonNull InputDeviceIdentifier identifier) { + private String getLayoutDescriptor(@NonNull InputDeviceIdentifier identifier) { Objects.requireNonNull(identifier, "identifier must not be null"); Objects.requireNonNull(identifier.getDescriptor(), "descriptor must not be null"); @@ -474,7 +474,21 @@ final class KeyboardLayoutManager implements InputManager.InputDeviceListener { // If vendor id and product id is available, use it as keys. This allows us to have the // same setup for all keyboards with same product and vendor id. i.e. User can swap 2 // identical keyboards and still get the same setup. - return "vendor:" + identifier.getVendorId() + ",product:" + identifier.getProductId(); + StringBuilder key = new StringBuilder(); + key.append("vendor:").append(identifier.getVendorId()).append(",product:").append( + identifier.getProductId()); + + InputDevice inputDevice = getInputDevice(identifier); + Objects.requireNonNull(inputDevice, "Input device must not be null"); + // Some keyboards can have same product ID and vendor ID but different Keyboard info like + // language tag and layout type. + if (!TextUtils.isEmpty(inputDevice.getKeyboardLanguageTag())) { + key.append(",languageTag:").append(inputDevice.getKeyboardLanguageTag()); + } + if (!TextUtils.isEmpty(inputDevice.getKeyboardLayoutType())) { + key.append(",layoutType:").append(inputDevice.getKeyboardLanguageTag()); + } + return key.toString(); } @Nullable @@ -1075,7 +1089,7 @@ final class KeyboardLayoutManager implements InputManager.InputDeviceListener { identifier.getDescriptor()) : null; } - private static String createLayoutKey(InputDeviceIdentifier identifier, int userId, + private String createLayoutKey(InputDeviceIdentifier identifier, int userId, @NonNull InputMethodSubtypeHandle subtypeHandle) { Objects.requireNonNull(subtypeHandle, "subtypeHandle must not be null"); return "layoutDescriptor:" + getLayoutDescriptor(identifier) + ",userId:" + userId