aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/BinaryDictionary.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/latin/BinaryDictionary.java')
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java76
1 files changed, 60 insertions, 16 deletions
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 4fc1919dc..d181bf697 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -21,6 +21,11 @@ import android.util.SparseArray;
import com.android.inputmethod.keyboard.ProximityInfo;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
+import com.android.inputmethod.latin.settings.AdditionalFeaturesSettingUtils;
+import com.android.inputmethod.latin.settings.NativeSuggestOptions;
+import com.android.inputmethod.latin.utils.CollectionUtils;
+import com.android.inputmethod.latin.utils.JniUtils;
+import com.android.inputmethod.latin.utils.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
@@ -33,7 +38,7 @@ public final class BinaryDictionary extends Dictionary {
private static final String TAG = BinaryDictionary.class.getSimpleName();
// Must be equal to MAX_WORD_LENGTH in native/jni/src/defines.h
- private static final int MAX_WORD_LENGTH = Constants.Dictionary.MAX_WORD_LENGTH;
+ private static final int MAX_WORD_LENGTH = Constants.DICTIONARY_MAX_WORD_LENGTH;
// Must be equal to MAX_RESULTS in native/jni/src/defines.h
private static final int MAX_RESULTS = 18;
@@ -45,7 +50,7 @@ public final class BinaryDictionary extends Dictionary {
private final int[] mOutputScores = new int[MAX_RESULTS];
private final int[] mOutputTypes = new int[MAX_RESULTS];
- private final boolean mUseFullEditDistance;
+ private final NativeSuggestOptions mNativeSuggestOptions = new NativeSuggestOptions();
private final SparseArray<DicTraverseSession> mDicTraverseSessions =
CollectionUtils.newSparseArray();
@@ -74,35 +79,42 @@ public final class BinaryDictionary extends Dictionary {
* @param length the length of the binary data.
* @param useFullEditDistance whether to use the full edit distance in suggestions
* @param dictType the dictionary type, as a human-readable string
+ * @param isUpdatable whether to open the dictionary file in writable mode.
*/
public BinaryDictionary(final String filename, final long offset, final long length,
- final boolean useFullEditDistance, final Locale locale, final String dictType) {
+ final boolean useFullEditDistance, final Locale locale, final String dictType,
+ final boolean isUpdatable) {
super(dictType);
mLocale = locale;
- mUseFullEditDistance = useFullEditDistance;
- loadDictionary(filename, offset, length);
+ mNativeSuggestOptions.setUseFullEditDistance(useFullEditDistance);
+ loadDictionary(filename, offset, length, isUpdatable);
}
static {
JniUtils.loadNativeLibrary();
}
- private static native long openNative(String sourceDir, long dictOffset, long dictSize);
+ private static native long openNative(String sourceDir, long dictOffset, long dictSize,
+ boolean isUpdatable);
private static native void closeNative(long dict);
private static native int getProbabilityNative(long dict, int[] word);
- private static native boolean isValidBigramNative(long dict, int[] word1, int[] word2);
+ private static native boolean isValidBigramNative(long dict, int[] word0, int[] word1);
private static native int getSuggestionsNative(long dict, long proximityInfo,
long traverseSession, int[] xCoordinates, int[] yCoordinates, int[] times,
int[] pointerIds, int[] inputCodePoints, int inputSize, int commitPoint,
- boolean isGesture, int[] prevWordCodePointArray, boolean useFullEditDistance,
+ int[] suggestOptions, int[] prevWordCodePointArray,
int[] outputCodePoints, int[] outputScores, int[] outputIndices, int[] outputTypes);
private static native float calcNormalizedScoreNative(int[] before, int[] after, int score);
private static native int editDistanceNative(int[] before, int[] after);
+ private static native void addUnigramWordNative(long dict, int[] word, int probability);
+ private static native void addBigramWordsNative(long dict, int[] word0, int[] word1,
+ int probability);
+ private static native void removeBigramWordsNative(long dict, int[] word0, int[] word1);
// TODO: Move native dict into session
private final void loadDictionary(final String path, final long startOffset,
- final long length) {
- mNativeDict = openNative(path, startOffset, length);
+ final long length, final boolean isUpdatable) {
+ mNativeDict = openNative(path, startOffset, length, isUpdatable);
}
@Override
@@ -135,12 +147,15 @@ public final class BinaryDictionary extends Dictionary {
final InputPointers ips = composer.getInputPointers();
final int inputSize = isGesture ? ips.getPointerSize() : composerSize;
+ mNativeSuggestOptions.setIsGesture(isGesture);
+ mNativeSuggestOptions.setAdditionalFeaturesOptions(
+ AdditionalFeaturesSettingUtils.getAdditionalNativeSuggestOptions());
// proximityInfo and/or prevWordForBigrams may not be null.
final int count = getSuggestionsNative(mNativeDict, proximityInfo.getNativeProximityInfo(),
getTraverseSession(sessionId).getSession(), ips.getXCoordinates(),
ips.getYCoordinates(), ips.getTimes(), ips.getPointerIds(), mInputCodePoints,
- inputSize, 0 /* commitPoint */, isGesture, prevWordCodePointArray,
- mUseFullEditDistance, mOutputCodePoints, mOutputScores, mSpaceIndices,
+ inputSize, 0 /* commitPoint */, mNativeSuggestOptions.getOptions(),
+ prevWordCodePointArray, mOutputCodePoints, mOutputScores, mSpaceIndices,
mOutputTypes);
final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList();
for (int j = 0; j < count; ++j) {
@@ -202,11 +217,40 @@ public final class BinaryDictionary extends Dictionary {
// TODO: Add a batch process version (isValidBigramMultiple?) to avoid excessive numbers of jni
// calls when checking for changes in an entire dictionary.
- public boolean isValidBigram(final String word1, final String word2) {
- if (TextUtils.isEmpty(word1) || TextUtils.isEmpty(word2)) return false;
+ public boolean isValidBigram(final String word0, final String word1) {
+ if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) return false;
+ final int[] codePoints0 = StringUtils.toCodePointArray(word0);
final int[] codePoints1 = StringUtils.toCodePointArray(word1);
- final int[] codePoints2 = StringUtils.toCodePointArray(word2);
- return isValidBigramNative(mNativeDict, codePoints1, codePoints2);
+ return isValidBigramNative(mNativeDict, codePoints0, codePoints1);
+ }
+
+ // Add a unigram entry to binary dictionary in native code.
+ public void addUnigramWord(final String word, final int probability) {
+ if (TextUtils.isEmpty(word)) {
+ return;
+ }
+ final int[] codePoints = StringUtils.toCodePointArray(word);
+ addUnigramWordNative(mNativeDict, codePoints, probability);
+ }
+
+ // Add a bigram entry to binary dictionary in native code.
+ public void addBigramWords(final String word0, final String word1, final int probability) {
+ if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) {
+ return;
+ }
+ final int[] codePoints0 = StringUtils.toCodePointArray(word0);
+ final int[] codePoints1 = StringUtils.toCodePointArray(word1);
+ addBigramWordsNative(mNativeDict, codePoints0, codePoints1, probability);
+ }
+
+ // Remove a bigram entry form binary dictionary in native code.
+ public void removeBigramWords(final String word0, final String word1) {
+ if (TextUtils.isEmpty(word0) || TextUtils.isEmpty(word1)) {
+ return;
+ }
+ final int[] codePoints0 = StringUtils.toCodePointArray(word0);
+ final int[] codePoints1 = StringUtils.toCodePointArray(word1);
+ removeBigramWordsNative(mNativeDict, codePoints0, codePoints1);
}
@Override