aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2013-02-11 11:52:34 -0800
committerJean Chalard <jchalard@google.com>2013-02-11 12:38:24 -0800
commitb2eac474ff82d0dad41991cd0f1ae80a58f01be2 (patch)
tree4412778963f998794501c2473a35a2b05bf1c84b /java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
parenta92a97d2cd0657a36112f525c3e1e719415ad0b3 (diff)
downloadlatinime-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.java71
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.