Ignore unknown keyboard layout safely

Bug: 6393755
Change-Id: I3a74b23f934cd52925026ad04647cc76de92ee07
diff --git a/java/src/com/android/inputmethod/latin/AdditionalSubtype.java b/java/src/com/android/inputmethod/latin/AdditionalSubtype.java
index 458d9ee..b9023ae 100644
--- a/java/src/com/android/inputmethod/latin/AdditionalSubtype.java
+++ b/java/src/com/android/inputmethod/latin/AdditionalSubtype.java
@@ -22,6 +22,7 @@
 
 import android.view.inputmethod.InputMethodSubtype;
 
+import java.util.ArrayList;
 
 public class AdditionalSubtype {
 
@@ -41,9 +42,8 @@
         final String layoutExtraValue = KEYBOARD_LAYOUT_SET + "=" + keyboardLayoutSetName;
         final String filteredExtraValue = StringUtils.appendToCsvIfNotExists(
                 IS_ADDITIONAL_SUBTYPE, extraValue);
-        Integer nameId = SubtypeLocale.getSubtypeNameIdFromKeyboardLayoutName(
+        final int nameId = SubtypeLocale.getSubtypeNameIdFromKeyboardLayoutName(
                 keyboardLayoutSetName);
-        if (nameId == null) nameId = R.string.subtype_generic;
         return new InputMethodSubtype(nameId, R.drawable.ic_subtype_keyboard,
                 localeString, KEYBOARD_MODE,
                 layoutExtraValue + "," + filteredExtraValue, false, false);
@@ -74,10 +74,17 @@
 
     public static InputMethodSubtype[] createAdditionalSubtypesArray(String prefSubtypes) {
         final String[] prefSubtypeArray = prefSubtypes.split(PREF_SUBTYPE_SEPARATOR);
-        final InputMethodSubtype[] subtypesArray = new InputMethodSubtype[prefSubtypeArray.length];
+        final ArrayList<InputMethodSubtype> subtypesList =
+                new ArrayList<InputMethodSubtype>(prefSubtypeArray.length);
         for (int i = 0; i < prefSubtypeArray.length; i++) {
-            subtypesArray[i] = createAdditionalSubtype(prefSubtypeArray[i]);
+            final InputMethodSubtype subtype = createAdditionalSubtype(prefSubtypeArray[i]);
+            if (subtype.getNameResId() == SubtypeLocale.UNKNOWN_KEYBOARD_LAYOUT) {
+                // Skip unknown keyboard layout subtype. This may happen when predefined keyboard
+                // layout has been removed.
+                continue;
+            }
+            subtypesList.add(subtype);
         }
-        return subtypesArray;
+        return subtypesList.toArray(new InputMethodSubtype[subtypesList.size()]);
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
index 994b917..7d7f730 100644
--- a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
+++ b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
@@ -348,11 +348,9 @@
     private void setPrefSubtypes(String prefSubtypes, Context context) {
         final PreferenceGroup group = mSubtypePrefGroup;
         group.removeAll();
-        final String[] prefSubtypeArray = prefSubtypes.split(
-                AdditionalSubtype.PREF_SUBTYPE_SEPARATOR);
-        for (final String prefSubtype : prefSubtypeArray) {
-            final InputMethodSubtype subtype =
-                    AdditionalSubtype.createAdditionalSubtype(prefSubtype);
+        final InputMethodSubtype[] subtypesArray =
+                AdditionalSubtype.createAdditionalSubtypesArray(prefSubtypes);
+        for (final InputMethodSubtype subtype : subtypesArray) {
             final SubtypePreference pref = new SubtypePreference(
                     context, subtype, mSubtypeProxy);
             group.addPreference(pref);
diff --git a/java/src/com/android/inputmethod/latin/SubtypeLocale.java b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
index 33ad23a..88d3c3f 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeLocale.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeLocale.java
@@ -36,6 +36,8 @@
 
     public static final String QWERTY = "qwerty";
 
+    public static final int UNKNOWN_KEYBOARD_LAYOUT = R.string.subtype_generic;
+
     private static String[] sPredefinedKeyboardLayoutSet;
     // Keyboard layout to its display name map.
     private static final HashMap<String, String> sKeyboardKayoutToDisplayNameMap =
@@ -81,7 +83,8 @@
     }
 
     public static int getSubtypeNameIdFromKeyboardLayoutName(String keyboardLayoutName) {
-        return sKeyboardLayoutToNameIdsMap.get(keyboardLayoutName);
+        final Integer nameId = sKeyboardLayoutToNameIdsMap.get(keyboardLayoutName);
+        return nameId == null ? UNKNOWN_KEYBOARD_LAYOUT : nameId;
     }
 
     // Get InputMethodSubtype's display name in its locale.