Routing "view contact" requests to proper directories

Change-Id: I006a5f7a9f88ebb0e3ae2872ad646de87d4d6405
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 81c4a2b..85b70fe 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -56,8 +56,10 @@
         @Override
         public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
             long selectedId = ListView.INVALID_ROW_ID;
-            if (data.moveToFirst()) {
-                selectedId = data.getLong(0);
+            if (data != null) {
+                if (data.moveToFirst()) {
+                    selectedId = data.getLong(0);
+                }
             }
             getAdapter().setSelectedContactId(selectedId);
             return;
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index cb1e63f..2389dfb 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -21,6 +21,7 @@
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.ContactCounts;
 import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Directory;
 import android.provider.ContactsContract.SearchSnippetColumns;
 import android.view.View;
 import android.view.ViewGroup;
@@ -146,14 +147,20 @@
      * {@link ListView} position.
      */
     public Uri getContactUri(int position) {
+        int partitionIndex = getPartitionForPosition(position);
         Cursor item = (Cursor)getItem(position);
-        return item != null ? getContactUri(item) : null;
+        return item != null ? getContactUri(partitionIndex, item) : null;
     }
 
-    public Uri getContactUri(Cursor cursor) {
+    public Uri getContactUri(int partitionIndex, Cursor cursor) {
         long contactId = cursor.getLong(CONTACT_ID_COLUMN_INDEX);
         String lookupKey = cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX);
-        return Contacts.getLookupUri(contactId, lookupKey);
+        Uri uri = Contacts.getLookupUri(contactId, lookupKey);
+        if (partitionIndex != Directory.DEFAULT && partitionIndex != Directory.LOCAL_INVISIBLE) {
+            uri = uri.buildUpon().appendQueryParameter(
+                    ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(partitionIndex)).build();
+        }
+        return uri;
     }
 
     @Override
@@ -181,14 +188,15 @@
         getPhotoLoader().loadPhoto(view.getPhotoView(), photoId);
     }
 
-    protected void bindQuickContact(final ContactListItemView view, Cursor cursor) {
+    protected void bindQuickContact(
+            final ContactListItemView view, int partitionIndex, Cursor cursor) {
         long photoId = 0;
         if (!cursor.isNull(CONTACT_PHOTO_ID_COLUMN_INDEX)) {
             photoId = cursor.getLong(CONTACT_PHOTO_ID_COLUMN_INDEX);
         }
 
         QuickContactBadge quickContact = view.getQuickContact();
-        quickContact.assignContactUri(getContactUri(cursor));
+        quickContact.assignContactUri(getContactUri(partitionIndex, cursor));
         getPhotoLoader().loadPhoto(quickContact, photoId);
     }
 
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index c1bb1e8..ec261c8 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -105,7 +105,7 @@
         bindSectionHeaderAndDivider(view, position);
 
         if (isQuickContactEnabled()) {
-            bindQuickContact(view, cursor);
+            bindQuickContact(view, partition, cursor);
         } else {
             bindPhoto(view, cursor);
         }
diff --git a/src/com/android/contacts/list/JoinContactListAdapter.java b/src/com/android/contacts/list/JoinContactListAdapter.java
index 7e162db..8b636cf 100644
--- a/src/com/android/contacts/list/JoinContactListAdapter.java
+++ b/src/com/android/contacts/list/JoinContactListAdapter.java
@@ -224,7 +224,7 @@
     }
 
     @Override
-    public Uri getContactUri(Cursor cursor) {
+    public Uri getContactUri(int partitionIndex, Cursor cursor) {
         long contactId = cursor.getLong(CONTACT_ID_COLUMN_INDEX);
         String lookupKey = cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX);
         return Contacts.getLookupUri(contactId, lookupKey);
diff --git a/src/com/android/contacts/list/StrequentContactListAdapter.java b/src/com/android/contacts/list/StrequentContactListAdapter.java
index c198c38..886f5b3 100644
--- a/src/com/android/contacts/list/StrequentContactListAdapter.java
+++ b/src/com/android/contacts/list/StrequentContactListAdapter.java
@@ -203,7 +203,7 @@
         }
 
         bindName(view, cursor);
-        bindQuickContact(view, cursor);
+        bindQuickContact(view, partition, cursor);
         bindPresence(view, cursor);
 
         // Make the call button visible if requested.