diff options
author | 2013-02-11 11:52:34 -0800 | |
---|---|---|
committer | 2013-02-11 12:38:24 -0800 | |
commit | b2eac474ff82d0dad41991cd0f1ae80a58f01be2 (patch) | |
tree | 4412778963f998794501c2473a35a2b05bf1c84b /java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java | |
parent | a92a97d2cd0657a36112f525c3e1e719415ad0b3 (diff) | |
download | latinime-b2eac474ff82d0dad41991cd0f1ae80a58f01be2.tar.gz latinime-b2eac474ff82d0dad41991cd0f1ae80a58f01be2.tar.xz latinime-b2eac474ff82d0dad41991cd0f1ae80a58f01be2.zip |
Don't try to issue delete() commands on missing provider
Bug: 8173622
Change-Id: Id3dc510ae3535169b5290e87075cb2f433a1f603
Diffstat (limited to 'java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java')
-rw-r--r-- | java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java index 4a8752e43..be7729ce5 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java @@ -16,6 +16,7 @@ package com.android.inputmethod.latin; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; @@ -94,33 +95,54 @@ public final class BinaryDictionaryFileDumper { } /** + * 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 * available to copy into Latin IME. */ private static List<WordListInfo> getWordListWordListInfos(final Locale locale, 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 { + 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(); do { final String wordListId = c.getString(0); @@ -130,6 +152,13 @@ public final class BinaryDictionaryFileDumper { } while (c.moveToNext()); c.close(); 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) { // Just in case we hit a problem in communication with the dictionary pack. // We don't want to die. |