am b2eac474: Don\'t try to issue delete() commands on missing provider

# Via Jean Chalard
* commit 'b2eac474ff82d0dad41991cd0f1ae80a58f01be2':
  Don't try to issue delete() commands on missing provider
main
Jean Chalard 2013-02-11 12:50:32 -08:00 committed by Android Git Automerger
commit d8348eeabf
1 changed files with 50 additions and 21 deletions

View File

@ -16,6 +16,7 @@
package com.android.inputmethod.latin; package com.android.inputmethod.latin;
import android.content.ContentProviderClient;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
@ -93,34 +94,55 @@ public final class BinaryDictionaryFileDumper {
path); path);
} }
/**
* Finds out whether the dictionary pack is available on this device.
* @param context A context to get the content resolver.
* @return whether the dictionary pack is present or not.
*/
private static boolean isDictionaryPackPresent(final Context context) {
final ContentResolver cr = context.getContentResolver();
final ContentProviderClient client =
cr.acquireContentProviderClient(getProviderUriBuilder("").build());
if (client != null) {
client.release();
return true;
} else {
return false;
}
}
/** /**
* Queries a content provider for the list of word lists for a specific locale * Queries a content provider for the list of word lists for a specific locale
* available to copy into Latin IME. * available to copy into Latin IME.
*/ */
private static List<WordListInfo> getWordListWordListInfos(final Locale locale, private static List<WordListInfo> getWordListWordListInfos(final Locale locale,
final Context context, final boolean hasDefaultWordList) { final Context context, final boolean hasDefaultWordList) {
final ContentResolver resolver = context.getContentResolver();
final String clientId = context.getString(R.string.dictionary_pack_client_id);
final Uri.Builder builder = getProviderUriBuilder(clientId);
builder.appendPath(QUERY_PATH_DICT_INFO);
builder.appendPath(locale.toString());
builder.appendQueryParameter(QUERY_PARAMETER_PROTOCOL, QUERY_PARAMETER_PROTOCOL_VALUE);
if (!hasDefaultWordList) {
builder.appendQueryParameter(QUERY_PARAMETER_MAY_PROMPT_USER, QUERY_PARAMETER_TRUE);
}
final Uri dictionaryPackUri = builder.build();
final Cursor c = resolver.query(dictionaryPackUri, DICTIONARY_PROJECTION, null, null, null);
if (null == c) {
reinitializeClientRecordInDictionaryContentProvider(context, resolver, clientId);
return Collections.<WordListInfo>emptyList();
}
if (c.getCount() <= 0 || !c.moveToFirst()) {
c.close();
return Collections.<WordListInfo>emptyList();
}
try { try {
final ContentResolver resolver = context.getContentResolver();
final String clientId = context.getString(R.string.dictionary_pack_client_id);
final Uri.Builder builder = getProviderUriBuilder(clientId);
builder.appendPath(QUERY_PATH_DICT_INFO);
builder.appendPath(locale.toString());
builder.appendQueryParameter(QUERY_PARAMETER_PROTOCOL, QUERY_PARAMETER_PROTOCOL_VALUE);
if (!hasDefaultWordList) {
builder.appendQueryParameter(QUERY_PARAMETER_MAY_PROMPT_USER,
QUERY_PARAMETER_TRUE);
}
final Uri dictionaryPackUri = builder.build();
final Cursor c = resolver.query(dictionaryPackUri, DICTIONARY_PROJECTION, null, null,
null);
if (null == c) {
if (isDictionaryPackPresent(context)) {
reinitializeClientRecordInDictionaryContentProvider(context, resolver,
clientId);
}
return Collections.<WordListInfo>emptyList();
}
if (c.getCount() <= 0 || !c.moveToFirst()) {
c.close();
return Collections.<WordListInfo>emptyList();
}
final List<WordListInfo> list = CollectionUtils.newArrayList(); final List<WordListInfo> list = CollectionUtils.newArrayList();
do { do {
final String wordListId = c.getString(0); final String wordListId = c.getString(0);
@ -130,6 +152,13 @@ public final class BinaryDictionaryFileDumper {
} while (c.moveToNext()); } while (c.moveToNext());
c.close(); c.close();
return list; return list;
} catch (IllegalArgumentException e) {
// Since we are testing for the dictionary pack presence before doing anything that may
// crash, it's probably impossible for the code to come here. However it's very
// dangerous because crashing here would brick any encrypted device - we need the
// keyboard to be up and working to enter the password. So let's be as safe as possible.
Log.e(TAG, "IllegalArgumentException: the dictionary pack can't be contacted?", e);
return Collections.<WordListInfo>emptyList();
} catch (Exception e) { } catch (Exception e) {
// Just in case we hit a problem in communication with the dictionary pack. // Just in case we hit a problem in communication with the dictionary pack.
// We don't want to die. // We don't want to die.