Get stats from dictionary.

Bug: 16553957
Change-Id: I70c7a7be3c902dc8a0dfe8f946f9ef75ba6c9655
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 9bca0bf..b164c17 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -598,7 +598,7 @@
     }
 
     @UsedForTesting
-    public String getPropertyForTest(final String query) {
+    public String getPropertyForGettingStats(final String query) {
         if (!isValidDictionary()) return "";
         return getPropertyNative(mNativeDict, query);
     }
diff --git a/java/src/com/android/inputmethod/latin/DictionaryStats.java b/java/src/com/android/inputmethod/latin/DictionaryStats.java
index 75aa241..5dd39d3 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryStats.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryStats.java
@@ -20,16 +20,24 @@
 import java.util.Locale;
 
 public class DictionaryStats {
+    public static final int NOT_AN_ENTRY_COUNT = -1;
+
     public final Locale mLocale;
     public final String mDictName;
     public final String mDictFilePath;
     public final long mDictFileSize;
+
+    public final int mUnigramCount;
+    public final int mNgramCount;
     // TODO: Add more members.
 
-    public DictionaryStats(final Locale locale, final String dictName, final File dictFile) {
+    public DictionaryStats(final Locale locale, final String dictName, final File dictFile,
+            final int unigramCount, final int ngramCount) {
         mLocale = locale;
         mDictName = dictName;
         mDictFilePath = dictFile.getAbsolutePath();
         mDictFileSize = dictFile.length();
+        mUnigramCount = unigramCount;
+        mNgramCount = ngramCount;
     }
 }
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 53abd2e..68f2b62 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -644,14 +644,36 @@
         });
     }
 
+    private static int parseEntryCount(final String entryCountStr) {
+        int entryCount;
+        try {
+            entryCount = Integer.parseInt(entryCountStr);
+        } catch (final NumberFormatException e) {
+            entryCount = DictionaryStats.NOT_AN_ENTRY_COUNT;
+        }
+        return entryCount;
+    }
+
     public DictionaryStats getDictionaryStats() {
         reloadDictionaryIfRequired();
         final AsyncResultHolder<DictionaryStats> result = new AsyncResultHolder<>();
         asyncExecuteTaskWithLock(mLock.readLock(), mDictName /* executorName */, new Runnable() {
             @Override
             public void run() {
-                // TODO: Get stats from the dictionary.
-                result.set(new DictionaryStats(mLocale, mDictName, mDictFile));
+                if (mBinaryDictionary == null) {
+                    result.set(new DictionaryStats(mLocale, mDictName, mDictFile,
+                            DictionaryStats.NOT_AN_ENTRY_COUNT,
+                            DictionaryStats.NOT_AN_ENTRY_COUNT));
+                }
+                final int unigramCount = parseEntryCount(
+                        mBinaryDictionary.getPropertyForGettingStats(
+                                BinaryDictionary.MAX_UNIGRAM_COUNT_QUERY));
+                // TODO: Get dedicated entry counts for bigram, trigram, and so on.
+                final int ngramCount = parseEntryCount(mBinaryDictionary.getPropertyForGettingStats(
+                        BinaryDictionary.MAX_BIGRAM_COUNT_QUERY));
+                // TODO: Get more information from dictionary.
+                result.set(new DictionaryStats(mLocale, mDictName, mDictFile, unigramCount,
+                        ngramCount));
             }
         });
         return result.get(null /* defaultValue */, TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS);
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
index 342eb29..f3bbe4a 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryDecayingTests.java
@@ -342,31 +342,31 @@
         }
 
         final int maxUnigramCount = Integer.parseInt(
-                binaryDictionary.getPropertyForTest(BinaryDictionary.MAX_UNIGRAM_COUNT_QUERY));
+                binaryDictionary.getPropertyForGettingStats(BinaryDictionary.MAX_UNIGRAM_COUNT_QUERY));
         for (int i = 0; i < unigramTypedCount; i++) {
             final String word = words.get(random.nextInt(words.size()));
             addUnigramWord(binaryDictionary, word, DUMMY_PROBABILITY);
 
             if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
                 final int unigramCountBeforeGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.UNIGRAM_COUNT_QUERY));
                 while (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
                     forcePassingShortTime(binaryDictionary);
                 }
                 final int unigramCountAfterGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.UNIGRAM_COUNT_QUERY));
                 assertTrue(unigramCountBeforeGC > unigramCountAfterGC);
             }
         }
 
-        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForTest(
+        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                 BinaryDictionary.UNIGRAM_COUNT_QUERY)) > 0);
-        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForTest(
+        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                 BinaryDictionary.UNIGRAM_COUNT_QUERY)) <= maxUnigramCount);
         forcePassingLongTime(binaryDictionary);
-        assertEquals(0, Integer.parseInt(binaryDictionary.getPropertyForTest(
+        assertEquals(0, Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                 BinaryDictionary.UNIGRAM_COUNT_QUERY)));
     }
 
