merge in jb-release history after reset to jb-dev
diff --git a/java/res/values-ms/strings.xml b/java/res/values-ms/strings.xml
index 4ba3159..2d6872e 100644
--- a/java/res/values-ms/strings.xml
+++ b/java/res/values-ms/strings.xml
@@ -120,16 +120,11 @@
     <string name="subtype_en_US" msgid="6160452336634534239">"Bahasa Inggeris (AS)"</string>
     <string name="subtype_no_language" msgid="141420857808801746">"Tiada bahasa"</string>
     <string name="subtype_no_language_qwerty" msgid="2956121451616633133">"Tiada bahasa (QWERTY)"</string>
-    <!-- no translation found for subtype_no_language_qwertz (1177848172397202890) -->
-    <skip />
-    <!-- no translation found for subtype_no_language_azerty (8721460968141187394) -->
-    <skip />
-    <!-- no translation found for subtype_no_language_dvorak (3122976737669823935) -->
-    <skip />
-    <!-- no translation found for subtype_no_language_colemak (4205992994906097244) -->
-    <skip />
-    <!-- no translation found for subtype_no_language_pcqwerty (8840928374394180189) -->
-    <skip />
+    <string name="subtype_no_language_qwertz" msgid="1177848172397202890">"Tiada bahasa (QWERTZ)"</string>
+    <string name="subtype_no_language_azerty" msgid="8721460968141187394">"Tiada bahasa (AZERTY)"</string>
+    <string name="subtype_no_language_dvorak" msgid="3122976737669823935">"Tiada bahasa (Dvorak)"</string>
+    <string name="subtype_no_language_colemak" msgid="4205992994906097244">"Tiada bahasa (Colemak)"</string>
+    <string name="subtype_no_language_pcqwerty" msgid="8840928374394180189">"Tiada bahasa (PC)"</string>
     <string name="custom_input_styles_title" msgid="8429952441821251512">"Gaya input peribadi"</string>
     <string name="add_style" msgid="6163126614514489951">"Tambah gaya"</string>
     <string name="add" msgid="8299699805688017798">"Tambah"</string>
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 7efdef9..7232a48 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -93,6 +93,9 @@
     private static final int QUICK_PRESS = 200;
 
     private static final int PENDING_IMS_CALLBACK_DURATION = 800;
