aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDmitri Plotnikov <dplotnikov@google.com>2009-09-25 20:10:02 -0700
committerDmitri Plotnikov <dplotnikov@google.com>2009-09-25 20:10:52 -0700
commit71e051c79a57af70ec7b095074c3e7faf9507b52 (patch)
tree8f23664dd39fde65340b566c608b42d203c00d9a /src
parentdea2b6389abf1ae0448ae047b4b0a9e423381d77 (diff)
downloadContactsProvider-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.java33
-rw-r--r--src/com/android/providers/contacts/LegacyApiSupport.java32
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