Merge "Add language suffix to main dictionary"
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index 573ec68..4ec1843 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -275,10 +275,11 @@
             <flag name="alignLeft" value="0x01" />
             <flag name="alignRight" value="0x02" />
             <flag name="alignLeftOfCenter" value="0x08" />
-            <flag name="largeLetter" value="0x10" />
-            <flag name="fontNormal" value="0x20" />
-            <flag name="fontMonoSpace" value="0x40" />
+            <flag name="fontNormal" value="0x10" />
+            <flag name="fontMonoSpace" value="0x20" />
+            <flag name="followKeyLargeLetterRatio" value="0x40" />
             <flag name="followKeyLetterRatio" value="0x80" />
+            <flag name="followKeyLabelRatio" value="0xC0" />
             <flag name="followKeyHintLabelRatio" value="0x100" />
             <flag name="hasPopupHint" value="0x200" />
             <flag name="hasShiftedLetterHint" value="0x400" />
diff --git a/java/res/xml/key_styles_enter.xml b/java/res/xml/key_styles_enter.xml
index 04bd80d..f4c7ad4 100644
--- a/java/res/xml/key_styles_enter.xml
+++ b/java/res/xml/key_styles_enter.xml
@@ -94,7 +94,7 @@
         latin:styleName="defaultEnterKeyStyle"
         latin:code="!code/key_enter"
         latin:keyIcon="iconReturnKey"
-        latin:keyLabelFlags="autoXScale|preserveCase"
+        latin:keyLabelFlags="autoXScale|preserveCase|followKeyLabelRatio"
         latin:keyActionFlags="noKeyPreview"
         latin:backgroundType="functional"
         latin:parentStyle="navigateMoreKeysStyle" />
diff --git a/java/res/xml/key_styles_number.xml b/java/res/xml/key_styles_number.xml
index d796b92..16cfa84 100644
--- a/java/res/xml/key_styles_number.xml
+++ b/java/res/xml/key_styles_number.xml
@@ -26,7 +26,7 @@
         latin:keyActionFlags="noKeyPreview" />
     <key-style
         latin:styleName="numKeyStyle"
-        latin:keyLabelFlags="largeLetter|followKeyLetterRatio"
+        latin:keyLabelFlags="followKeyLargeLetterRatio"
         latin:parentStyle="numKeyBaseStyle" />
     <key-style
         latin:styleName="numModeKeyStyle"
@@ -34,7 +34,7 @@
         latin:parentStyle="numKeyBaseStyle" />
     <key-style
         latin:styleName="numFunctionalKeyStyle"
-        latin:keyLabelFlags="largeLetter|followKeyLetterRatio"
+        latin:keyLabelFlags="followKeyLargeLetterRatio"
         latin:backgroundType="functional"
         latin:parentStyle="numKeyBaseStyle" />
     <key-style
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 254d2d6..fa7ec5c 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -60,10 +60,12 @@
     private static final int LABEL_FLAGS_ALIGN_LEFT = 0x01;
     private static final int LABEL_FLAGS_ALIGN_RIGHT = 0x02;
     private static final int LABEL_FLAGS_ALIGN_LEFT_OF_CENTER = 0x08;
-    private static final int LABEL_FLAGS_LARGE_LETTER = 0x10;
-    private static final int LABEL_FLAGS_FONT_NORMAL = 0x20;
-    private static final int LABEL_FLAGS_FONT_MONO_SPACE = 0x40;
-    public static final int LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO = 0x80;
+    private static final int LABEL_FLAGS_FONT_NORMAL = 0x10;
+    private static final int LABEL_FLAGS_FONT_MONO_SPACE = 0x20;
+    private static final int LABEL_FLAGS_FOLLOW_KEY_RATIO_MASK = 0x1C0;
+    private static final int LABEL_FLAGS_FOLLOW_KEY_LARGE_LETTER_RATIO = 0x40;
+    private static final int LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO = 0x80;
+    private static final int LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO = 0xC0;
     private static final int LABEL_FLAGS_FOLLOW_KEY_HINT_LABEL_RATIO = 0x100;
     private static final int LABEL_FLAGS_HAS_POPUP_HINT = 0x200;
     private static final int LABEL_FLAGS_HAS_SHIFTED_LETTER_HINT = 0x400;
@@ -498,16 +500,17 @@
     }
 
     public int selectTextSize(int letter, int largeLetter, int label, int hintLabel) {
-        if (StringUtils.codePointCount(mLabel) > 1
-                && (mLabelFlags & (LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO
-                        | LABEL_FLAGS_FOLLOW_KEY_HINT_LABEL_RATIO)) == 0) {
-            return label;
-        } else if ((mLabelFlags & LABEL_FLAGS_FOLLOW_KEY_HINT_LABEL_RATIO) != 0) {
-            return hintLabel;
-        } else if ((mLabelFlags & LABEL_FLAGS_LARGE_LETTER) != 0) {
+        switch (mLabelFlags & LABEL_FLAGS_FOLLOW_KEY_RATIO_MASK) {
+        case LABEL_FLAGS_FOLLOW_KEY_LARGE_LETTER_RATIO:
             return largeLetter;
-        } else {
+        case LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO:
             return letter;
+        case LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO:
+            return label;
+        case LABEL_FLAGS_FOLLOW_KEY_HINT_LABEL_RATIO:
+            return hintLabel;
+        default: // No follow key ratio flag specified.
+            return StringUtils.codePointCount(mLabel) == 1 ? letter : label;
         }
     }
 
@@ -563,6 +566,12 @@
         return (mMoreKeysColumnAndFlags & MORE_KEYS_FLAGS_HAS_LABELS) != 0;
     }
 
