Exception refactoring
Now that the dictionary pack can return several files, it's better to handle IO exceptions for each file rather than globally. This also will help with next implementation steps. Bug: 5095140 Change-Id: I5ed135ad2ad4f55f61f9b3f92c48a35d5c24bdb2main
parent
961453c3b3
commit
80e0bf0429
|
@ -98,23 +98,32 @@ public class BinaryDictionaryFileDumper {
|
||||||
* @throw IOException if the provider-returned data could not be read.
|
* @throw IOException if the provider-returned data could not be read.
|
||||||
*/
|
*/
|
||||||
public static List<AssetFileAddress> cacheDictionariesFromContentProvider(final Locale locale,
|
public static List<AssetFileAddress> cacheDictionariesFromContentProvider(final Locale locale,
|
||||||
final Context context) throws FileNotFoundException, IOException {
|
final Context context) {
|
||||||
final ContentResolver resolver = context.getContentResolver();
|
final ContentResolver resolver = context.getContentResolver();
|
||||||
final List<String> idList = getDictIdList(locale, context);
|
final List<String> idList = getDictIdList(locale, context);
|
||||||
final List<AssetFileAddress> fileAddressList = new ArrayList<AssetFileAddress>();
|
final List<AssetFileAddress> fileAddressList = new ArrayList<AssetFileAddress>();
|
||||||
for (String id : idList) {
|
for (String id : idList) {
|
||||||
final Uri wordListUri = getProviderUri(id);
|
final Uri wordListUri = getProviderUri(id);
|
||||||
final AssetFileDescriptor afd =
|
AssetFileDescriptor afd = null;
|
||||||
resolver.openAssetFileDescriptor(wordListUri, "r");
|
try {
|
||||||
if (null == afd) continue;
|
afd = resolver.openAssetFileDescriptor(wordListUri, "r");
|
||||||
final String fileName = copyFileTo(afd.createInputStream(),
|
} catch (FileNotFoundException e) {
|
||||||
BinaryDictionaryGetter.getCacheFileName(id, locale, context));
|
// leave null inside afd and continue
|
||||||
afd.close();
|
}
|
||||||
if (0 >= resolver.delete(wordListUri, null, null)) {
|
if (null == afd) continue;
|
||||||
// I'd rather not print the word list ID to the log here out of security concerns
|
try {
|
||||||
Log.e(TAG, "Could not have the dictionary pack delete a word list");
|
final String fileName = copyFileTo(afd.createInputStream(),
|
||||||
|
BinaryDictionaryGetter.getCacheFileName(id, locale, context));
|
||||||
|
afd.close();
|
||||||
|
if (0 >= resolver.delete(wordListUri, null, null)) {
|
||||||
|
// I'd rather not print the word list ID to the log out of security concerns
|
||||||
|
Log.e(TAG, "Could not have the dictionary pack delete a word list");
|
||||||
|
}
|
||||||
|
fileAddressList.add(AssetFileAddress.makeFromFileName(fileName));
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Can't read the file for some reason. Continue onto the next file.
|
||||||
|
Log.e(TAG, "Cannot read a word list from the dictionary pack : " + e);
|
||||||
}
|
}
|
||||||
fileAddressList.add(AssetFileAddress.makeFromFileName(fileName));
|
|
||||||
}
|
}
|
||||||
return fileAddressList;
|
return fileAddressList;
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,23 +214,16 @@ class BinaryDictionaryGetter {
|
||||||
*/
|
*/
|
||||||
public static List<AssetFileAddress> getDictionaryFiles(final Locale locale,
|
public static List<AssetFileAddress> getDictionaryFiles(final Locale locale,
|
||||||
final Context context, final int fallbackResId) {
|
final Context context, final int fallbackResId) {
|
||||||
try {
|
|
||||||
// cacheDictionariesFromContentProvider returns the list of files it copied to local
|
// cacheDictionariesFromContentProvider returns the list of files it copied to local
|
||||||
// storage, but we don't really care about what was copied NOW: what we want is the
|
// 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.
|
// list of everything we ever cached, so we ignore the return value.
|
||||||
BinaryDictionaryFileDumper.cacheDictionariesFromContentProvider(locale, context);
|
BinaryDictionaryFileDumper.cacheDictionariesFromContentProvider(locale, context);
|
||||||
List<AssetFileAddress> cachedDictionaryList = getCachedDictionaryList(locale, context);
|
List<AssetFileAddress> cachedDictionaryList = getCachedDictionaryList(locale, context);
|
||||||
if (null != cachedDictionaryList) {
|
if (null != cachedDictionaryList) {
|
||||||
return cachedDictionaryList;
|
return cachedDictionaryList;
|
||||||
}
|
|
||||||
// If the list is null, fall through and return the fallback
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
Log.e(TAG, "Unable to create dictionary file from provider for locale "
|
|
||||||
+ locale.toString() + ": falling back to internal dictionary");
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.e(TAG, "Unable to read source data for locale "
|
|
||||||
+ locale.toString() + ": falling back to internal dictionary");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId,
|
final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId,
|
||||||
locale);
|
locale);
|
||||||
if (null == fallbackAsset) return null;
|
if (null == fallbackAsset) return null;
|
||||||
|
|
Loading…
Reference in New Issue