Merge "Update dictionaries"
diff --git a/java/res/layout/setup_welcome_video.xml b/java/res/layout/setup_welcome_video.xml
index da59ec8..09cef98 100644
--- a/java/res/layout/setup_welcome_video.xml
+++ b/java/res/layout/setup_welcome_video.xml
@@ -29,6 +29,7 @@
             android:layout_height="0dp" />
         <VideoView
             android:id="@+id/setup_welcome_video"
+            android:background="@color/setup_background"
             android:layout_weight="@integer/setup_welcome_video_weight_in_screen"
             android:layout_marginTop="@dimen/setup_welcome_video_vertical_margin"
             android:layout_marginBottom="@dimen/setup_welcome_video_vertical_margin"
diff --git a/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java b/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java
index 391a15c..5ab94a4 100644
--- a/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java
+++ b/java/src/com/android/inputmethod/dictionarypack/ButtonSwitcher.java
@@ -126,6 +126,7 @@
                     new AnimatorListenerAdapter() {
                         @Override
                         public void onAnimationEnd(final Animator animation) {
+                            if (newStatus != mStatus) return;
                             animateButton(newButton, ANIMATION_IN);
                         }
                     });
@@ -144,8 +145,10 @@
         final float outerX = getWidth();
         final float innerX = button.getX() - button.getTranslationX();
         if (ANIMATION_IN == direction) {
+            button.setClickable(true);
             return button.animate().translationX(0);
         } else {
+            button.setClickable(false);
             return button.animate().translationX(outerX - innerX);
         }
     }
diff --git a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
index 1cf9196..e14055b 100644
--- a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
+++ b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
@@ -219,8 +219,9 @@
             final ListView listView = (ListView)parent;
             final int indexToOpen;
             // Close all first, we'll open back any item that needs to be open.
+            final boolean wasOpen = mInterfaceState.isOpen(mWordlistId);
             mInterfaceState.closeAll();
-            if (mInterfaceState.isOpen(mWordlistId)) {
+            if (wasOpen) {
                 // This button being shown. Take note that we don't want to open any button in the
                 // loop below.
                 indexToOpen = -1;
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 8d4beec..a0ac475 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -370,7 +370,9 @@
             // When user hits the space or the enter key, just cancel the while-typing timer.
             final int typedCode = typedKey.mCode;
             if (typedCode == Constants.CODE_SPACE || typedCode == Constants.CODE_ENTER) {
-                startWhileTypingFadeinAnimation(keyboardView);
+                if (isTyping) {
+                    startWhileTypingFadeinAnimation(keyboardView);
+                }
                 return;
             }
 
@@ -614,8 +616,18 @@
 
     @ExternallyReferenced
     public void setAltCodeKeyWhileTypingAnimAlpha(final int alpha) {
+        if (mAltCodeKeyWhileTypingAnimAlpha == alpha) {
+            return;
+        }
+        // Update the visual of alt-code-key-while-typing.
         mAltCodeKeyWhileTypingAnimAlpha = alpha;
-        updateAltCodeKeyWhileTyping();
+        final Keyboard keyboard = getKeyboard();
+        if (keyboard == null) {
+            return;
+        }
+        for (final Key key : keyboard.mAltCodeKeysWhileTyping) {
+            invalidateKey(key);
+        }
     }
 
     public void setKeyboardActionListener(final KeyboardActionListener listener) {
@@ -1282,16 +1294,6 @@
         invalidateKey(shortcutKey);
     }
 
-    private void updateAltCodeKeyWhileTyping() {
-        final Keyboard keyboard = getKeyboard();
-        if (keyboard == null) {
-            return;
-        }
-        for (final Key key : keyboard.mAltCodeKeysWhileTyping) {
-            invalidateKey(key);
-        }
-    }
-
     public void startDisplayLanguageOnSpacebar(final boolean subtypeChanged,
             final boolean needsToDisplayLanguage, final boolean hasMultipleEnabledIMEsOrSubtypes) {
         mNeedsToDisplayLanguage = needsToDisplayLanguage;
diff --git a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
index 29ee63d..651fea6 100644
--- a/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
+++ b/java/src/com/android/inputmethod/latin/setup/SetupActivity.java
@@ -190,6 +190,14 @@
                 mp.start();
             }
         });