@@ -415,13 +415,13 @@
             }
             if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
                 final int unigramCountBeforeGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.UNIGRAM_COUNT_QUERY));
                 assertTrue(binaryDictionary.isValidWord(strong));
                 assertTrue(binaryDictionary.isValidWord(weak));
                 binaryDictionary.flushWithGC();
                 final int unigramCountAfterGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.UNIGRAM_COUNT_QUERY));
                 assertTrue(unigramCountBeforeGC > unigramCountAfterGC);
                 assertFalse(binaryDictionary.isValidWord(weak));
@@ -477,7 +477,7 @@
         }
 
         final int maxBigramCount = Integer.parseInt(
-                binaryDictionary.getPropertyForTest(BinaryDictionary.MAX_BIGRAM_COUNT_QUERY));
+                binaryDictionary.getPropertyForGettingStats(BinaryDictionary.MAX_BIGRAM_COUNT_QUERY));
         for (int i = 0; i < bigramTypedCount; ++i) {
             final Pair<String, String> bigram = bigrams.get(random.nextInt(bigrams.size()));
             addUnigramWord(binaryDictionary, bigram.first, DUMMY_PROBABILITY);
@@ -486,24 +486,24 @@
 
             if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
                 final int bigramCountBeforeGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.BIGRAM_COUNT_QUERY));
                 while (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
                     forcePassingShortTime(binaryDictionary);
                 }
                 final int bigramCountAfterGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.BIGRAM_COUNT_QUERY));
                 assertTrue(bigramCountBeforeGC > bigramCountAfterGC);
             }
         }
 
-        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForTest(
+        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                 BinaryDictionary.BIGRAM_COUNT_QUERY)) > 0);
-        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForTest(
+        assertTrue(Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                 BinaryDictionary.BIGRAM_COUNT_QUERY)) <= maxBigramCount);
         forcePassingLongTime(binaryDictionary);
-        assertEquals(0, Integer.parseInt(binaryDictionary.getPropertyForTest(
+        assertEquals(0, Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                 BinaryDictionary.BIGRAM_COUNT_QUERY)));
     }
 
@@ -574,11 +574,11 @@
             }
             if (binaryDictionary.needsToRunGC(true /* mindsBlockByGC */)) {
                 final int bigramCountBeforeGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.BIGRAM_COUNT_QUERY));
                 binaryDictionary.flushWithGC();
                 final int bigramCountAfterGC =
-                        Integer.parseInt(binaryDictionary.getPropertyForTest(
+                        Integer.parseInt(binaryDictionary.getPropertyForGettingStats(
                                 BinaryDictionary.BIGRAM_COUNT_QUERY));
                 assertTrue(bigramCountBeforeGC > bigramCountAfterGC);
                 assertTrue(isValidBigram(binaryDictionary, strong, target));
diff --git a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
index 6ba18d6..8765dde 100644
--- a/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
+++ b/tests/src/com/android/inputmethod/latin/BinaryDictionaryTests.java
@@ -892,14 +892,18 @@
                 addBigramWords(binaryDictionary, word0, word1, bigramProbability);
             }
             assertEquals(new HashSet<>(words).size(), Integer.parseInt(
-                    binaryDictionary.getPropertyForTest(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
+                    binaryDictionary.getPropertyForGettingStats(
+                            BinaryDictionary.UNIGRAM_COUNT_QUERY)));
             assertEquals(new HashSet<>(bigrams).size(), Integer.parseInt(
-                    binaryDictionary.getPropertyForTest(BinaryDictionary.BIGRAM_COUNT_QUERY)));
+                    binaryDictionary.getPropertyForGettingStats(
+                            BinaryDictionary.BIGRAM_COUNT_QUERY)));
             binaryDictionary.flushWithGC();
             assertEquals(new HashSet<>(words).size(), Integer.parseInt(
-                    binaryDictionary.getPropertyForTest(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
+                    binaryDictionary.getPropertyForGettingStats(
+                            BinaryDictionary.UNIGRAM_COUNT_QUERY)));
             assertEquals(new HashSet<>(bigrams).size(), Integer.parseInt(
-                    binaryDictionary.getPropertyForTest(BinaryDictionary.BIGRAM_COUNT_QUERY)));
+                    binaryDictionary.getPropertyForGettingStats(
+                            BinaryDictionary.BIGRAM_COUNT_QUERY)));
             binaryDictionary.close();
         }
 
@@ -1434,7 +1438,7 @@
             assertEquals((int)unigramProbabilities.get(word), binaryDictionary.getFrequency(word));
         }
         assertEquals(unigramProbabilities.size(), Integer.parseInt(
-                binaryDictionary.getPropertyForTest(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
+                binaryDictionary.getPropertyForGettingStats(BinaryDictionary.UNIGRAM_COUNT_QUERY)));
 
         for (final Pair<String, String> bigram : bigrams) {
             if (canCheckBigramProbability(toFormatVersion)) {
@@ -1444,7 +1448,7 @@
             assertTrue(isValidBigram(binaryDictionary, bigram.first, bigram.second));
         }
         assertEquals(bigramProbabilities.size(), Integer.parseInt(
-                binaryDictionary.getPropertyForTest(BinaryDictionary.BIGRAM_COUNT_QUERY)));
+                binaryDictionary.getPropertyForGettingStats(BinaryDictionary.BIGRAM_COUNT_QUERY)));
     }
 
     public void testBeginningOfSentence() {