aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2013-01-31 16:59:10 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-01-31 16:59:11 +0000
commit5ea4365f077f59341430e00ed34a5d74b7877931 (patch)
treea18cbe772ae91a84351f13f81244c2d9ce5161f2 /java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
parent4920d370f2a9f14bcc14212738590c22bd3752d0 (diff)
parentaf4a7e8c4b2a41e9be48965133ab489cc9484764 (diff)
downloadlatinime-5ea4365f077f59341430e00ed34a5d74b7877931.tar.gz
latinime-5ea4365f077f59341430e00ed34a5d74b7877931.tar.xz
latinime-5ea4365f077f59341430e00ed34a5d74b7877931.zip
Merge "Create methods in LatinIME to make the current dict lists"
Diffstat (limited to '')
-rw-r--r--java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java85
1 files changed, 83 insertions, 2 deletions
diff --git a/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java b/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
index c676bf1b9..8f16a8e4d 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryInfoUtils.java
@@ -17,6 +17,7 @@
package com.android.inputmethod.latin;
import android.content.Context;
+import android.content.res.AssetManager;
import android.content.res.Resources;
import android.util.Log;
@@ -26,6 +27,7 @@ import com.android.inputmethod.latin.makedict.UnsupportedFormatException;
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Locale;
/**
@@ -41,6 +43,18 @@ public class DictionaryInfoUtils {
// 6 digits - unicode is limited to 21 bits
private static final int MAX_HEX_DIGITS_FOR_CODEPOINT = 6;
+ public static class DictionaryInfo {
+ public final Locale mLocale;
+ public final AssetFileAddress mFileAddress;
+ public final int mVersion;
+ public DictionaryInfo(final Locale locale, final AssetFileAddress fileAddress,
+ final int version) {
+ mLocale = locale;
+ mFileAddress = fileAddress;
+ mVersion = version;
+ }
+ }
+
private DictionaryInfoUtils() {
// Private constructor to forbid instantation of this helper class.
}
@@ -234,12 +248,79 @@ public class DictionaryInfoUtils {
public static FileHeader getDictionaryFileHeaderOrNull(final File file) {
try {
- final FileHeader header = BinaryDictIOUtils.getDictionaryFileHeader(file);
- return header;
+ return BinaryDictIOUtils.getDictionaryFileHeader(file, 0, file.length());
} catch (UnsupportedFormatException e) {
return null;
} catch (IOException e) {
return null;
}
}
+
+ private static DictionaryInfo createDictionaryInfoFromFileAddress(
+ final AssetFileAddress fileAddress) {
+ final FileHeader header = BinaryDictIOUtils.getDictionaryFileHeaderOrNull(
+ new File(fileAddress.mFilename), fileAddress.mOffset, fileAddress.mLength);
+ final Locale locale = LocaleUtils.constructLocaleFromString(header.getLocaleString());
+ final String version = header.getVersion();
+ return new DictionaryInfo(locale, fileAddress, Integer.parseInt(version));
+ }
+
+ private static void addOrUpdateDictInfo(final ArrayList<DictionaryInfo> dictList,
+ final DictionaryInfo newElement) {
+ for (final DictionaryInfo info : dictList) {
+ if (info.mLocale.equals(newElement.mLocale)) {
+ if (newElement.mVersion <= info.mVersion) {
+ return;
+ }
+ dictList.remove(info);
+ }
+ }
+ dictList.add(newElement);
+ }
+
+ public static ArrayList<DictionaryInfo> getCurrentDictionaryFileNameAndVersionInfo(
+ final Context context) {
+ final ArrayList<DictionaryInfo> dictList = CollectionUtils.newArrayList();
+
+ // Retrieve downloaded dictionaries
+ final File[] directoryList = getCachedDirectoryList(context);
+ for (final File directory : directoryList) {
+ final String localeString = getWordListIdFromFileName(directory.getName());
+ File[] dicts = BinaryDictionaryGetter.getCachedWordLists(localeString, context);
+ for (final File dict : dicts) {
+ final String wordListId = getWordListIdFromFileName(dict.getName());
+ if (!DictionaryInfoUtils.isMainWordListId(wordListId)) continue;
+ final Locale locale = LocaleUtils.constructLocaleFromString(localeString);
+ final AssetFileAddress fileAddress = AssetFileAddress.makeFromFile(dict);
+ final DictionaryInfo dictionaryInfo =
+ createDictionaryInfoFromFileAddress(fileAddress);
+ // Protect against cases of a less-specific dictionary being found, like an
+ // en dictionary being used for an en_US locale. In this case, the en dictionary
+ // should be used for en_US but discounted for listing purposes.
+ if (!dictionaryInfo.mLocale.equals(locale)) continue;
+ addOrUpdateDictInfo(dictList, dictionaryInfo);
+ }
+ }
+
+ // Retrieve files from assets
+ final Resources resources = context.getResources();
+ final AssetManager assets = resources.getAssets();
+ for (final String localeString : assets.getLocales()) {
+ final Locale locale = LocaleUtils.constructLocaleFromString(localeString);
+ final int resourceId =
+ DictionaryInfoUtils.getMainDictionaryResourceIdIfAvailableForLocale(
+ context.getResources(), locale);
+ if (0 == resourceId) continue;
+ final AssetFileAddress fileAddress =
+ BinaryDictionaryGetter.loadFallbackResource(context, resourceId);
+ final DictionaryInfo dictionaryInfo = createDictionaryInfoFromFileAddress(fileAddress);
+ // Protect against cases of a less-specific dictionary being found, like an
+ // en dictionary being used for an en_US locale. In this case, the en dictionary
+ // should be used for en_US but discounted for listing purposes.
+ if (!dictionaryInfo.mLocale.equals(locale)) continue;
+ addOrUpdateDictInfo(dictList, dictionaryInfo);
+ }
+
+ return dictList;
+ }
}