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