+    public int getMoreKeyLabelFlags() {
+        return hasLabelsInMoreKeys()
+                ? LABEL_FLAGS_FOLLOW_KEY_LABEL_RATIO
+                : LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO;
+    }
+
     public boolean needsDividersInMoreKeys() {
         return (mMoreKeysColumnAndFlags & MORE_KEYS_FLAGS_NEEDS_DIVIDERS) != 0;
     }
diff --git a/java/src/com/android/inputmethod/keyboard/Keyboard.java b/java/src/com/android/inputmethod/keyboard/Keyboard.java
index 4018d65..58225e9 100644
--- a/java/src/com/android/inputmethod/keyboard/Keyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/Keyboard.java
@@ -32,7 +32,9 @@
 import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
 import com.android.inputmethod.keyboard.internal.KeyboardLabelsSet;
 import com.android.inputmethod.latin.LatinImeLogger;
+import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
 import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.SubtypeLocale;
 import com.android.inputmethod.latin.Utils;
 import com.android.inputmethod.latin.XmlParseUtils;
 
@@ -44,6 +46,7 @@
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Locale;
 
 /**
  * Loads an XML description of a keyboard and stores the attributes of the keys. A keyboard
@@ -782,7 +785,17 @@
                 final String language = params.mId.mLocale.getLanguage();
                 params.mCodesSet.setLanguage(language);
                 params.mLabelsSet.setLanguage(language);
-                params.mLabelsSet.loadStringResources(mContext);
+                final RunInLocale<Void> job = new RunInLocale<Void>() {
+                    @Override
+                    protected Void job(Resources res) {
+                        params.mLabelsSet.loadStringResources(mContext);
+                        return null;
+                    }
+                };
+                // Null means the current system locale.
+                final Locale locale = language.equals(SubtypeLocale.NO_LANGUAGE)
+                        ? null : params.mId.mLocale;
+                job.runInLocale(mResources, locale);
 
                 final int resourceId = keyboardAttr.getResourceId(
                         R.styleable.Keyboard_touchPositionCorrectionData, 0);
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
index c8ec3a4..803a294 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardLayoutSet.java
@@ -29,12 +29,10 @@
 
 import com.android.inputmethod.compat.EditorInfoCompatUtils;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet.Params.ElementParams;
-import com.android.inputmethod.keyboard.internal.KeySpecParser;
 import com.android.inputmethod.latin.InputTypeUtils;
 import com.android.inputmethod.latin.LatinIME;
 import com.android.inputmethod.latin.LatinImeLogger;
 import com.android.inputmethod.latin.LocaleUtils;
-import com.android.inputmethod.latin.LocaleUtils.RunInLocale;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.StringUtils;
 import com.android.inputmethod.latin.SubtypeLocale;
@@ -183,14 +181,7 @@
                 builder.setAutoGenerate(sKeysCache);
             }
             final int keyboardXmlId = elementParams.mKeyboardXmlId;
-            final RunInLocale<Void> job = new RunInLocale<Void>() {
-                @Override
-                protected Void job(Resources res) {
-                    builder.load(keyboardXmlId, id);
-                    return null;
-                }
-            };
-            job.runInLocale(context.getResources(), id.mLocale);
+            builder.load(keyboardXmlId, id);
             builder.setTouchPositionCorrectionEnabled(mParams.mTouchPositionCorrectionEnabled);
             builder.setProximityCharsCorrectionEnabled(
                     elementParams.mProximityCharsCorrectionEnabled);
@@ -321,18 +312,11 @@
                     R.xml.keyboard_layout_set_qwerty);
             final String keyboardLayoutSetName = mParams.mKeyboardLayoutSetName;
             final int xmlId = mResources.getIdentifier(keyboardLayoutSetName, "xml", packageName);
-            final RunInLocale<Void> job = new RunInLocale<Void>() {
-                @Override
-                protected Void job(Resources res) {
-                    try {
-                        parseKeyboardLayoutSet(res, xmlId);
-                    } catch (Exception e) {
-                        throw new RuntimeException(e.getMessage() + " in " + keyboardLayoutSetName);
-                    }
-                    return null;
-                }
-            };
-            job.runInLocale(mResources, mParams.mLocale);
+            try {
+                parseKeyboardLayoutSet(mResources, xmlId);
+            } catch (Exception e) {
+                throw new RuntimeException(e.getMessage() + " in " + keyboardLayoutSetName);
+            }
             return new KeyboardLayoutSet(mContext, mParams);
         }
 
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
index f8682d8..7154086 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboard.java
@@ -332,10 +332,7 @@
         @Override
         public MoreKeysKeyboard build() {
             final MoreKeysKeyboardParams params = mParams;
-            // moreKeyFlags == 0 means that the rendered text size will be determined by its
-            // label's code point count.
-            final int moreKeyFlags = mParentKey.hasLabelsInMoreKeys() ? 0
-                    : Key.LABEL_FLAGS_FOLLOW_KEY_LETTER_RATIO;
+            final int moreKeyFlags = mParentKey.getMoreKeyLabelFlags();
             final MoreKeySpec[] moreKeys = mParentKey.mMoreKeys;
             for (int n = 0; n < moreKeys.length; n++) {
                 final MoreKeySpec moreKeySpec = moreKeys[n];