+        mWelcomeVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+            @Override
+            public void onPrepared(final MediaPlayer mp) {
+                // Now VideoView has been laid-out and ready to play, remove background of it to
+                // reveal the video.
+                mWelcomeVideoView.setBackgroundResource(0);
+            }
+        });
 
         mActionStart = findViewById(R.id.setup_start_label);
         mActionStart.setOnClickListener(this);
diff --git a/native/jni/src/bigram_dictionary.cpp b/native/jni/src/bigram_dictionary.cpp
index 9289038..9053e72 100644
--- a/native/jni/src/bigram_dictionary.cpp
+++ b/native/jni/src/bigram_dictionary.cpp
@@ -187,7 +187,7 @@
                 &pos);
         (*map)[bigramPos] = probability;
         setInFilter(filter, bigramPos);
-    } while (0 != (BinaryFormat::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags));
+    } while (BinaryFormat::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags);
 }
 
 bool BigramDictionary::checkFirstCharacter(int *word, int *inputCodePoints) const {
diff --git a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
index a253391..a048122 100644
--- a/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
+++ b/native/jni/src/suggest/core/dicnode/dic_node_utils.cpp
@@ -271,7 +271,7 @@
             return probability;
         }
         count++;
-    } while ((0 != (BinaryFormat::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags))
+    } while ((BinaryFormat::FLAG_ATTRIBUTE_HAS_NEXT & bigramFlags)
             && count < MAX_BIGRAMS_CONSIDERED_PER_CONTEXT);
     if (static_cast<int>(bigramCacheMap->size()) < MAX_BIGRAM_MAP_SIZE) {
         // TODO: does this -1 mean NOT_VALID_WORD?
diff --git a/native/jni/src/suggest/core/policy/scoring.h b/native/jni/src/suggest/core/policy/scoring.h
index b8c10e2..102e856 100644
--- a/native/jni/src/suggest/core/policy/scoring.h
+++ b/native/jni/src/suggest/core/policy/scoring.h
@@ -29,16 +29,14 @@
  public:
     virtual int calculateFinalScore(const float compoundDistance, const int inputSize,
             const bool forceCommit) const = 0;
-    virtual bool getMostProbableString(
-            const DicTraverseSession *const traverseSession, const int terminalSize,
-            const float languageWeight, int *const outputCodePoints, int *const type,
-            int *const freq) const = 0;
+    virtual bool getMostProbableString(const DicTraverseSession *const traverseSession,
+            const int terminalSize, const float languageWeight, int *const outputCodePoints,
+            int *const type, int *const freq) const = 0;
     virtual void safetyNetForMostProbableString(const int terminalSize,
             const int maxScore, int *const outputCodePoints, int *const frequencies) const = 0;
     // TODO: Make more generic
-    virtual void searchWordWithDoubleLetter(DicNode *terminals,
-            const int terminalSize, int *doubleLetterTerminalIndex,
-            DoubleLetterLevel *doubleLetterLevel) const = 0;
+    virtual void searchWordWithDoubleLetter(DicNode *terminals, const int terminalSize,
+            int *doubleLetterTerminalIndex, DoubleLetterLevel *doubleLetterLevel) const = 0;
     virtual float getAdjustedLanguageWeight(DicTraverseSession *const traverseSession,
             DicNode *const terminals, const int size) const = 0;
     virtual float getDoubleLetterDemotionDistanceCost(const int terminalIndex,
diff --git a/native/jni/src/suggest/core/policy/suggest_policy.h b/native/jni/src/suggest/core/policy/suggest_policy.h
index 885e214..5b6402c 100644
--- a/native/jni/src/suggest/core/policy/suggest_policy.h
+++ b/native/jni/src/suggest/core/policy/suggest_policy.h
@@ -20,6 +20,7 @@
 #include "defines.h"
 
 namespace latinime {
+
 class Traversal;
 class Scoring;
 class Weighting;
diff --git a/native/jni/src/suggest/core/policy/traversal.h b/native/jni/src/suggest/core/policy/traversal.h
index d3146da..c6f66f2 100644
--- a/native/jni/src/suggest/core/policy/traversal.h
+++ b/native/jni/src/suggest/core/policy/traversal.h
@@ -39,9 +39,8 @@
             const DicNode *const dicNode) const = 0;
     virtual bool canDoLookAheadCorrection(const DicTraverseSession *const traverseSession,
             const DicNode *const dicNode) const = 0;
-    virtual ProximityType getProximityType(
-            const DicTraverseSession *const traverseSession, const DicNode *const dicNode,
-            const DicNode *const childDicNode) const = 0;
+    virtual ProximityType getProximityType(const DicTraverseSession *const traverseSession,
+            const DicNode *const dicNode, const DicNode *const childDicNode) const = 0;
     virtual bool sameAsTyped(const DicTraverseSession *const traverseSession,
             const DicNode *const dicNode) const = 0;
     virtual bool needsToTraverseAllUserInput() const = 0;
@@ -49,9 +48,8 @@
     virtual bool allowPartialCommit() const = 0;
     virtual int getDefaultExpandDicNodeSize() const = 0;
     virtual int getMaxCacheSize() const = 0;
-    virtual bool isPossibleOmissionChildNode(
-            const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode,
-            const DicNode *const dicNode) const = 0;
+    virtual bool isPossibleOmissionChildNode(const DicTraverseSession *const traverseSession,
+            const DicNode *const parentDicNode, const DicNode *const dicNode) const = 0;
     virtual bool isGoodToTraverseNextWord(const DicNode *const dicNode) const = 0;
 
  protected:
diff --git a/native/jni/src/suggest/core/policy/weighting.cpp b/native/jni/src/suggest/core/policy/weighting.cpp
index 857ddcc..4912b22 100644
--- a/native/jni/src/suggest/core/policy/weighting.cpp
+++ b/native/jni/src/suggest/core/policy/weighting.cpp
@@ -69,8 +69,7 @@
 }
 
 /* static */ void Weighting::addCostAndForwardInputIndex(const Weighting *const weighting,
-        const CorrectionType correctionType,
-        const DicTraverseSession *const traverseSession,
+        const CorrectionType correctionType, const DicTraverseSession *const traverseSession,
         const DicNode *const parentDicNode, DicNode *const dicNode,
         hash_map_compat<int, int16_t> *const bigramCacheMap) {
     const int inputSize = traverseSession->getInputSize();
@@ -94,9 +93,9 @@
 }
 
 /* static */ float Weighting::getSpatialCost(const Weighting *const weighting,
-        const CorrectionType correctionType,
-        const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode,
-        const DicNode *const dicNode, DicNode_InputStateG *const inputStateG) {
+        const CorrectionType correctionType, const DicTraverseSession *const traverseSession,
+        const DicNode *const parentDicNode, const DicNode *const dicNode,
+        DicNode_InputStateG *const inputStateG) {
     switch(correctionType) {
     case CT_OMISSION:
         return weighting->getOmissionCost(parentDicNode, dicNode);
diff --git a/native/jni/src/suggest/policyimpl/typing/typing_weighting.cpp b/native/jni/src/suggest/policyimpl/typing/typing_weighting.cpp
index 47bd204..e4c69d1 100644
--- a/native/jni/src/suggest/policyimpl/typing/typing_weighting.cpp
+++ b/native/jni/src/suggest/policyimpl/typing/typing_weighting.cpp
@@ -20,11 +20,12 @@
 #include "suggest/policyimpl/typing/scoring_params.h"
 
 namespace latinime {
+
 const TypingWeighting TypingWeighting::sInstance;
 
 ErrorType TypingWeighting::getErrorType(const CorrectionType correctionType,
-        const DicTraverseSession *const traverseSession,
-        const DicNode *const parentDicNode, const DicNode *const dicNode) const {
+        const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode,
+        const DicNode *const dicNode) const {
     switch (correctionType) {
         case CT_MATCH:
             if (isProximityDicNode(traverseSession, dicNode)) {
diff --git a/native/jni/src/suggest/policyimpl/typing/typing_weighting.h b/native/jni/src/suggest/policyimpl/typing/typing_weighting.h
index 4a0bd71..9efcc17 100644
--- a/native/jni/src/suggest/policyimpl/typing/typing_weighting.h
+++ b/native/jni/src/suggest/policyimpl/typing/typing_weighting.h
@@ -34,8 +34,8 @@
     static const TypingWeighting *getInstance() { return &sInstance; }
 
  protected:
-    float getTerminalSpatialCost(
-            const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const {
+    float getTerminalSpatialCost(const DicTraverseSession *const traverseSession,
+            const DicNode *const dicNode) const {
         float cost = 0.0f;
         if (dicNode->hasMultipleWords()) {
             cost += ScoringParams::HAS_MULTI_WORD_TERMINAL_COST;
@@ -66,9 +66,8 @@
         return cost;
     }
 
-    float getMatchedCost(
-            const DicTraverseSession *const traverseSession, const DicNode *const dicNode,
-            DicNode_InputStateG *inputStateG) const {
+    float getMatchedCost(const DicTraverseSession *const traverseSession,
+            const DicNode *const dicNode, DicNode_InputStateG *inputStateG) const {
         const int pointIndex = dicNode->getInputIndex(0);
         // Note: min() required since length can be MAX_POINT_TO_KEY_LENGTH for characters not on
         // the keyboard (like accented letters)
@@ -85,8 +84,8 @@
         return weightedDistance + cost;
     }
 
-    bool isProximityDicNode(
-            const DicTraverseSession *const traverseSession, const DicNode *const dicNode) const {
+    bool isProximityDicNode(const DicTraverseSession *const traverseSession,
+            const DicNode *const dicNode) const {
         const int pointIndex = dicNode->getInputIndex(0);
         const int primaryCodePoint = toBaseLowerCase(
                 traverseSession->getProximityInfoState(0)->getPrimaryCodePointAt(pointIndex));
@@ -94,9 +93,8 @@
         return primaryCodePoint != dicNodeChar;
     }
 
-    float getTranspositionCost(
-            const DicTraverseSession *const traverseSession, const DicNode *const parentDicNode,
-            const DicNode *const dicNode) const {
+    float getTranspositionCost(const DicTraverseSession *const traverseSession,
+            const DicNode *const parentDicNode, const DicNode *const dicNode) const {
         const int16_t parentPointIndex = parentDicNode->getInputIndex(0);
         const int prevCodePoint = parentDicNode->getNodeCodePoint();
         const float distance1 = traverseSession->getProximityInfoState(0)->getPointToKeyLength(
@@ -110,8 +108,7 @@
         return ScoringParams::TRANSPOSITION_COST + weightedLengthDistance;
     }
 
-    float getInsertionCost(
-            const DicTraverseSession *const traverseSession,
+    float getInsertionCost(const DicTraverseSession *const traverseSession,
             const DicNode *const parentDicNode, const DicNode *const dicNode) const {
         const int16_t parentPointIndex = parentDicNode->getInputIndex(0);
         const int prevCodePoint =
@@ -137,8 +134,8 @@
         return cost * traverseSession->getMultiWordCostMultiplier();
     }
 
-    float getNewWordBigramCost(
-            const DicTraverseSession *const traverseSession, const DicNode *const dicNode,
+    float getNewWordBigramCost(const DicTraverseSession *const traverseSession,
+            const DicNode *const dicNode,
             hash_map_compat<int, int16_t> *const bigramCacheMap) const {
         return DicNodeUtils::getBigramNodeImprobability(traverseSession->getOffsetDict(),
                 dicNode, bigramCacheMap) * ScoringParams::DISTANCE_WEIGHT_LANGUAGE;
@@ -174,8 +171,7 @@
         return ScoringParams::SUBSTITUTION_COST;
     }
 
-    AK_FORCE_INLINE float getSpaceSubstitutionCost(
-            const DicTraverseSession *const traverseSession,
+    AK_FORCE_INLINE float getSpaceSubstitutionCost(const DicTraverseSession *const traverseSession,
             const DicNode *const dicNode) const {
         const bool isCapitalized = dicNode->isCapitalized();
         const float cost = ScoringParams::SPACE_SUBSTITUTION_COST + (isCapitalized ?