diff options
author | 2013-11-28 20:40:26 +0900 | |
---|---|---|
committer | 2013-11-28 20:40:26 +0900 | |
commit | 8ac3c65b00d0470218264784da77c378750d347c (patch) | |
tree | 0ed0f1ed16c8ce18571f4403fdf16f0e81ee1ce3 /java | |
parent | c7dd2eb7ad6499178a2f1fa600bf21a2e6cb8ba3 (diff) | |
download | latinime-8ac3c65b00d0470218264784da77c378750d347c.tar.gz latinime-8ac3c65b00d0470218264784da77c378750d347c.tar.xz latinime-8ac3c65b00d0470218264784da77c378750d347c.zip |
Add version check to open binary dictionary.
Bug: 11073222
Change-Id: Iabae12b8f14a9da3cdc804dcc6af443cedeb3f99
Diffstat (limited to 'java')
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) { |