Merge "Use native logic to read Ver4 dict."
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
index b31358f..47e9142 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java
@@ -276,9 +276,9 @@
 
             params.mThemeId = keyboardAttr.getInt(R.styleable.Keyboard_themeId, 0);
             params.mIconsSet.loadIcons(keyboardAttr);
-            final String language = params.mId.mLocale.getLanguage();
-            params.mCodesSet.setLanguage(language);
-            params.mTextsSet.setLanguage(language);
+            final Locale locale = params.mId.mLocale;
+            params.mCodesSet.setLocale(locale);
+            params.mTextsSet.setLocale(locale);
             final RunInLocale<Void> job = new RunInLocale<Void>() {
                 @Override
                 protected Void job(final Resources res) {
@@ -287,9 +287,8 @@
                 }
             };
             // Null means the current system locale.
-            final Locale locale = SubtypeLocaleUtils.isNoLanguage(params.mId.mSubtype)
-                    ? null : params.mId.mLocale;
-            job.runInLocale(mResources, locale);
+            job.runInLocale(mResources,
+                    SubtypeLocaleUtils.isNoLanguage(params.mId.mSubtype) ? null : locale);
 
             final int resourceId = keyboardAttr.getResourceId(
                     R.styleable.Keyboard_touchPositionCorrectionData, 0);
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
index aeb4db5..9f873ed 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardCodesSet.java
@@ -18,20 +18,20 @@
 
 import com.android.inputmethod.latin.Constants;
 import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
 import java.util.HashMap;
