diff options
author | Dmitri Plotnikov <dplotnikov@google.com> | 2009-09-25 20:10:02 -0700 |
---|---|---|
committer | Dmitri Plotnikov <dplotnikov@google.com> | 2009-09-25 20:10:52 -0700 |
commit | 71e051c79a57af70ec7b095074c3e7faf9507b52 (patch) | |
tree | 8f23664dd39fde65340b566c608b42d203c00d9a /src | |
parent | dea2b6389abf1ae0448ae047b4b0a9e423381d77 (diff) | |
download | ContactsProvider-71e051c79a57af70ec7b095074c3e7faf9507b52.tar.gz |
[Issue 2148072] Adding support for non-public legacy API content://contacts/groups/name/*/members
Change-Id: Ia5128b55bb393fde186e95da086c32508374c035
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/providers/contacts/ContactsProvider2.java | 33 | ||||
-rw-r--r-- | src/com/android/providers/contacts/LegacyApiSupport.java | 32 |
2 files changed, 47 insertions, 18 deletions
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java index 67419e6a..b55aeb7e 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -314,6 +314,20 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun public static final String DEFAULT_ACCOUNT_TYPE = "com.google.GAIA"; public static final String FEATURE_LEGACY_HOSTED_OR_GOOGLE = "legacy_hosted_or_google"; + /** Sql where statement for filtering on groups. */ + private static final String CONTACTS_IN_GROUP_SELECT = + Contacts._ID + " IN " + + "(SELECT " + RawContacts.CONTACT_ID + + " FROM " + Tables.RAW_CONTACTS + + " WHERE " + RawContactsColumns.CONCRETE_ID + " IN " + + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID + + " FROM " + Tables.DATA_JOIN_MIMETYPES + + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + + "' AND " + GroupMembership.GROUP_ROW_ID + "=" + + "(SELECT " + Tables.GROUPS + "." + Groups._ID + + " FROM " + Tables.GROUPS + + " WHERE " + Groups.TITLE + "=?)))"; + /** Contains just BaseColumns._COUNT */ private static final HashMap<String, String> sCountProjectionMap; /** Contains just the contacts columns */ @@ -343,9 +357,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun /** Contains Live Folders columns */ private static final HashMap<String, String> sLiveFoldersProjectionMap; - /** Sql where statement for filtering on groups. */ - private static final String sContactsInGroupSelect; - /** Precompiled sql statement for setting a data record to the primary. */ private SQLiteStatement mSetPrimaryStatement; /** Precompiled sql statement for setting a data record to the super primary. */ @@ -718,18 +729,6 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun // for contacts without a photo // sLiveFoldersProjectionMap.put(LiveFolders.ICON_BITMAP, // Photos.DATA + " AS " + LiveFolders.ICON_BITMAP); - - sContactsInGroupSelect = Contacts._ID + " IN " - + "(SELECT " + RawContacts.CONTACT_ID - + " FROM " + Tables.RAW_CONTACTS - + " WHERE " + RawContactsColumns.CONCRETE_ID + " IN " - + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID - + " FROM " + Tables.DATA_JOIN_MIMETYPES - + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE - + "' AND " + GroupMembership.GROUP_ROW_ID + "=" - + "(SELECT " + Tables.GROUPS + "." + Groups._ID - + " FROM " + Tables.GROUPS - + " WHERE " + Groups.TITLE + "=?)))"; } /** @@ -3187,7 +3186,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun case CONTACTS_GROUP: { setTablesAndProjectionMapForContacts(qb, projection); if (uri.getPathSegments().size() > 2) { - qb.appendWhere(sContactsInGroupSelect); + qb.appendWhere(CONTACTS_IN_GROUP_SELECT); selectionArgs = insertSelectionArg(selectionArgs, uri.getLastPathSegment()); } break; @@ -3524,7 +3523,7 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun case LIVE_FOLDERS_CONTACTS_GROUP_NAME: qb.setTables(mOpenHelper.getContactView()); qb.setProjectionMap(sLiveFoldersProjectionMap); - qb.appendWhere(sContactsInGroupSelect); + qb.appendWhere(CONTACTS_IN_GROUP_SELECT); selectionArgs = insertSelectionArg(selectionArgs, uri.getLastPathSegment()); break; diff --git a/src/com/android/providers/contacts/LegacyApiSupport.java b/src/com/android/providers/contacts/LegacyApiSupport.java index fc010ed8..71a992ad 100644 --- a/src/com/android/providers/contacts/LegacyApiSupport.java +++ b/src/com/android/providers/contacts/LegacyApiSupport.java @@ -42,6 +42,7 @@ import android.provider.ContactsContract; import android.provider.Contacts.ContactMethods; import android.provider.Contacts.Extensions; import android.provider.Contacts.People; +import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.Groups; import android.provider.ContactsContract.Presence; @@ -106,6 +107,7 @@ public class LegacyApiSupport { private static final int LIVE_FOLDERS_PEOPLE_WITH_PHONES = 37; private static final int LIVE_FOLDERS_PEOPLE_FAVORITES = 38; private static final int CONTACTMETHODS_EMAIL = 39; + private static final int GROUP_NAME_MEMBERS = 40; private static final String PEOPLE_JOINS = " LEFT OUTER JOIN data name ON (raw_contacts._id = name.raw_contact_id" @@ -258,7 +260,7 @@ public class LegacyApiSupport { matcher.addURI(authority, "extensions/#", EXTENSIONS_ID); matcher.addURI(authority, "groups", GROUPS); matcher.addURI(authority, "groups/#", GROUPS_ID); -// matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); + matcher.addURI(authority, "groups/name/*/members", GROUP_NAME_MEMBERS); // matcher.addURI(authority, "groups/name/*/members/filter/*", // GROUP_NAME_MEMBERS_FILTER); // matcher.addURI(authority, "groups/system_id/*/members", GROUP_SYSTEM_ID_MEMBERS); @@ -1447,6 +1449,14 @@ public class LegacyApiSupport { break; } + case GROUP_NAME_MEMBERS: + qb.setTables(LegacyTables.PEOPLE_JOIN_PRESENCE); + qb.setProjectionMap(sPeopleProjectionMap); + applyRawContactsAccount(qb); + String group = uri.getPathSegments().get(2); + qb.appendWhere(" AND " + buildGroupNameMatchWhereClause(group)); + break; + case ORGANIZATIONS: qb.setTables(LegacyTables.ORGANIZATIONS + " organizations"); qb.setProjectionMap(sOrganizationProjectionMap); @@ -1719,6 +1729,26 @@ public class LegacyApiSupport { } /** + * Build a WHERE clause that restricts the query to match people that are a member of + * a group with a particular name. The projection map of the query must include + * {@link People#_ID}. + * + * @param groupName The name of the group + * @return The where clause. + */ + private String buildGroupNameMatchWhereClause(String groupName) { + return "people._id IN " + + "(SELECT " + DataColumns.CONCRETE_RAW_CONTACT_ID + + " FROM " + Tables.DATA_JOIN_MIMETYPES + + " WHERE " + Data.MIMETYPE + "='" + GroupMembership.CONTENT_ITEM_TYPE + + "' AND " + GroupMembership.GROUP_ROW_ID + "=" + + "(SELECT " + Tables.GROUPS + "." + Groups._ID + + " FROM " + Tables.GROUPS + + " WHERE " + Groups.TITLE + "=" + + DatabaseUtils.sqlEscapeString(groupName) + "))"; + } + + /** * Called when a change has been made. * * @param uri the uri that the change was made to |