diff options
author | Yorke Lee <yorkelee@google.com> | 2014-02-27 18:22:03 -0800 |
---|---|---|
committer | Jay Shrauner <shrauner@google.com> | 2014-03-04 02:55:12 +0000 |
commit | d126f8742c663ef364b19269ddc4ea4c56d986f0 (patch) | |
tree | 846992748c8db554948e237b822ac47ad3f5927d | |
parent | a9d3960f4a555ff9c84eddf22904911d7d32d457 (diff) |
Fix Dialer OOM when building smart dialling index
If a contacts database had contacts comprising an unreasonably large
(> more than 50) raw contacts, querying for these lookup keys was likely
to cause problems.
Bug: 13133579
Change-Id: I26334dfce583eeaa1c7b8db7c03b7f847534de1b
(cherry picked from commit e3c7e425aa9260493d83a9b777dbf488a893c1f5)
-rw-r--r-- | src/com/android/dialer/database/DialerDatabaseHelper.java | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/com/android/dialer/database/DialerDatabaseHelper.java b/src/com/android/dialer/database/DialerDatabaseHelper.java index d3897c266..f6f5f6c3a 100644 --- a/src/com/android/dialer/database/DialerDatabaseHelper.java +++ b/src/com/android/dialer/database/DialerDatabaseHelper.java @@ -163,6 +163,17 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper { /** Selects only rows that have been updated after a certain time stamp.*/ static final String SELECT_UPDATED_CLAUSE = Phone.CONTACT_LAST_UPDATED_TIMESTAMP + " > ?"; + + /** Ignores contacts that have an unreasonably long lookup key. These are likely to be + * the result of multiple (> 50) merged raw contacts, and are likely to cause + * OutOfMemoryExceptions within SQLite, or cause memory allocation problems later on + * when iterating through the cursor set (see b/13133579) + */ + static final String SELECT_IGNORE_LOOKUP_KEY_TOO_LONG_CLAUSE = + "length(" + Phone.LOOKUP_KEY + ") < 1000"; + + static final String SELECTION = SELECT_UPDATED_CLAUSE + " AND " + + SELECT_IGNORE_LOOKUP_KEY_TOO_LONG_CLAUSE; } /** Query options for querying the deleted contact database.*/ @@ -658,7 +669,6 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper { } else { insert.bindString(5, displayName); } - insert.bindLong(1, updatedContactCursor.getLong(PhoneQuery.PHONE_ID)); insert.bindLong(3, updatedContactCursor.getLong(PhoneQuery.PHONE_CONTACT_ID)); insert.bindLong(6, updatedContactCursor.getLong(PhoneQuery.PHONE_PHOTO_ID)); @@ -758,7 +768,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper { * update time. */ final Cursor updatedContactCursor = mContext.getContentResolver().query(PhoneQuery.URI, - PhoneQuery.PROJECTION, PhoneQuery.SELECT_UPDATED_CLAUSE, + PhoneQuery.PROJECTION, PhoneQuery.SELECTION, new String[]{lastUpdateMillis}, null); /** Sets the time after querying the database as the current update time. */ |