Loading core/java/com/android/internal/inputmethod/InputMethodUtils.java +18 −0 Original line number Diff line number Diff line Loading @@ -793,6 +793,24 @@ public class InputMethodUtils { return imeMap; } @NonNull public static String buildInputMethodsAndSubtypesString( @NonNull final ArrayMap<String, ArraySet<String>> map) { // we want to use the canonical InputMethodSettings implementation, // so we convert data structures first. List<Pair<String, ArrayList<String>>> imeMap = new ArrayList<>(4); for (ArrayMap.Entry<String, ArraySet<String>> entry : map.entrySet()) { final String imeName = entry.getKey(); final ArraySet<String> subtypeSet = entry.getValue(); final ArrayList<String> subtypes = new ArrayList<>(2); if (subtypeSet != null) { subtypes.addAll(subtypeSet); } imeMap.add(new Pair<>(imeName, subtypes)); } return InputMethodSettings.buildInputMethodsSettingString(imeMap); } /** * Utility class for putting and getting settings for InputMethod * TODO: Move all putters and getters of settings to this class. Loading core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java +116 −0 Original line number Diff line number Diff line Loading @@ -1075,4 +1075,120 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { assertTrue(subtypes2.isEmpty()); } } @SmallTest public void testbuildInputMethodsAndSubtypesString() { { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); assertEquals("", InputMethodUtils.buildInputMethodsAndSubtypesString(map)); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); map.put("ime0", new ArraySet<String>()); assertEquals("ime0", InputMethodUtils.buildInputMethodsAndSubtypesString(map)); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); map.put("ime0", subtypes1); assertEquals("ime0;subtype0", InputMethodUtils.buildInputMethodsAndSubtypesString(map)); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); subtypes1.add("subtype1"); map.put("ime0", subtypes1); // We do not expect what order will be used to concatenate items in // InputMethodUtils.buildInputMethodsAndSubtypesString() hence enumerate all possible // permutations here. ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0;subtype1"); validSequences.add("ime0;subtype1;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); map.put("ime0", new ArraySet<String>()); map.put("ime1", new ArraySet<String>()); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0:ime1"); validSequences.add("ime1:ime0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); map.put("ime0", subtypes1); map.put("ime1", new ArraySet<String>()); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0:ime1"); validSequences.add("ime1;ime0;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); subtypes1.add("subtype1"); map.put("ime0", subtypes1); map.put("ime1", new ArraySet<String>()); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0;subtype1:ime1"); validSequences.add("ime0;subtype1;subtype0:ime1"); validSequences.add("ime1:ime0;subtype0;subtype1"); validSequences.add("ime1:ime0;subtype1;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); map.put("ime0", subtypes1); ArraySet<String> subtypes2 = new ArraySet<>(); subtypes2.add("subtype1"); map.put("ime1", subtypes2); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0:ime1;subtype1"); validSequences.add("ime1;subtype1:ime0;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); subtypes1.add("subtype1"); map.put("ime0", subtypes1); ArraySet<String> subtypes2 = new ArraySet<>(); subtypes2.add("subtype2"); subtypes2.add("subtype3"); map.put("ime1", subtypes2); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0;subtype1:ime1;subtype2;subtype3"); validSequences.add("ime0;subtype1;subtype0:ime1;subtype2;subtype3"); validSequences.add("ime0;subtype0;subtype1:ime1;subtype3;subtype2"); validSequences.add("ime0;subtype1;subtype0:ime1;subtype3;subtype2"); validSequences.add("ime1;subtype2;subtype3:ime0;subtype0;subtype1"); validSequences.add("ime2;subtype3;subtype2:ime0;subtype0;subtype1"); validSequences.add("ime3;subtype2;subtype3:ime0;subtype1;subtype0"); validSequences.add("ime4;subtype3;subtype2:ime0;subtype1;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } } } services/core/java/com/android/server/InputMethodManagerService.java +2 −18 Original line number Diff line number Diff line Loading @@ -541,7 +541,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub prevSubtypes.addAll(entry.getValue()); } final String mergedImesAndSubtypesString = buildInputMethodsAndSubtypesString(prevMap); final String mergedImesAndSubtypesString = InputMethodUtils.buildInputMethodsAndSubtypesString(prevMap); if (DEBUG_RESTORE) { Slog.i(TAG, "Merged IME string:"); Slog.i(TAG, " " + mergedImesAndSubtypesString); Loading @@ -550,23 +551,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub Settings.Secure.ENABLED_INPUT_METHODS, mergedImesAndSubtypesString); } // TODO: Move this method to InputMethodUtils with adding unit tests. static String buildInputMethodsAndSubtypesString(ArrayMap<String, ArraySet<String>> map) { // we want to use the canonical InputMethodSettings implementation, // so we convert data structures first. List<Pair<String, ArrayList<String>>> imeMap = new ArrayList<>(4); for (ArrayMap.Entry<String, ArraySet<String>> entry : map.entrySet()) { final String imeName = entry.getKey(); final ArraySet<String> subtypeSet = entry.getValue(); final ArrayList<String> subtypes = new ArrayList<>(2); if (subtypeSet != null) { subtypes.addAll(subtypeSet); } imeMap.add(new Pair<>(imeName, subtypes)); } return InputMethodSettings.buildInputMethodsSettingString(imeMap); } class MyPackageMonitor extends PackageMonitor { private boolean isChangingPackagesOfCurrentUser() { final int userId = getChangingUserId(); Loading Loading
core/java/com/android/internal/inputmethod/InputMethodUtils.java +18 −0 Original line number Diff line number Diff line Loading @@ -793,6 +793,24 @@ public class InputMethodUtils { return imeMap; } @NonNull public static String buildInputMethodsAndSubtypesString( @NonNull final ArrayMap<String, ArraySet<String>> map) { // we want to use the canonical InputMethodSettings implementation, // so we convert data structures first. List<Pair<String, ArrayList<String>>> imeMap = new ArrayList<>(4); for (ArrayMap.Entry<String, ArraySet<String>> entry : map.entrySet()) { final String imeName = entry.getKey(); final ArraySet<String> subtypeSet = entry.getValue(); final ArrayList<String> subtypes = new ArrayList<>(2); if (subtypeSet != null) { subtypes.addAll(subtypeSet); } imeMap.add(new Pair<>(imeName, subtypes)); } return InputMethodSettings.buildInputMethodsSettingString(imeMap); } /** * Utility class for putting and getting settings for InputMethod * TODO: Move all putters and getters of settings to this class. Loading
core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java +116 −0 Original line number Diff line number Diff line Loading @@ -1075,4 +1075,120 @@ public class InputMethodUtilsTest extends InstrumentationTestCase { assertTrue(subtypes2.isEmpty()); } } @SmallTest public void testbuildInputMethodsAndSubtypesString() { { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); assertEquals("", InputMethodUtils.buildInputMethodsAndSubtypesString(map)); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); map.put("ime0", new ArraySet<String>()); assertEquals("ime0", InputMethodUtils.buildInputMethodsAndSubtypesString(map)); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); map.put("ime0", subtypes1); assertEquals("ime0;subtype0", InputMethodUtils.buildInputMethodsAndSubtypesString(map)); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); subtypes1.add("subtype1"); map.put("ime0", subtypes1); // We do not expect what order will be used to concatenate items in // InputMethodUtils.buildInputMethodsAndSubtypesString() hence enumerate all possible // permutations here. ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0;subtype1"); validSequences.add("ime0;subtype1;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); map.put("ime0", new ArraySet<String>()); map.put("ime1", new ArraySet<String>()); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0:ime1"); validSequences.add("ime1:ime0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); map.put("ime0", subtypes1); map.put("ime1", new ArraySet<String>()); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0:ime1"); validSequences.add("ime1;ime0;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); subtypes1.add("subtype1"); map.put("ime0", subtypes1); map.put("ime1", new ArraySet<String>()); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0;subtype1:ime1"); validSequences.add("ime0;subtype1;subtype0:ime1"); validSequences.add("ime1:ime0;subtype0;subtype1"); validSequences.add("ime1:ime0;subtype1;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); map.put("ime0", subtypes1); ArraySet<String> subtypes2 = new ArraySet<>(); subtypes2.add("subtype1"); map.put("ime1", subtypes2); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0:ime1;subtype1"); validSequences.add("ime1;subtype1:ime0;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } { ArrayMap<String, ArraySet<String>> map = new ArrayMap<>(); ArraySet<String> subtypes1 = new ArraySet<>(); subtypes1.add("subtype0"); subtypes1.add("subtype1"); map.put("ime0", subtypes1); ArraySet<String> subtypes2 = new ArraySet<>(); subtypes2.add("subtype2"); subtypes2.add("subtype3"); map.put("ime1", subtypes2); ArraySet<String> validSequences = new ArraySet<>(); validSequences.add("ime0;subtype0;subtype1:ime1;subtype2;subtype3"); validSequences.add("ime0;subtype1;subtype0:ime1;subtype2;subtype3"); validSequences.add("ime0;subtype0;subtype1:ime1;subtype3;subtype2"); validSequences.add("ime0;subtype1;subtype0:ime1;subtype3;subtype2"); validSequences.add("ime1;subtype2;subtype3:ime0;subtype0;subtype1"); validSequences.add("ime2;subtype3;subtype2:ime0;subtype0;subtype1"); validSequences.add("ime3;subtype2;subtype3:ime0;subtype1;subtype0"); validSequences.add("ime4;subtype3;subtype2:ime0;subtype1;subtype0"); assertTrue(validSequences.contains( InputMethodUtils.buildInputMethodsAndSubtypesString(map))); } } }
services/core/java/com/android/server/InputMethodManagerService.java +2 −18 Original line number Diff line number Diff line Loading @@ -541,7 +541,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub prevSubtypes.addAll(entry.getValue()); } final String mergedImesAndSubtypesString = buildInputMethodsAndSubtypesString(prevMap); final String mergedImesAndSubtypesString = InputMethodUtils.buildInputMethodsAndSubtypesString(prevMap); if (DEBUG_RESTORE) { Slog.i(TAG, "Merged IME string:"); Slog.i(TAG, " " + mergedImesAndSubtypesString); Loading @@ -550,23 +551,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub Settings.Secure.ENABLED_INPUT_METHODS, mergedImesAndSubtypesString); } // TODO: Move this method to InputMethodUtils with adding unit tests. static String buildInputMethodsAndSubtypesString(ArrayMap<String, ArraySet<String>> map) { // we want to use the canonical InputMethodSettings implementation, // so we convert data structures first. List<Pair<String, ArrayList<String>>> imeMap = new ArrayList<>(4); for (ArrayMap.Entry<String, ArraySet<String>> entry : map.entrySet()) { final String imeName = entry.getKey(); final ArraySet<String> subtypeSet = entry.getValue(); final ArrayList<String> subtypes = new ArrayList<>(2); if (subtypeSet != null) { subtypes.addAll(subtypeSet); } imeMap.add(new Pair<>(imeName, subtypes)); } return InputMethodSettings.buildInputMethodsSettingString(imeMap); } class MyPackageMonitor extends PackageMonitor { private boolean isChangingPackagesOfCurrentUser() { final int userId = getChangingUserId(); Loading