diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java index 3af752752..18df797f0 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java @@ -41,6 +41,11 @@ class BinaryDictionaryGetter { */ private static final String TAG = BinaryDictionaryGetter.class.getSimpleName(); + /** + * Used to return empty lists + */ + private static final File[] EMPTY_FILE_ARRAY = new File[0]; + /** * Name of the common preferences name to know which word list are on and which are off. */ @@ -198,29 +203,14 @@ class BinaryDictionaryGetter { * * @param locale the locale to find the dictionary files for. * @param context the context on which to open the files upon. - * @return a list of binary dictionary files, which may be null but may not be empty. + * @return an array of binary dictionary files, which may be empty but may not be null. */ - private static List getCachedDictionaryList(final Locale locale, + private static File[] getCachedDictionaryList(final Locale locale, final Context context) { final String directoryName = getCacheDirectoryForLocale(locale, context); final File[] cacheFiles = new File(directoryName).listFiles(); - // TODO: Never return null. Fallback on the built-in dictionary, and if that's - // not present or disabled, then return an empty list. - if (null == cacheFiles) return null; - - final DictPackSettings dictPackSettings = new DictPackSettings(context); - - final ArrayList fileList = new ArrayList(); - for (File f : cacheFiles) { - final String wordListId = getWordListIdFromFileName(f.getName()); - if (!dictPackSettings.isWordListActive(wordListId)) continue; - if (f.canRead()) { - fileList.add(AssetFileAddress.makeFromFileName(f.getPath())); - } else { - Log.e(TAG, "Found a cached dictionary file but cannot read it"); - } - } - return fileList.size() > 0 ? fileList : null; + if (null == cacheFiles) return EMPTY_FILE_ARRAY; + return cacheFiles; } /** @@ -242,11 +232,27 @@ class BinaryDictionaryGetter { // storage, but we don't really care about what was copied NOW: what we want is the // list of everything we ever cached, so we ignore the return value. BinaryDictionaryFileDumper.cacheDictionariesFromContentProvider(locale, context); - List cachedDictionaryList = getCachedDictionaryList(locale, context); - if (null != cachedDictionaryList) { - return cachedDictionaryList; + final File[] cachedDictionaryList = getCachedDictionaryList(locale, context); + + final DictPackSettings dictPackSettings = new DictPackSettings(context); + + final ArrayList fileList = new ArrayList(); + // cachedDictionaryList may not be null, see doc for getCachedDictionaryList + for (final File f : cachedDictionaryList) { + final String wordListId = getWordListIdFromFileName(f.getName()); + if (!dictPackSettings.isWordListActive(wordListId)) continue; + if (f.canRead()) { + fileList.add(AssetFileAddress.makeFromFileName(f.getPath())); + } else { + Log.e(TAG, "Found a cached dictionary file but cannot read it"); + } } + if (!fileList.isEmpty()) { + return fileList; + } + // If the list is empty, fall through and return the fallback + final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId, locale); if (null == fallbackAsset) return null;