aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
authorKeisuke Kuroyanagi <ksk@google.com>2013-11-28 11:52:59 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-11-28 11:52:59 +0000
commit22e28d5a2d2e641c456fdc339cb03cc84cb45cb9 (patch)
tree8293c81ee2ef49f87769993b9be05c9bf2c98c3e /java/src
parent6b8239983f3cf16a712ea6f8ac04e73e0b7ca30f (diff)
parent8ac3c65b00d0470218264784da77c378750d347c (diff)
downloadlatinime-22e28d5a2d2e641c456fdc339cb03cc84cb45cb9.tar.gz
latinime-22e28d5a2d2e641c456fdc339cb03cc84cb45cb9.tar.xz
latinime-22e28d5a2d2e641c456fdc339cb03cc84cb45cb9.zip
Merge "Add version check to open binary dictionary."
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java5
-rw-r--r--java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java36
-rw-r--r--java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java12
3 files changed, 45 insertions, 8 deletions
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 51ae63631..4fa682d66 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -125,6 +125,7 @@ public final class BinaryDictionary extends Dictionary {
private static native boolean needsToRunGCNative(long dict, boolean mindsBlockByGC);
private static native void flushWithGCNative(long dict, String filePath);
private static native void closeNative(long dict);
+ private static native int getFormatVersionNative(long dict);
private static native int getProbabilityNative(long dict, int[] word);
private static native int getBigramProbabilityNative(long dict, int[] word0, int[] word1);
private static native int getSuggestionsNative(long dict, long proximityInfo,
@@ -241,6 +242,10 @@ public final class BinaryDictionary extends Dictionary {
return mNativeDict != 0;
}
+ public int getFormatVersion() {
+ return getFormatVersionNative(mNativeDict);
+ }
+
public static float calcNormalizedScore(final String before, final String after,
final int score) {
return calcNormalizedScoreNative(StringUtils.toCodePointArray(before),
diff --git a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
index 7041df598..7107076cc 100644
--- a/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ExpandableBinaryDictionary.java
@@ -28,6 +28,7 @@ import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.utils.AsyncResultHolder;
import com.android.inputmethod.latin.utils.CollectionUtils;
import com.android.inputmethod.latin.utils.PrioritizedSerialExecutor;
+import com.android.inputmethod.latin.utils.StringUtils;
import java.io.File;
import java.util.ArrayList;
@@ -128,6 +129,14 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
*/
protected abstract boolean hasContentChanged();
+ protected boolean isValidBinaryDictFormatVersion(final int formatVersion) {
+ return true;
+ }
+
+ protected String getFileNameExtentionToOpenDict() {
+ return "";
+ }
+
/**
* Gets the dictionary update controller for the given filename.
*/
@@ -238,12 +247,18 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
public void run() {
if (mDictionaryWriter == null) {
mBinaryDictionary.close();
- final File file = new File(mContext.getFilesDir(), mFilename + "/"
- + FormatSpec.TRIE_FILE_EXTENSION);
+ final File file = new File(mContext.getFilesDir(), mFilename);
+ file.delete();
BinaryDictionary.createEmptyDictFile(file.getAbsolutePath(),
DICTIONARY_FORMAT_VERSION, getHeaderAttributeMap());
+ // We have 'fileToOpen' in addition to 'file' for the v4 dictionary format
+ // where 'file' is a directory, and 'fileToOpen' is a normal file.
+ final File fileToOpen = new File(mContext.getFilesDir(), mFilename
+ + getFileNameExtentionToOpenDict());
+ // TODO: Make BinaryDictionary's constructor be able to accept filename
+ // without extension.
mBinaryDictionary = new BinaryDictionary(
- file.getAbsolutePath(), 0 /* offset */, file.length(),
+ fileToOpen.getAbsolutePath(), 0 /* offset */, fileToOpen.length(),
true /* useFullEditDistance */, null, mDictType, mIsUpdatable);
} else {
mDictionaryWriter.clear();
@@ -482,8 +497,8 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
+ mFilenameDictionaryUpdateController.mLastUpdateTime);
}
- final File file = new File(mContext.getFilesDir(), mFilename + "/"
- + FormatSpec.TRIE_FILE_EXTENSION);
+ final File file = new File(mContext.getFilesDir(), mFilename
+ + getFileNameExtentionToOpenDict());
final String filename = file.getAbsolutePath();
final long length = file.length();
@@ -526,8 +541,10 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
loadDictionaryAsync();
mDictionaryWriter.write(mFilename, getHeaderAttributeMap());
} else {
- if (mBinaryDictionary == null || !mBinaryDictionary.isValidDictionary()) {
+ if (mBinaryDictionary == null || !mBinaryDictionary.isValidDictionary()
+ || !isValidBinaryDictFormatVersion(mBinaryDictionary.getFormatVersion())) {
final File file = new File(mContext.getFilesDir(), mFilename);
+ file.delete();
BinaryDictionary.createEmptyDictFile(file.getAbsolutePath(),
DICTIONARY_FORMAT_VERSION, getHeaderAttributeMap());
} else {
@@ -623,8 +640,11 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
// load the shared dictionary.
loadBinaryDictionary();
}
- if (mBinaryDictionary != null && !mBinaryDictionary.isValidDictionary()) {
- // Binary dictionary is not valid. Regenerate the dictionary file.
+ if (mBinaryDictionary != null && !(mBinaryDictionary.isValidDictionary()
+ && isValidBinaryDictFormatVersion(
+ mBinaryDictionary.getFormatVersion()))) {
+ // Binary dictionary or its format version is not valid. Regenerate the
+ // dictionary file.
mFilenameDictionaryUpdateController.mLastUpdateTime = time;
writeBinaryDictionary();
loadBinaryDictionary();
diff --git a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
index bc1160160..8b948831e 100644
--- a/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
+++ b/java/src/com/android/inputmethod/latin/personalization/DecayingExpandableBinaryDictionaryBase.java
@@ -56,6 +56,8 @@ public abstract class DecayingExpandableBinaryDictionaryBase extends ExpandableB
public static final int FREQUENCY_FOR_WORDS_IN_DICTS = FREQUENCY_FOR_TYPED;
public static final int FREQUENCY_FOR_WORDS_NOT_IN_DICTS = Dictionary.NOT_A_PROBABILITY;
+ public static final int REQUIRED_BINARY_DICTIONARY_VERSION = 4;
+
/** Locale for which this user history dictionary is storing words */
private final String mLocale;
@@ -114,6 +116,16 @@ public abstract class DecayingExpandableBinaryDictionaryBase extends ExpandableB
return false;
}
+ @Override
+ protected boolean isValidBinaryDictFormatVersion(final int formatVersion) {
+ return formatVersion >= REQUIRED_BINARY_DICTIONARY_VERSION;
+ }
+
+ @Override
+ protected String getFileNameExtentionToOpenDict() {
+ return "/" + FormatSpec.TRIE_FILE_EXTENSION;
+ }
+
public void addMultipleDictionaryEntriesToDictionary(
final ArrayList<LanguageModelParam> languageModelParams,
final ExpandableBinaryDictionary.AddMultipleDictionaryEntriesCallback callback) {