Catch SQLiteException from remote processes

...to avoid catching fire when the Contacts or User dictionary
providers crash and burn.

Bug: 10200036
Change-Id: I73e9d126ce6d34ebc7e6ac03d94af1c12dde7eda
main
Jean Chalard 2013-09-20 19:31:39 +09:00
parent 3de1aca289
commit d0cf6b7623
2 changed files with 29 additions and 12 deletions

View File

@ -22,6 +22,7 @@ import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri; import android.net.Uri;
import android.os.SystemClock; import android.os.SystemClock;
import android.provider.BaseColumns; import android.provider.BaseColumns;
@ -145,8 +146,10 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
cursor.close(); cursor.close();
} }
} }
} catch (IllegalStateException e) { } catch (final SQLiteException e) {
Log.e(TAG, "Contacts DB is having problems"); Log.e(TAG, "SQLiteException in the remote Contacts process.", e);
} catch (final IllegalStateException e) {
Log.e(TAG, "Contacts DB is having problems", e);
} }
} }
@ -173,14 +176,18 @@ public class ContactsBinaryDictionary extends ExpandableBinaryDictionary {
private int getContactCount() { private int getContactCount() {
// TODO: consider switching to a rawQuery("select count(*)...") on the database if // TODO: consider switching to a rawQuery("select count(*)...") on the database if
// performance is a bottleneck. // performance is a bottleneck.
final Cursor cursor = mContext.getContentResolver().query( try {
Contacts.CONTENT_URI, PROJECTION_ID_ONLY, null, null, null); final Cursor cursor = mContext.getContentResolver().query(
if (cursor != null) { Contacts.CONTENT_URI, PROJECTION_ID_ONLY, null, null, null);
try { if (cursor != null) {
return cursor.getCount(); try {
} finally { return cursor.getCount();
cursor.close(); } finally {
cursor.close();
}
} }
} catch (final SQLiteException e) {
Log.e(TAG, "SQLiteException in the remote Contacts process.", e);
} }
return 0; return 0;
} }

View File

@ -22,10 +22,12 @@ import android.content.ContentUris;
import android.content.Context; import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.provider.UserDictionary.Words; import android.provider.UserDictionary.Words;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import com.android.inputmethod.compat.UserDictionaryCompatUtils; import com.android.inputmethod.compat.UserDictionaryCompatUtils;
import com.android.inputmethod.latin.utils.LocaleUtils; import com.android.inputmethod.latin.utils.LocaleUtils;
@ -39,6 +41,7 @@ import java.util.Locale;
* dictionary file to use it from native code. * dictionary file to use it from native code.
*/ */
public class UserBinaryDictionary extends ExpandableBinaryDictionary { public class UserBinaryDictionary extends ExpandableBinaryDictionary {
private static final String TAG = ExpandableBinaryDictionary.class.getSimpleName();
// The user dictionary provider uses an empty string to mean "all languages". // The user dictionary provider uses an empty string to mean "all languages".
private static final String USER_DICTIONARY_ALL_LANGUAGES = ""; private static final String USER_DICTIONARY_ALL_LANGUAGES = "";
@ -168,12 +171,19 @@ public class UserBinaryDictionary extends ExpandableBinaryDictionary {
} else { } else {
requestArguments = localeElements; requestArguments = localeElements;
} }
final Cursor cursor = mContext.getContentResolver().query( Cursor cursor = null;
Words.CONTENT_URI, PROJECTION_QUERY, request.toString(), requestArguments, null);
try { try {
cursor = mContext.getContentResolver().query(
Words.CONTENT_URI, PROJECTION_QUERY, request.toString(), requestArguments, null);
addWords(cursor); addWords(cursor);
} catch (final SQLiteException e) {
Log.e(TAG, "SQLiteException in the remote User dictionary process.", e);
} finally { } finally {
if (null != cursor) cursor.close(); try {
if (null != cursor) cursor.close();
} catch (final SQLiteException e) {
Log.e(TAG, "SQLiteException in the remote User dictionary process.", e);
}
} }
} }