+    // TODO: remove this
+    private static final boolean WORKAROUND_USE_LAST_BACKING_HEIGHT_WHEN_NOT_READY = true;
+    private static int sLastBackingHeight = 0;
 
     /**
      * The name of the scheme used by the Package Manager to warn of a new package installation,
@@ -933,8 +936,15 @@
         // be considered.
         // See {@link android.inputmethodservice.InputMethodService#onComputeInsets}.
         final int extractHeight = isFullscreenMode() ? mExtractArea.getHeight() : 0;
-        final int backingHeight = (mKeyPreviewBackingView.getVisibility() == View.GONE) ? 0
-                : mKeyPreviewBackingView.getHeight();
+        final boolean backingGone = mKeyPreviewBackingView.getVisibility() == View.GONE;
+        int backingHeight = backingGone ? 0 : mKeyPreviewBackingView.getHeight();
+        if (WORKAROUND_USE_LAST_BACKING_HEIGHT_WHEN_NOT_READY && !backingGone) {
+            if (backingHeight <= 0) {
+                backingHeight = sLastBackingHeight;
+            } else {
+                sLastBackingHeight = backingHeight;
+            }
+        }
         final int suggestionsHeight = (mSuggestionsContainer.getVisibility() == View.GONE) ? 0
                 : mSuggestionsContainer.getHeight();
         final int extraHeight = extractHeight + backingHeight + suggestionsHeight;
@@ -954,6 +964,11 @@
         }
         outInsets.contentTopInsets = touchY;
         outInsets.visibleTopInsets = touchY;
+        if (WORKAROUND_USE_LAST_BACKING_HEIGHT_WHEN_NOT_READY) {
+            if (LatinImeLogger.sDBG) {
+                Log.i(TAG, "--- insets: " + touchY + "," + backingHeight + "," + suggestionsHeight);
+            }
+        }
     }
 
     @Override
diff --git a/native/jni/src/bigram_dictionary.cpp b/native/jni/src/bigram_dictionary.cpp
index e05e9d6..67f9628 100644
--- a/native/jni/src/bigram_dictionary.cpp
+++ b/native/jni/src/bigram_dictionary.cpp
@@ -135,6 +135,7 @@
 // If the word is not found or has no bigrams, this function returns 0.
 int BigramDictionary::getBigramListPositionForWord(const int32_t *prevWord,
         const int prevWordLength) {
+    if (0 >= prevWordLength) return 0;
     const uint8_t* const root = DICT;
     int pos = BinaryFormat::getTerminalPosition(root, prevWord, prevWordLength);
 
@@ -152,6 +153,22 @@
     return pos;
 }
 
+void BigramDictionary::fillBigramAddressToFrequencyMap(const int32_t *prevWord,
+        const int prevWordLength, std::map<int, int> *map) {
+    const uint8_t* const root = DICT;
+    int pos = getBigramListPositionForWord(prevWord, prevWordLength);
+    if (0 == pos) return;
+
+    int bigramFlags;
+    do {
+        bigramFlags = BinaryFormat::getFlagsAndForwardPointer(root, &pos);
+        const int frequency = UnigramDictionary::MASK_ATTRIBUTE_FREQUENCY & bigramFlags;
+        const int bigramPos = BinaryFormat::getAttributeAddressAndForwardPointer(root, bigramFlags,
+                &pos);
+        (*map)[bigramPos] = frequency;
+    } while (0 != (UnigramDictionary::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags));
+}
+
 bool BigramDictionary::checkFirstCharacter(unsigned short *word) {
     // Checks whether this word starts with same character or neighboring characters of
     // what user typed.
diff --git a/native/jni/src/bigram_dictionary.h b/native/jni/src/bigram_dictionary.h
index 76f9039..b123321 100644
--- a/native/jni/src/bigram_dictionary.h
+++ b/native/jni/src/bigram_dictionary.h
@@ -17,6 +17,7 @@
 #ifndef LATINIME_BIGRAM_DICTIONARY_H
 #define LATINIME_BIGRAM_DICTIONARY_H
 
+#include <map>
 #include <stdint.h>
 
 namespace latinime {
@@ -28,6 +29,8 @@
     int getBigrams(const int32_t *word, int length, int *codes, int codesSize,
             unsigned short *outWords, int *frequencies, int maxWordLength, int maxBigrams);
     int getBigramListPositionForWord(const int32_t *prevWord, const int prevWordLength);
+    void fillBigramAddressToFrequencyMap(const int32_t *prevWord, const int prevWordLength,
+            std::map<int, int> *map);
     ~BigramDictionary();
  private:
     bool addWordBigram(unsigned short *word, int length, int frequency);
diff --git a/native/jni/src/debug.h b/native/jni/src/debug.h
index b13052c..376ba59 100644
--- a/native/jni/src/debug.h
+++ b/native/jni/src/debug.h
@@ -22,7 +22,7 @@
 
 static inline unsigned char* convertToUnibyteString(unsigned short* input, unsigned char* output,
         const unsigned int length) {
-    int i = 0;
+    unsigned int i = 0;
     for (; i <= length && input[i] != 0; ++i)
         output[i] = input[i] & 0xFF;
     output[i] = 0;
@@ -31,10 +31,10 @@
 
 static inline unsigned char* convertToUnibyteStringAndReplaceLastChar(unsigned short* input,
         unsigned char* output, const unsigned int length, unsigned char c) {
-    int i = 0;
+    unsigned int i = 0;
     for (; i <= length && input[i] != 0; ++i)
         output[i] = input[i] & 0xFF;
-    output[i-1] = c;
+    if (i > 0) output[i-1] = c;
     output[i] = 0;
     return output;
 }
diff --git a/native/jni/src/dictionary.h b/native/jni/src/dictionary.h
index e0feeaf..a2b0491 100644
--- a/native/jni/src/dictionary.h
+++ b/native/jni/src/dictionary.h
@@ -17,6 +17,8 @@
 #ifndef LATINIME_DICTIONARY_H
 #define LATINIME_DICTIONARY_H
 
+#include <map>
+
 #include "bigram_dictionary.h"
 #include "char_utils.h"
 #include "correction.h"
@@ -39,6 +41,9 @@
         // If none, it's zero.
         const int bigramListPosition = !prevWordChars ? 0
                 : mBigramDictionary->getBigramListPositionForWord(prevWordChars, prevWordLength);
+        std::map<int, int> bigramMap;
+        mBigramDictionary->fillBigramAddressToFrequencyMap(prevWordChars, prevWordLength,
+                &bigramMap);
         return mUnigramDictionary->getSuggestions(proximityInfo, mWordsPriorityQueuePool,
                 mCorrection, xcoordinates, ycoordinates, codes, codesSize, bigramListPosition,
                 useFullEditDistance, outWords, frequencies);