Adds URI for querying Contacts joined with RawContacts.
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index fafabc4..438e470 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -104,11 +104,12 @@
     private static final int CONTACTS_ID = 1001;
     private static final int CONTACTS_DATA = 1002;
     private static final int CONTACTS_SUMMARY = 1003;
-    private static final int CONTACTS_SUMMARY_ID = 1004;
-    private static final int CONTACTS_SUMMARY_FILTER = 1005;
-    private static final int CONTACTS_SUMMARY_STREQUENT = 1006;
-    private static final int CONTACTS_SUMMARY_STREQUENT_FILTER = 1007;
-    private static final int CONTACTS_SUMMARY_GROUP = 1008;
+    private static final int CONTACTS_RAW_CONTACTS = 1004;
+    private static final int CONTACTS_SUMMARY_ID = 1005;
+    private static final int CONTACTS_SUMMARY_FILTER = 1006;
+    private static final int CONTACTS_SUMMARY_STREQUENT = 1007;
+    private static final int CONTACTS_SUMMARY_STREQUENT_FILTER = 1008;
+    private static final int CONTACTS_SUMMARY_GROUP = 1009;
 
     private static final int RAW_CONTACTS = 2002;
     private static final int RAW_CONTACTS_ID = 2003;
@@ -293,6 +294,8 @@
     private static final HashMap<String, String> sDataContactsContactProjectionMap;
     /** Contains the data, contacts, group sourceid and contact columns, for joined tables. */
     private static final HashMap<String, String> sDataContactsGroupsContactProjectionMap;
+    /** Contains the contacts, and raw contact columns, for joined tables. */
+    private static final HashMap<String, String> sRawContactsContactsProjectionMap;
     /** Contains just the contacts columns */
     private static final HashMap<String, String> sRawContactsProjectionMap;
     /** Contains just the data columns */
@@ -344,6 +347,7 @@
         matcher.addURI(ContactsContract.AUTHORITY, "contacts", CONTACTS);
         matcher.addURI(ContactsContract.AUTHORITY, "contacts/#", CONTACTS_ID);
         matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/data", CONTACTS_DATA);
+        matcher.addURI(ContactsContract.AUTHORITY, "contacts/#/raw_contacts", CONTACTS_RAW_CONTACTS);
         matcher.addURI(ContactsContract.AUTHORITY, "contacts_summary", CONTACTS_SUMMARY);
         matcher.addURI(ContactsContract.AUTHORITY, "contacts_summary/#", CONTACTS_SUMMARY_ID);
         matcher.addURI(ContactsContract.AUTHORITY, "contacts_summary/filter/*",
@@ -446,6 +450,11 @@
                         + " AS " + RawContacts.DELETED);
         sRawContactsProjectionMap = columns;
 
+        columns = new HashMap<String, String>();
+        columns.putAll(sContactsProjectionMap);
+        columns.putAll(sRawContactsProjectionMap);
+        sRawContactsContactsProjectionMap = columns;
+
         // Data projection map
         columns = new HashMap<String, String>();
         columns.put(Data._ID, Tables.DATA + "." + Data._ID + " AS _id");
@@ -2094,6 +2103,15 @@
                 break;
             }
 
+            case CONTACTS_RAW_CONTACTS: {
+                long contactId = Long.parseLong(uri.getPathSegments().get(1));
+                qb.setTables(Tables.RAW_CONTACTS_JOIN_CONTACTS);
+                qb.setProjectionMap(sRawContactsContactsProjectionMap);
+                qb.appendWhere(RawContacts.CONTACT_ID + "=" + contactId + " AND ");
+                applyDataRestrictionExceptions(qb);
+                break;
+            }
+
             case PHONES_FILTER: {
                 qb.setTables(Tables.DATA_JOIN_PACKAGES_MIMETYPES_RAW_CONTACTS_CONTACTS);
                 qb.setProjectionMap(sDataContactsContactProjectionMap);
diff --git a/src/com/android/providers/contacts/OpenHelper.java b/src/com/android/providers/contacts/OpenHelper.java
index 7c65d61..74e2761 100644
--- a/src/com/android/providers/contacts/OpenHelper.java
+++ b/src/com/android/providers/contacts/OpenHelper.java
@@ -110,6 +110,9 @@
                 + "LEFT OUTER JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id) "
                 + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)";
 
+        public static final String RAW_CONTACTS_JOIN_CONTACTS = "raw_contacts "
+                + "LEFT OUTER JOIN contacts ON (raw_contacts.contact_id = contacts._id)";
+
         public static final String DATA_JOIN_MIMETYPES_RAW_CONTACTS_CONTACTS = "data "
                 + "LEFT OUTER JOIN mimetypes ON (data.mimetype_id = mimetypes._id) "
                 + "LEFT OUTER JOIN raw_contacts ON (data.raw_contact_id = raw_contacts._id) "