Merge "Implement ver4 dict PtNode reading methods."
diff --git a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
index 95c9bca..8fdff8f 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableDictionary.java
@@ -33,6 +33,7 @@
  * be searched for suggestions and valid words.
  */
 // TODO: Remove after binary dictionary supports dynamic update.
+@UsedForTesting
 public class ExpandableDictionary extends Dictionary {
     private static final String TAG = ExpandableDictionary.class.getSimpleName();
     /**
@@ -146,6 +147,7 @@
 
     private int[][] mCodes;
 
+    @UsedForTesting
     public ExpandableDictionary(final String dictType) {
         super(dictType);
         clearDictionary();
@@ -164,6 +166,7 @@
      * @param shortcutFreq The frequency of the shortcut (0~15, with 15 = whitelist). Ignored
      *   if shortcutTarget is null.
      */
+    @UsedForTesting
     public void addWord(final String word, final String shortcutTarget, final int frequency,
             final int shortcutFreq) {
         if (word.length() >= Constants.DICTIONARY_MAX_WORD_LENGTH) {
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 2e22af9..9936b3e 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -3276,6 +3276,8 @@
 
         final Printer p = new PrintWriterPrinter(fout);
         p.println("LatinIME state :");
+        p.println("  VersionCode = " + ApplicationUtils.getVersionCode(this));
+        p.println("  VersionName = " + ApplicationUtils.getVersionName(this));
         final Keyboard keyboard = mKeyboardSwitcher.getKeyboard();
         final int keyboardMode = keyboard != null ? keyboard.mId.mMode : -1;
         p.println("  Keyboard mode = " + keyboardMode);
diff --git a/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java b/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java
index 08a2a8c..e521ec8 100644
--- a/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/ApplicationUtils.java
@@ -62,4 +62,22 @@
         }
         return "";
     }
+
+    /**
+     * A utility method to get the application's PackageInfo.versionCode
+     * @return the application's PackageInfo.versionCode
+     */
+    public static int getVersionCode(final Context context) {
+        try {
+            if (context == null) {
+                return 0;
+            }
+            final String packageName = context.getPackageName();
+            final PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
+            return info.versionCode;
+        } catch (final NameNotFoundException e) {
+            Log.e(TAG, "Could not find version info.", e);
+        }
+        return 0;
+    }
 }
diff --git a/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java b/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java
index 635afe7..7b81e8b 100644
--- a/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/UserHistoryDictIOUtils.java
@@ -70,6 +70,7 @@
     /**
      * Writes dictionary to file.
      */
+    @UsedForTesting
     public static void writeDictionary(final DictEncoder dictEncoder,
             final BigramDictionaryInterface dict, final UserHistoryDictionaryBigramList bigrams,
             final FormatOptions formatOptions) {
diff --git a/java/src/com/android/inputmethod/latin/utils/UserHistoryForgettingCurveUtils.java b/java/src/com/android/inputmethod/latin/utils/UserHistoryForgettingCurveUtils.java
index 1992b2f..677035e 100644
--- a/java/src/com/android/inputmethod/latin/utils/UserHistoryForgettingCurveUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/UserHistoryForgettingCurveUtils.java
@@ -20,6 +20,9 @@
 
 import java.util.concurrent.TimeUnit;
 
+import com.android.inputmethod.annotations.UsedForTesting;
+
+@UsedForTesting
 public final class UserHistoryForgettingCurveUtils {
     private static final String TAG = UserHistoryForgettingCurveUtils.class.getSimpleName();
     private static final boolean DEBUG = false;
@@ -118,18 +121,22 @@
         }
     }
 
+    @UsedForTesting
     /* package */ static  int fcToElapsedTime(byte fc) {
         return fc & 0x0F;
     }
 
+    @UsedForTesting
     /* package */ static int fcToCount(byte fc) {
         return (fc >> 4) & 0x03;
     }
 
+    @UsedForTesting
     /* package */ static int fcToLevel(byte fc) {
         return (fc >> 6) & 0x03;
     }
 
+    @UsedForTesting
     private static int calcFreq(int elapsedTime, int count, int level) {
         if (level <= 0) {
             // Reserved words, just return -1
@@ -158,6 +165,7 @@
         return calcFreq(elapsedTime, count, level);
     }
 
+    @UsedForTesting
     public static byte pushElapsedTime(byte fc) {
         int elapsedTime = fcToElapsedTime(fc);
         int count = fcToCount(fc);
@@ -173,6 +181,7 @@
         return calcFc(elapsedTime, count, level);
     }
 
+    @UsedForTesting
     public static byte pushCount(byte fc, boolean isValid) {
         final int elapsedTime = fcToElapsedTime(fc);
         int count = fcToCount(fc);