diff options
-rw-r--r-- | src/com/android/providers/contacts/ContactsDatabaseHelper.java | 200 | ||||
-rw-r--r-- | src/com/android/providers/contacts/ContactsProvider2.java | 132 |
2 files changed, 208 insertions, 124 deletions
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java index 20d0b2a..e9720c3 100644 --- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java +++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java @@ -61,7 +61,7 @@ import java.util.HashMap; /* package */ class ContactsDatabaseHelper extends SQLiteOpenHelper { private static final String TAG = "ContactsDatabaseHelper"; - private static final int DATABASE_VERSION = 99; + private static final int DATABASE_VERSION = 100; private static final String DATABASE_NAME = "contacts2.db"; private static final String DATABASE_PRESENCE = "presence_db"; @@ -1002,62 +1002,7 @@ import java.util.HashMap; StatusUpdates.STATUS_ICON + " INTEGER" + ");"); - String contactEntitiesSelect = "SELECT " - + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " AS " + RawContacts.ACCOUNT_NAME + "," - + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " AS " + RawContacts.ACCOUNT_TYPE + "," - + RawContactsColumns.CONCRETE_SOURCE_ID + " AS " + RawContacts.SOURCE_ID + "," - + RawContactsColumns.CONCRETE_VERSION + " AS " + RawContacts.VERSION + "," - + RawContactsColumns.CONCRETE_DIRTY + " AS " + RawContacts.DIRTY + "," - + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," - + PackagesColumns.PACKAGE + " AS " + Data.RES_PACKAGE + "," - + RawContacts.CONTACT_ID + ", " - + RawContactsColumns.CONCRETE_SYNC1 + " AS " + RawContacts.SYNC1 + ", " - + RawContactsColumns.CONCRETE_SYNC2 + " AS " + RawContacts.SYNC2 + ", " - + RawContactsColumns.CONCRETE_SYNC3 + " AS " + RawContacts.SYNC3 + ", " - + RawContactsColumns.CONCRETE_SYNC4 + " AS " + RawContacts.SYNC4 + ", " - + Data.MIMETYPE + ", " - + Data.DATA1 + ", " - + Data.DATA2 + ", " - + Data.DATA3 + ", " - + Data.DATA4 + ", " - + Data.DATA5 + ", " - + Data.DATA6 + ", " - + Data.DATA7 + ", " - + Data.DATA8 + ", " - + Data.DATA9 + ", " - + Data.DATA10 + ", " - + Data.DATA11 + ", " - + Data.DATA12 + ", " - + Data.DATA13 + ", " - + Data.DATA14 + ", " - + Data.DATA15 + ", " - + Data.SYNC1 + ", " - + Data.SYNC2 + ", " - + Data.SYNC3 + ", " - + Data.SYNC4 + ", " - + RawContactsColumns.CONCRETE_ID + " AS " + Data.RAW_CONTACT_ID + ", " - + Data.IS_PRIMARY + ", " - + Data.IS_SUPER_PRIMARY + ", " - + Data.DATA_VERSION + ", " - + DataColumns.CONCRETE_ID + " AS " + RawContacts._ID + "," - + RawContactsColumns.CONCRETE_STARRED + " AS " + RawContacts.STARRED + "," - + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID - + " FROM " + Tables.RAW_CONTACTS - + " LEFT OUTER JOIN " + Tables.DATA + " ON (" - + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" - + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" - + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" - + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" - + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" - + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" - + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE - + "' AND " + GroupsColumns.CONCRETE_ID + "=" - + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; - - db.execSQL("CREATE VIEW " + Tables.CONTACT_ENTITIES + " AS " - + contactEntitiesSelect); - db.execSQL("CREATE VIEW " + Tables.CONTACT_ENTITIES_RESTRICTED + " AS " - + contactEntitiesSelect + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); + createContactEntitiesView(db); String dataColumns = Data.IS_PRIMARY + ", " @@ -1236,42 +1181,117 @@ import java.util.HashMap; ContactsContract.AUTHORITY, new Bundle()); } + private static void createContactEntitiesView(SQLiteDatabase db) { + String contactEntitiesSelect = "SELECT " + + RawContactsColumns.CONCRETE_ACCOUNT_NAME + " AS " + RawContacts.ACCOUNT_NAME + "," + + RawContactsColumns.CONCRETE_ACCOUNT_TYPE + " AS " + RawContacts.ACCOUNT_TYPE + "," + + RawContactsColumns.CONCRETE_SOURCE_ID + " AS " + RawContacts.SOURCE_ID + "," + + RawContactsColumns.CONCRETE_VERSION + " AS " + RawContacts.VERSION + "," + + RawContactsColumns.CONCRETE_DIRTY + " AS " + RawContacts.DIRTY + "," + + RawContactsColumns.CONCRETE_DELETED + " AS " + RawContacts.DELETED + "," + + PackagesColumns.PACKAGE + " AS " + Data.RES_PACKAGE + "," + + RawContacts.CONTACT_ID + ", " + + RawContactsColumns.CONCRETE_SYNC1 + " AS " + RawContacts.SYNC1 + ", " + + RawContactsColumns.CONCRETE_SYNC2 + " AS " + RawContacts.SYNC2 + ", " + + RawContactsColumns.CONCRETE_SYNC3 + " AS " + RawContacts.SYNC3 + ", " + + RawContactsColumns.CONCRETE_SYNC4 + " AS " + RawContacts.SYNC4 + ", " + + Data.MIMETYPE + ", " + + Data.DATA1 + ", " + + Data.DATA2 + ", " + + Data.DATA3 + ", " + + Data.DATA4 + ", " + + Data.DATA5 + ", " + + Data.DATA6 + ", " + + Data.DATA7 + ", " + + Data.DATA8 + ", " + + Data.DATA9 + ", " + + Data.DATA10 + ", " + + Data.DATA11 + ", " + + Data.DATA12 + ", " + + Data.DATA13 + ", " + + Data.DATA14 + ", " + + Data.DATA15 + ", " + + Data.SYNC1 + ", " + + Data.SYNC2 + ", " + + Data.SYNC3 + ", " + + Data.SYNC4 + ", " + + RawContactsColumns.CONCRETE_ID + " AS " + RawContacts._ID + ", " + + Data.IS_PRIMARY + ", " + + Data.IS_SUPER_PRIMARY + ", " + + Data.DATA_VERSION + ", " + + DataColumns.CONCRETE_ID + " AS " + RawContacts.Entity.DATA_ID + "," + + RawContactsColumns.CONCRETE_STARRED + " AS " + RawContacts.STARRED + "," + + Tables.GROUPS + "." + Groups.SOURCE_ID + " AS " + GroupMembership.GROUP_SOURCE_ID + + " FROM " + Tables.RAW_CONTACTS + + " LEFT OUTER JOIN " + Tables.DATA + " ON (" + + DataColumns.CONCRETE_RAW_CONTACT_ID + "=" + RawContactsColumns.CONCRETE_ID + ")" + + " LEFT OUTER JOIN " + Tables.PACKAGES + " ON (" + + DataColumns.CONCRETE_PACKAGE_ID + "=" + PackagesColumns.CONCRETE_ID + ")" + + " LEFT OUTER JOIN " + Tables.MIMETYPES + " ON (" + + DataColumns.CONCRETE_MIMETYPE_ID + "=" + MimetypesColumns.CONCRETE_ID + ")" + + " LEFT OUTER JOIN " + Tables.GROUPS + " ON (" + + MimetypesColumns.CONCRETE_MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + + "' AND " + GroupsColumns.CONCRETE_ID + "=" + + Tables.DATA + "." + GroupMembership.GROUP_ROW_ID + ")"; + + db.execSQL("CREATE VIEW " + Tables.CONTACT_ENTITIES + " AS " + + contactEntitiesSelect); + db.execSQL("CREATE VIEW " + Tables.CONTACT_ENTITIES_RESTRICTED + " AS " + + contactEntitiesSelect + " WHERE " + RawContacts.IS_RESTRICTED + "=0"); + } + @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + if (oldVersion < 99) { + Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion + + ", data will be lost!"); + + db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.RAW_CONTACTS + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.PACKAGES + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.MIMETYPES + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.DATA + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.PHONE_LOOKUP + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.NAME_LOOKUP + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.NICKNAME_LOOKUP + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.GROUPS + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.ACTIVITIES + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.CALLS + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.SETTINGS + ";"); + db.execSQL("DROP TABLE IF EXISTS " + Tables.STATUS_UPDATES + ";"); + + db.execSQL("DROP VIEW IF EXISTS " + Tables.CONTACT_ENTITIES + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Tables.CONTACT_ENTITIES_RESTRICTED + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_ALL + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_RESTRICTED + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_ALL + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_RESTRICTED + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_ALL + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_RESTRICTED + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Views.GROUPS_ALL + ";"); + + // TODO: we should not be dropping agg_exceptions and contact_options. In case that + // table's schema changes, we should try to preserve the data, because it was entered + // by the user and has never been synched to the server. + db.execSQL("DROP TABLE IF EXISTS " + Tables.AGGREGATION_EXCEPTIONS + ";"); + + onCreate(db); + return; + } - Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion - + ", data will be lost!"); - - db.execSQL("DROP TABLE IF EXISTS " + Tables.CONTACTS + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.RAW_CONTACTS + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.PACKAGES + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.MIMETYPES + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.DATA + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.PHONE_LOOKUP + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.NAME_LOOKUP + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.NICKNAME_LOOKUP + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.GROUPS + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.ACTIVITIES + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.CALLS + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.SETTINGS + ";"); - db.execSQL("DROP TABLE IF EXISTS " + Tables.STATUS_UPDATES + ";"); - - db.execSQL("DROP VIEW IF EXISTS " + Tables.CONTACT_ENTITIES + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Tables.CONTACT_ENTITIES_RESTRICTED + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_ALL + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.CONTACTS_RESTRICTED + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_ALL + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.DATA_RESTRICTED + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_ALL + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.RAW_CONTACTS_RESTRICTED + ";"); - db.execSQL("DROP VIEW IF EXISTS " + Views.GROUPS_ALL + ";"); - - // TODO: we should not be dropping agg_exceptions and contact_options. In case that table's - // schema changes, we should try to preserve the data, because it was entered by the user - // and has never been synched to the server. - db.execSQL("DROP TABLE IF EXISTS " + Tables.AGGREGATION_EXCEPTIONS + ";"); - - onCreate(db); + Log.i(TAG, "Upgrading from version " + oldVersion + " to " + newVersion); + + if (oldVersion == 99) { + db.execSQL("DROP VIEW IF EXISTS " + Tables.CONTACT_ENTITIES + ";"); + db.execSQL("DROP VIEW IF EXISTS " + Tables.CONTACT_ENTITIES_RESTRICTED + ";"); + createContactEntitiesView(db); + oldVersion++; + } + + if (oldVersion != newVersion) { + throw new IllegalStateException( + "error upgrading the database to version " + newVersion); + } } /** diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java index 3496a18..e1d26c5 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -167,6 +167,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private static final int RAW_CONTACTS = 2002; private static final int RAW_CONTACTS_ID = 2003; private static final int RAW_CONTACTS_DATA = 2004; + private static final int RAW_CONTACT_ENTITY_ID = 2005; private static final int DATA = 3000; private static final int DATA_ID = 3001; @@ -207,6 +208,8 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private static final int LIVE_FOLDERS_CONTACTS_FAVORITES = 14002; private static final int LIVE_FOLDERS_CONTACTS_GROUP_NAME = 14003; + private static final int RAW_CONTACT_ENTITIES = 15001; + private interface ContactsQuery { public static final String TABLE = Tables.RAW_CONTACTS; @@ -348,6 +351,8 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private static final HashMap<String, String> sContactsVCardProjectionMap; /** Contains just the raw contacts columns */ private static final HashMap<String, String> sRawContactsProjectionMap; + /** Contains the columns from the raw contacts entity view*/ + private static final HashMap<String, String> sRawContactsEntityProjectionMap; /** Contains columns from the data view */ private static final HashMap<String, String> sDataProjectionMap; /** Contains columns from the data view */ @@ -414,6 +419,9 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts", RAW_CONTACTS); matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#", RAW_CONTACTS_ID); matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/data", RAW_CONTACTS_DATA); + matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/entity", RAW_CONTACT_ENTITY_ID); + + matcher.addURI(ContactsContract.AUTHORITY, "raw_contact_entities", RAW_CONTACT_ENTITIES); matcher.addURI(ContactsContract.AUTHORITY, "data", DATA); matcher.addURI(ContactsContract.AUTHORITY, "data/#", DATA_ID); @@ -565,6 +573,49 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun sDataProjectionMap.put(Contacts.PHOTO_ID, Contacts.PHOTO_ID); sDataProjectionMap.put(GroupMembership.GROUP_SOURCE_ID, GroupMembership.GROUP_SOURCE_ID); + HashMap<String, String> columns; + columns = new HashMap<String, String>(); + columns.put(RawContacts._ID, RawContacts._ID); + columns.put(RawContacts.CONTACT_ID, RawContacts.CONTACT_ID); + columns.put(RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_NAME); + columns.put(RawContacts.ACCOUNT_TYPE, RawContacts.ACCOUNT_TYPE); + columns.put(RawContacts.SOURCE_ID, RawContacts.SOURCE_ID); + columns.put(RawContacts.VERSION, RawContacts.VERSION); + columns.put(RawContacts.DIRTY, RawContacts.DIRTY); + columns.put(RawContacts.DELETED, RawContacts.DELETED); + columns.put(RawContacts.SYNC1, RawContacts.SYNC1); + columns.put(RawContacts.SYNC2, RawContacts.SYNC2); + columns.put(RawContacts.SYNC3, RawContacts.SYNC3); + columns.put(RawContacts.SYNC4, RawContacts.SYNC4); + columns.put(Data.RES_PACKAGE, Data.RES_PACKAGE); + columns.put(Data.MIMETYPE, Data.MIMETYPE); + columns.put(Data.DATA1, Data.DATA1); + columns.put(Data.DATA2, Data.DATA2); + columns.put(Data.DATA3, Data.DATA3); + columns.put(Data.DATA4, Data.DATA4); + columns.put(Data.DATA5, Data.DATA5); + columns.put(Data.DATA6, Data.DATA6); + columns.put(Data.DATA7, Data.DATA7); + columns.put(Data.DATA8, Data.DATA8); + columns.put(Data.DATA9, Data.DATA9); + columns.put(Data.DATA10, Data.DATA10); + columns.put(Data.DATA11, Data.DATA11); + columns.put(Data.DATA12, Data.DATA12); + columns.put(Data.DATA13, Data.DATA13); + columns.put(Data.DATA14, Data.DATA14); + columns.put(Data.DATA15, Data.DATA15); + columns.put(Data.SYNC1, Data.SYNC1); + columns.put(Data.SYNC2, Data.SYNC2); + columns.put(Data.SYNC3, Data.SYNC3); + columns.put(Data.SYNC4, Data.SYNC4); + columns.put(RawContacts.Entity.DATA_ID, RawContacts.Entity.DATA_ID); + columns.put(Data.STARRED, Data.STARRED); + columns.put(Data.DATA_VERSION, Data.DATA_VERSION); + columns.put(Data.IS_PRIMARY, Data.IS_PRIMARY); + columns.put(Data.IS_SUPER_PRIMARY, Data.IS_SUPER_PRIMARY); + columns.put(GroupMembership.GROUP_SOURCE_ID, GroupMembership.GROUP_SOURCE_ID); + sRawContactsEntityProjectionMap = columns; + // Handle projections for Contacts-level statuses addProjection(sDataProjectionMap, Contacts.CONTACT_PRESENCE, Tables.AGGREGATED_PRESENCE + "." + StatusUpdates.PRESENCE); @@ -693,8 +744,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun sPhoneLookupProjectionMap.put(PhoneLookup.LABEL, Phone.LABEL + " AS " + PhoneLookup.LABEL); - HashMap<String, String> columns; - // Groups projection map columns = new HashMap<String, String>(); columns.put(Groups._ID, Groups._ID); @@ -2648,7 +2697,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun } } - private boolean readBooleanQueryParameter(Uri uri, String name, boolean defaultValue) { + private static boolean readBooleanQueryParameter(Uri uri, String name, boolean defaultValue) { final String flag = uri.getQueryParameter(name); return flag == null ? defaultValue @@ -3632,6 +3681,18 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun selectionArgs = insertSelectionArg(selectionArgs, uri.getLastPathSegment()); break; + case RAW_CONTACT_ENTITIES: { + setTablesAndProjectionMapForRawContactsEntities(qb, uri); + break; + } + + case RAW_CONTACT_ENTITY_ID: { + long rawContactId = Long.parseLong(uri.getPathSegments().get(1)); + setTablesAndProjectionMapForRawContactsEntities(qb, uri); + qb.appendWhere(" AND " + RawContacts._ID + "=" + rawContactId); + break; + } + default: return mLegacyApiSupport.query(uri, projection, selection, selectionArgs, sortOrder, limit); @@ -3883,6 +3944,22 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun appendAccountFromParameter(qb, uri); } + private void setTablesAndProjectionMapForRawContactsEntities(SQLiteQueryBuilder qb, Uri uri) { + // Note: currently, "export only" equals to "restricted", but may not in the future. + boolean excludeRestrictedData = readBooleanQueryParameter(uri, + Data.FOR_EXPORT_ONLY, false); + + String requestingPackage = uri.getQueryParameter( + ContactsContract.REQUESTING_PACKAGE_PARAM_KEY); + if (requestingPackage != null) { + excludeRestrictedData = excludeRestrictedData + || !mDbHelper.hasAccessToRestrictedData(requestingPackage); + } + qb.setTables(mDbHelper.getContactEntitiesView(excludeRestrictedData)); + qb.setProjectionMap(sRawContactsEntityProjectionMap); + appendAccountFromParameter(qb, uri); + } + private void setTablesAndProjectionMapForData(SQLiteQueryBuilder qb, Uri uri, String[] projection, boolean distinct) { StringBuilder sb = new StringBuilder(); @@ -4200,13 +4277,13 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun Data.SYNC3, Data.SYNC4}; - private static final String[] PROJECTION = new String[]{ + public static final String[] PROJECTION = new String[]{ RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE, RawContacts.SOURCE_ID, RawContacts.VERSION, RawContacts.DIRTY, - Data._ID, + RawContacts.Entity.DATA_ID, Data.RES_PACKAGE, Data.MIMETYPE, Data.DATA1, @@ -4228,7 +4305,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun Data.SYNC2, Data.SYNC3, Data.SYNC4, - Data.RAW_CONTACT_ID, + RawContacts._ID, Data.IS_PRIMARY, Data.IS_SUPER_PRIMARY, Data.DATA_VERSION, @@ -4263,35 +4340,22 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun private static final int COLUMN_CONTACT_ID = 37; private static final int COLUMN_STARRED = 38; - public RawContactsEntityIterator(ContactsProvider2 provider, String contactsIdString, - Uri uri, String selection, String[] selectionArgs, String sortOrder) { + public RawContactsEntityIterator(ContactsProvider2 provider, Uri entityUri, + String contactsIdString, + String selection, String[] selectionArgs, String sortOrder) { mIsClosed = false; - - final String updatedSortOrder = (sortOrder == null) - ? Data.RAW_CONTACT_ID - : (Data.RAW_CONTACT_ID + "," + sortOrder); - - final SQLiteDatabase db = provider.mDbHelper.getReadableDatabase(); - final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); - final boolean excludeRestrictedData = - provider.readBooleanQueryParameter(uri, Data.FOR_EXPORT_ONLY, false); - qb.setTables(provider.mDbHelper.getContactEntitiesView(excludeRestrictedData)); + Uri uri; if (contactsIdString != null) { - qb.appendWhere(Data.RAW_CONTACT_ID + "=" + contactsIdString); - } - final String accountName = uri.getQueryParameter(RawContacts.ACCOUNT_NAME); - final String accountType = uri.getQueryParameter(RawContacts.ACCOUNT_TYPE); - if (!TextUtils.isEmpty(accountName)) { - if (contactsIdString != null) { - qb.appendWhere(" AND "); - } - qb.appendWhere(RawContacts.ACCOUNT_NAME + "=" - + DatabaseUtils.sqlEscapeString(accountName) + " AND " - + RawContacts.ACCOUNT_TYPE + "=" - + DatabaseUtils.sqlEscapeString(accountType)); + uri = Uri.withAppendedPath(RawContacts.CONTENT_URI, contactsIdString); + uri = Uri.withAppendedPath(uri, RawContacts.Entity.CONTENT_DIRECTORY); + } else { + uri = ContactsContract.RawContactsEntity.CONTENT_URI; } - mEntityCursor = qb.query(db, PROJECTION, selection, selectionArgs, - null, null, updatedSortOrder); + final Uri.Builder builder = uri.buildUpon(); + String query = entityUri.getQuery(); + builder.encodedQuery(query); + mEntityCursor = provider.query(builder.build(), + PROJECTION, selection, selectionArgs, sortOrder); mEntityCursor.moveToFirst(); } @@ -4542,8 +4606,8 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun contactsIdString = uri.getPathSegments().get(1); } - return new RawContactsEntityIterator(this, contactsIdString, - uri, selection, selectionArgs, sortOrder); + return new RawContactsEntityIterator(this, uri, contactsIdString, + selection, selectionArgs, sortOrder); case GROUPS: case GROUPS_ID: String idString = null; |