Merge "Set the locale for opening an asset"

main
Jean Chalard 2011-07-21 03:18:23 -07:00 committed by Android (Google) Code Review
commit a3dd3887c9
3 changed files with 30 additions and 9 deletions

View File

@ -19,6 +19,7 @@ package com.android.inputmethod.latin;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
import android.net.Uri;
import android.text.TextUtils;
@ -129,8 +130,11 @@ public class BinaryDictionaryFileDumper {
*/
public static String getDictionaryFileFromResource(int resource, Locale locale,
Context context) throws FileNotFoundException, IOException {
return copyFileTo(context.getResources().openRawResource(resource),
getCacheFileNameForLocale(locale, context));
final Resources res = context.getResources();
final Locale savedLocale = Utils.setSystemLocale(res, locale);
final InputStream stream = res.openRawResource(resource);
Utils.setSystemLocale(res, savedLocale);
return copyFileTo(stream, getCacheFileNameForLocale(locale, context));
}
/**

View File

@ -18,6 +18,7 @@ package com.android.inputmethod.latin;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
import android.util.Log;
import java.io.FileNotFoundException;
@ -42,8 +43,13 @@ class BinaryDictionaryGetter {
/**
* Returns a file address from a resource, or null if it cannot be opened.
*/
private static AssetFileAddress loadFallbackResource(Context context, int fallbackResId) {
final AssetFileDescriptor afd = context.getResources().openRawResourceFd(fallbackResId);
private static AssetFileAddress loadFallbackResource(final Context context,
final int fallbackResId, final Locale locale) {
final Resources res = context.getResources();
final Locale savedLocale = Utils.setSystemLocale(res, locale);
final AssetFileDescriptor afd = res.openRawResourceFd(fallbackResId);
Utils.setSystemLocale(res, savedLocale);
if (afd == null) {
Log.e(TAG, "Found the resource but cannot read it. Is it compressed? resId="
+ fallbackResId);
@ -91,7 +97,8 @@ class BinaryDictionaryGetter {
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);
if (null == fallbackAsset) return null;
return Arrays.asList(fallbackAsset);
}

View File

@ -48,7 +48,7 @@ public class DictionaryFactory {
int fallbackResId) {
if (null == locale) {
Log.e(TAG, "No locale defined for dictionary");
return new DictionaryCollection(createBinaryDictionary(context, fallbackResId));
return new DictionaryCollection(createBinaryDictionary(context, fallbackResId, locale));
}
final List<Dictionary> dictList = new LinkedList<Dictionary>();
@ -76,7 +76,8 @@ public class DictionaryFactory {
// we found could not be opened by the native code for any reason (format mismatch,
// file too big to fit in memory, etc) then we could have an empty list. In this
// case we want to fall back on the resource.
return new DictionaryCollection(createBinaryDictionary(context, fallbackResId));
return new DictionaryCollection(createBinaryDictionary(context, fallbackResId,
locale));
} else {
return new DictionaryCollection(dictList);
}
@ -87,12 +88,21 @@ public class DictionaryFactory {
* Initializes a dictionary from a raw resource file
* @param context application context for reading resources
* @param resId the resource containing the raw binary dictionary
* @param locale the locale to use for the resource
* @return an initialized instance of BinaryDictionary
*/
protected static BinaryDictionary createBinaryDictionary(Context context, int resId) {
protected static BinaryDictionary createBinaryDictionary(final Context context,
final int resId, final Locale locale) {
AssetFileDescriptor afd = null;
try {
afd = context.getResources().openRawResourceFd(resId);
final Resources res = context.getResources();
if (null != locale) {
final Locale savedLocale = Utils.setSystemLocale(res, locale);
afd = res.openRawResourceFd(resId);
Utils.setSystemLocale(res, savedLocale);
} else {
afd = res.openRawResourceFd(resId);
}
if (afd == null) {
Log.e(TAG, "Found the resource but it is compressed. resId=" + resId);
return null;