Fix LatinIME crashing due to crash in Contacts DB

bug: 2895391
Change-Id: I3a0628942b74556f8b600b63ebc5d808fb2f0abd
main
Ken Wakasa 2010-08-20 20:09:58 +09:00
parent 17dc363a63
commit 78c4611719
1 changed files with 47 additions and 38 deletions

View File

@ -32,6 +32,8 @@ public class ContactsDictionary extends ExpandableDictionary {
Contacts.DISPLAY_NAME, Contacts.DISPLAY_NAME,
}; };
private static final String TAG = "ContactsDictionary";
/** /**
* Frequency for contacts information into the dictionary * Frequency for contacts information into the dictionary
*/ */
@ -80,10 +82,14 @@ public class ContactsDictionary extends ExpandableDictionary {
@Override @Override
public void loadDictionaryAsync() { public void loadDictionaryAsync() {
Cursor cursor = getContext().getContentResolver() try {
.query(Contacts.CONTENT_URI, PROJECTION, null, null, null); Cursor cursor = getContext().getContentResolver()
if (cursor != null) { .query(Contacts.CONTENT_URI, PROJECTION, null, null, null);
addWords(cursor); if (cursor != null) {
addWords(cursor);
}
} catch(IllegalStateException e) {
Log.e(TAG, "Contacts DB is having problems");
} }
mLastLoadedContacts = SystemClock.uptimeMillis(); mLastLoadedContacts = SystemClock.uptimeMillis();
} }
@ -92,52 +98,55 @@ public class ContactsDictionary extends ExpandableDictionary {
clearDictionary(); clearDictionary();
final int maxWordLength = getMaxWordLength(); final int maxWordLength = getMaxWordLength();
if (cursor.moveToFirst()) { try {
while (!cursor.isAfterLast()) { if (cursor.moveToFirst()) {
String name = cursor.getString(INDEX_NAME); while (!cursor.isAfterLast()) {
String name = cursor.getString(INDEX_NAME);
if (name != null) { if (name != null) {
int len = name.length(); int len = name.length();
String prevWord = null; String prevWord = null;
// TODO: Better tokenization for non-Latin writing systems // TODO: Better tokenization for non-Latin writing systems
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
if (Character.isLetter(name.charAt(i))) { if (Character.isLetter(name.charAt(i))) {
int j; int j;
for (j = i + 1; j < len; j++) { for (j = i + 1; j < len; j++) {
char c = name.charAt(j); char c = name.charAt(j);
if (!(c == '-' || c == '\'' || if (!(c == '-' || c == '\'' ||
Character.isLetter(c))) { Character.isLetter(c))) {
break; break;
}
} }
}
String word = name.substring(i, j); String word = name.substring(i, j);
i = j - 1; i = j - 1;
// Safeguard against adding really long words. Stack // Safeguard against adding really long words. Stack
// may overflow due to recursion // may overflow due to recursion
// Also don't add single letter words, possibly confuses // Also don't add single letter words, possibly confuses
// capitalization of i. // capitalization of i.
final int wordLen = word.length(); final int wordLen = word.length();
if (wordLen < maxWordLength && wordLen > 1) { if (wordLen < maxWordLength && wordLen > 1) {
super.addWord(word, FREQUENCY_FOR_CONTACTS); super.addWord(word, FREQUENCY_FOR_CONTACTS);
if (!TextUtils.isEmpty(prevWord)) { if (!TextUtils.isEmpty(prevWord)) {
// TODO Do not add email address // TODO Do not add email address
// Not so critical // Not so critical
super.setBigram(prevWord, word, FREQUENCY_FOR_CONTACTS_BIGRAM); super.setBigram(prevWord, word,
FREQUENCY_FOR_CONTACTS_BIGRAM);
}
prevWord = word;
} }
prevWord = word;
} }
} }
} }
cursor.moveToNext();
} }
cursor.moveToNext();
} }
cursor.close();
} catch(IllegalStateException e) {
Log.e(TAG, "Contacts DB is having problems");
} }
cursor.close();
} }
} }