From 4466464c24d6c6523f170f56b7e65e43ceb699e2 Mon Sep 17 00:00:00 2001
From: Keisuke Kuroyanagi <ksk@google.com>
Date: Wed, 17 Sep 2014 22:04:25 +0900
Subject: [PATCH] Use PrevWordsInfo.getPrevWordCount() in Java side.

Bug: 14425059
Change-Id: Ie6295ff657c483876af403f2d474b7d857e5e3d6
---
 .../inputmethod/latin/BinaryDictionary.java   | 15 +++++-------
 .../inputmethod/latin/PrevWordsInfo.java      | 23 ++++++++++---------
 2 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 2e108756e9..8b13bdb021 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -358,9 +358,8 @@ public final class BinaryDictionary extends Dictionary {
         if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) {
             return NOT_A_PROBABILITY;
         }
-        final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
-        final boolean[] isBeginningOfSentenceArray =
-                new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        final int[][] prevWordCodePointArrays = new int[prevWordsInfo.getPrevWordCount()][];
+        final boolean[] isBeginningOfSentenceArray = new boolean[prevWordsInfo.getPrevWordCount()];
         prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray);
         final int[] wordCodePoints = StringUtils.toCodePointArray(word);
         return getNgramProbabilityNative(mNativeDict, prevWordCodePointArrays,
@@ -455,9 +454,8 @@ public final class BinaryDictionary extends Dictionary {
         if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) {
             return false;
         }
-        final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
-        final boolean[] isBeginningOfSentenceArray =
-                new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        final int[][] prevWordCodePointArrays = new int[prevWordsInfo.getPrevWordCount()][];
+        final boolean[] isBeginningOfSentenceArray = new boolean[prevWordsInfo.getPrevWordCount()];
         prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray);
         final int[] wordCodePoints = StringUtils.toCodePointArray(word);
         if (!addNgramEntryNative(mNativeDict, prevWordCodePointArrays,
@@ -473,9 +471,8 @@ public final class BinaryDictionary extends Dictionary {
         if (!prevWordsInfo.isValid() || TextUtils.isEmpty(word)) {
             return false;
         }
-        final int[][] prevWordCodePointArrays = new int[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM][];
-        final boolean[] isBeginningOfSentenceArray =
-                new boolean[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        final int[][] prevWordCodePointArrays = new int[prevWordsInfo.getPrevWordCount()][];
+        final boolean[] isBeginningOfSentenceArray = new boolean[prevWordsInfo.getPrevWordCount()];
         prevWordsInfo.outputToArray(prevWordCodePointArrays, isBeginningOfSentenceArray);
         final int[] wordCodePoints = StringUtils.toCodePointArray(word);
         if (!removeNgramEntryNative(mNativeDict, prevWordCodePointArrays,
diff --git a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
index db877ab7a3..d662051d93 100644
--- a/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
+++ b/java/src/com/android/inputmethod/latin/PrevWordsInfo.java
@@ -86,33 +86,30 @@ public class PrevWordsInfo {
     // For simplicity of implementation, elements may also be EMPTY_WORD_INFO transiently after the
     // WordComposer was reset and before starting a new composing word, but we should never be
     // calling getSuggetions* in this situation.
-    public WordInfo[] mPrevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+    public final WordInfo[] mPrevWordsInfo;
 
     // Construct from the previous word information.
     public PrevWordsInfo(final WordInfo prevWordInfo) {
-        mPrevWordsInfo[0] = prevWordInfo;
+        mPrevWordsInfo = new WordInfo[] { prevWordInfo };
     }
 
     // Construct from WordInfo array. n-th element represents (n+1)-th previous word's information.
     public PrevWordsInfo(final WordInfo[] prevWordsInfo) {
-        for (int i = 0; i < Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM; i++) {
-            mPrevWordsInfo[i] =
-                    (prevWordsInfo.length > i) ? prevWordsInfo[i] : WordInfo.EMPTY_WORD_INFO;
-        }
+        mPrevWordsInfo = prevWordsInfo;
     }
 
     // Create next prevWordsInfo using current prevWordsInfo.
     public PrevWordsInfo getNextPrevWordsInfo(final WordInfo wordInfo) {
-        final WordInfo[] prevWordsInfo = new WordInfo[Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM];
+        final int nextPrevWordCount = Math.min(Constants.MAX_PREV_WORD_COUNT_FOR_N_GRAM,
+                mPrevWordsInfo.length + 1);
+        final WordInfo[] prevWordsInfo = new WordInfo[nextPrevWordCount];
         prevWordsInfo[0] = wordInfo;
-        for (int i = 1; i < prevWordsInfo.length; i++) {
-            prevWordsInfo[i] = mPrevWordsInfo[i - 1];
-        }
+        System.arraycopy(mPrevWordsInfo, 0, prevWordsInfo, 1, prevWordsInfo.length - 1);
         return new PrevWordsInfo(prevWordsInfo);
     }
 
     public boolean isValid() {
-        return mPrevWordsInfo[0].isValid();
+        return mPrevWordsInfo.length > 0 && mPrevWordsInfo[0].isValid();
     }
 
     public void outputToArray(final int[][] codePointArrays,
@@ -129,6 +126,10 @@ public class PrevWordsInfo {
         }
     }
 
+    public int getPrevWordCount() {
+        return mPrevWordsInfo.length;
+    }
+
     @Override
     public int hashCode() {
         return Arrays.hashCode(mPrevWordsInfo);
-- 
GitLab