Merge "Add skipPtNode to DictDecoders."
diff --git a/java/res/drawable-hdpi/sym_keyboard_smiley_holo_dark.png b/java/res/drawable-hdpi/sym_keyboard_smiley_holo_dark.png
new file mode 100644
index 0000000..cfacbc2
--- /dev/null
+++ b/java/res/drawable-hdpi/sym_keyboard_smiley_holo_dark.png
Binary files differ
diff --git a/java/res/drawable-mdpi/sym_keyboard_smiley_holo_dark.png b/java/res/drawable-mdpi/sym_keyboard_smiley_holo_dark.png
index 71272bb..067ad54 100644
--- a/java/res/drawable-mdpi/sym_keyboard_smiley_holo_dark.png
+++ b/java/res/drawable-mdpi/sym_keyboard_smiley_holo_dark.png
Binary files differ
diff --git a/java/res/drawable-xhdpi/sym_keyboard_smiley_holo_dark.png b/java/res/drawable-xhdpi/sym_keyboard_smiley_holo_dark.png
index 686831f..e6baa2e 100644
--- a/java/res/drawable-xhdpi/sym_keyboard_smiley_holo_dark.png
+++ b/java/res/drawable-xhdpi/sym_keyboard_smiley_holo_dark.png
Binary files differ
diff --git a/java/res/drawable-xxhdpi/sym_keyboard_smiley_holo_dark.png b/java/res/drawable-xxhdpi/sym_keyboard_smiley_holo_dark.png
index 04b7216..5973ac3 100644
--- a/java/res/drawable-xxhdpi/sym_keyboard_smiley_holo_dark.png
+++ b/java/res/drawable-xxhdpi/sym_keyboard_smiley_holo_dark.png
Binary files differ
diff --git a/java/res/layout/emoji_keyboard_tab_icon.xml b/java/res/layout/emoji_keyboard_tab_icon.xml
index d79276e..1609f6a 100644
--- a/java/res/layout/emoji_keyboard_tab_icon.xml
+++ b/java/res/layout/emoji_keyboard_tab_icon.xml
@@ -23,4 +23,5 @@
     android:layout_weight="1.0"
     android:layout_height="wrap_content"
     android:gravity="center"
+    android:scaleType="center"
 />
diff --git a/java/src/com/android/inputmethod/keyboard/EmojiCategoryPageIndicatorView.java b/java/src/com/android/inputmethod/keyboard/EmojiCategoryPageIndicatorView.java
index fed134e..e23131a 100644
--- a/java/src/com/android/inputmethod/keyboard/EmojiCategoryPageIndicatorView.java
+++ b/java/src/com/android/inputmethod/keyboard/EmojiCategoryPageIndicatorView.java
@@ -50,8 +50,9 @@
 
     @Override
     protected void onDraw(Canvas canvas) {
-        if (mCategoryPageSize == 0) {
-            // If the category is not set yet, just clear and return.
+        if (mCategoryPageSize <= 1) {
+            // If the category is not set yet or contains only one category,
+            // just clear and return.
             canvas.drawColor(0);
             return;
         }
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index b7b08cd..d9bad7e 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -270,18 +270,11 @@
         return getBigramProbabilityNative(mNativeDict, codePoints0, codePoints1);
     }
 
-    private void runGCIfRequired() {
-        if (needsToRunGC(true /* mindsBlockByGC */)) {
-            flushWithGC();
-        }
-    }
-
     // Add a unigram entry to binary dictionary in native code.
     public void addUnigramWord(final String word, final int probability) {
         if (TextUtils.isEmpty(word)) {
             return;
         }
-        runGCIfRequired();
         final int[] codePoints = StringUtils.toCodePointArray(word);
         addUnigramWordNative(mNativeDict, codePoints, probability);
     }
@@ -291,7 +284,6 @@
         if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) {
             return;
         }
-        runGCIfRequired();
         final int[] codePoints0 = StringUtils.toCodePointArray(word0);
         final int[] codePoints1 = StringUtils.toCodePointArray(word1);
         addBigramWordsNative(mNativeDict, codePoints0, codePoints1, probability);
@@ -302,7 +294,6 @@
         if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) {
             return;
         }
-        runGCIfRequired();
         final int[] codePoints0 = StringUtils.toCodePointArray(word0);
         final int[] codePoints1 = StringUtils.toCodePointArray(word1);
         removeBigramWordsNative(mNativeDict, codePoints0, codePoints1);
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 2d1ca51..306c1a2 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -273,6 +273,24 @@
                 lastModifiedTime);
     }
 
+    private void runGCIfRequired() {
+        if (!ENABLE_BINARY_DICTIONARY_DYNAMIC_UPDATE) return;
+        if (mBinaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
+            if (setIsRegeneratingIfNotRegenerating()) {
+                getExecutor(mFilename).execute(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            mBinaryDictionary.flushWithGC();
+                        } finally {
+                            mFilenameDictionaryUpdateController.mIsRegenerating.set(false);
+                        }
+                    }
+                });
+            }
+        }
+    }
+
     /**
      * Dynamically adds a word unigram to the dictionary. May overwrite an existing entry.
      */
@@ -282,7 +300,7 @@
             Log.w(TAG, "addWordDynamically is called for non-updatable dictionary: " + mFilename);
             return;
         }
-
+        runGCIfRequired();
         getExecutor(mFilename).execute(new Runnable() {
             @Override
             public void run() {
@@ -306,7 +324,7 @@
                     + mFilename);
             return;
         }
-
+        runGCIfRequired();
         getExecutor(mFilename).execute(new Runnable() {
             @Override
             public void run() {
@@ -330,7 +348,7 @@
                     + mFilename);
             return;
         }
-
+        runGCIfRequired();
         getExecutor(mFilename).execute(new Runnable() {
             @Override
             public void run() {