+import java.util.Locale;
 
 public final class KeyboardCodesSet {
     public static final String PREFIX_CODE = "!code/";
 
-    private static final HashMap<String, int[]> sLanguageToCodesMap = CollectionUtils.newHashMap();
     private static final HashMap<String, Integer> sNameToIdMap = CollectionUtils.newHashMap();
 
     private int[] mCodes = DEFAULT;
 
-    public void setLanguage(final String language) {
-        final int[] codes = sLanguageToCodesMap.get(language);
-        mCodes = (codes != null) ? codes : DEFAULT;
+    public void setLocale(final Locale locale) {
+        mCodes = SubtypeLocaleUtils.isRtlLanguage(locale) ? RTL : DEFAULT;
     }
 
     public int getCode(final String name) {
@@ -134,18 +134,6 @@
         CODE_LEFT_CURLY_BRACKET,
     };
 
-    private static final String LANGUAGE_DEFAULT = "DEFAULT";
-    private static final String LANGUAGE_ARABIC = "ar";
-    private static final String LANGUAGE_PERSIAN = "fa";
-    private static final String LANGUAGE_HEBREW = "iw";
-
-    private static final Object[] LANGUAGE_AND_CODES = {
-        LANGUAGE_DEFAULT, DEFAULT,
-        LANGUAGE_ARABIC, RTL,
-        LANGUAGE_PERSIAN, RTL,
-        LANGUAGE_HEBREW, RTL,
-    };
-
     static {
         if (DEFAULT.length != RTL.length || DEFAULT.length != ID_TO_NAME.length) {
             throw new RuntimeException("Internal inconsistency");
@@ -153,11 +141,5 @@
         for (int i = 0; i < ID_TO_NAME.length; i++) {
             sNameToIdMap.put(ID_TO_NAME[i], i);
         }
-
-        for (int i = 0; i < LANGUAGE_AND_CODES.length; i += 2) {
-            final String language = (String)LANGUAGE_AND_CODES[i];
-            final int[] codes = (int[])LANGUAGE_AND_CODES[i + 1];
-            sLanguageToCodesMap.put(language, codes);
-        }
     }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
index f9f183e..4322345 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.java
@@ -25,6 +25,7 @@
 import com.android.inputmethod.latin.utils.CollectionUtils;
 
 import java.util.HashMap;
+import java.util.Locale;
 
 /**
  * !!!!! DO NOT EDIT THIS FILE !!!!!
@@ -52,15 +53,17 @@
     private static final int MAX_STRING_REFERENCE_INDIRECTION = 10;
 
     // Language to texts map.
-    private static final HashMap<String, String[]> sLocaleToTextsMap = CollectionUtils.newHashMap();
+    private static final HashMap<String, String[]> sLanguageToTextsMap =
+            CollectionUtils.newHashMap();
     private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
 
     private String[] mTexts;
     // Resource name to text map.
     private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
 
-    public void setLanguage(final String language) {
-        mTexts = sLocaleToTextsMap.get(language);
+    public void setLocale(final Locale locale) {
+        final String language = locale.getLanguage();
+        mTexts = sLanguageToTextsMap.get(language);
         if (mTexts == null) {
             mTexts = LANGUAGE_DEFAULT;
         }
@@ -3647,7 +3650,7 @@
         for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
             final String language = (String)LANGUAGES_AND_TEXTS[i];
             final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
-            sLocaleToTextsMap.put(language, texts);
+            sLanguageToTextsMap.put(language, texts);
         }
     }
 }
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
index cb640b3..f0ab7f5 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTestsBase.java
@@ -52,9 +52,8 @@
     protected void setUp() throws Exception {
         super.setUp();
 
-        final String language = TEST_LOCALE.getLanguage();
-        mCodesSet.setLanguage(language);
-        mTextsSet.setLanguage(language);
+        mCodesSet.setLocale(TEST_LOCALE);
+        mTextsSet.setLocale(TEST_LOCALE);
         final Context context = getContext();
         new RunInLocale<Void>() {
             @Override
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
index 5f301a8..42a94f4 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecSplitTests.java
@@ -41,7 +41,7 @@
 
         final Instrumentation instrumentation = getInstrumentation();
         final Context targetContext = instrumentation.getTargetContext();
-        mTextsSet.setLanguage(TEST_LOCALE.getLanguage());
+        mTextsSet.setLocale(TEST_LOCALE);
         new RunInLocale<Void>() {
             @Override
             protected Void job(final Resources res) {
diff --git a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
index db1dde3..7a6284f 100644
--- a/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
+++ b/tools/make-keyboard-text/res/com/android/inputmethod/keyboard/internal/KeyboardTextsSet.tmpl
@@ -25,6 +25,7 @@
 import com.android.inputmethod.latin.utils.CollectionUtils;
 
 import java.util.HashMap;
+import java.util.Locale;
 
 /**
  * !!!!! DO NOT EDIT THIS FILE !!!!!
@@ -52,15 +53,17 @@
     private static final int MAX_STRING_REFERENCE_INDIRECTION = 10;
 
     // Language to texts map.
-    private static final HashMap<String, String[]> sLocaleToTextsMap = CollectionUtils.newHashMap();
+    private static final HashMap<String, String[]> sLanguageToTextsMap =
+            CollectionUtils.newHashMap();
     private static final HashMap<String, Integer> sNameToIdsMap = CollectionUtils.newHashMap();
 
     private String[] mTexts;
     // Resource name to text map.
     private HashMap<String, String> mResourceNameToTextsMap = CollectionUtils.newHashMap();
 
-    public void setLanguage(final String language) {
-        mTexts = sLocaleToTextsMap.get(language);
+    public void setLocale(final Locale locale) {
+        final String language = locale.getLanguage();
+        mTexts = sLanguageToTextsMap.get(language);
         if (mTexts == null) {
             mTexts = LANGUAGE_DEFAULT;
         }
@@ -195,7 +198,7 @@
         for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
             final String language = (String)LANGUAGES_AND_TEXTS[i];
             final String[] texts = (String[])LANGUAGES_AND_TEXTS[i + 1];
-            sLocaleToTextsMap.put(language, texts);
+            sLanguageToTextsMap.put(language, texts);
         }
     }
 }