Fix http://b/issue?id=2086484 and http://b/issue?id=2087539

Change-Id: I392e52ac821a2eabd40c26024dbc587e6e63236f
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index a578576..c142182 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -221,7 +221,8 @@
         Contacts.STARRED, //2
         Contacts.TIMES_CONTACTED, //3
         Presence.PRESENCE_STATUS, //4
-        Contacts.PHOTO_ID, //4
+        Contacts.PHOTO_ID, //5
+        Contacts.HAS_PHONE_NUMBER, //6
     };
     static final String[] LEGACY_PEOPLE_PROJECTION = new String[] {
         People._ID, // 0
@@ -236,6 +237,7 @@
     static final int SUMMARY_TIMES_CONTACTED_COLUMN_INDEX = 3;
     static final int SUMMARY_PRESENCE_STATUS_COLUMN_INDEX = 4;
     static final int SUMMARY_PHOTO_ID_COLUMN_INDEX = 5;
+    static final int SUMMARY_HAS_PHONE_COLUMN_INDEX = 6;
 
     static final String[] PHONES_PROJECTION = new String[] {
         Data._ID, //0
@@ -882,14 +884,16 @@
             return;
         }
         long id = info.id;
-        Uri aggUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, id);
+        Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, id);
+        long rawContactId = ContactsUtils.queryForRawContactId(getContentResolver(), id);
+        Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId);
 
         // Setup the menu header
         menu.setHeaderTitle(cursor.getString(SUMMARY_NAME_COLUMN_INDEX));
 
         // View contact details
         menu.add(0, MENU_ITEM_VIEW_CONTACT, 0, R.string.menu_viewContact)
-                .setIntent(new Intent(Intent.ACTION_VIEW, aggUri));
+                .setIntent(new Intent(Intent.ACTION_VIEW, contactUri));
 
         /*
         // Calling contact
@@ -923,7 +927,7 @@
 
         // Contact editing
         menu.add(0, MENU_ITEM_EDIT, 0, R.string.menu_editContact)
-                .setIntent(new Intent(Intent.ACTION_EDIT, aggUri));
+                .setIntent(new Intent(Intent.ACTION_EDIT, rawContactUri));
         menu.add(0, MENU_ITEM_DELETE, 0, R.string.menu_deleteContact);
     }
 
@@ -1583,14 +1587,22 @@
         if (list.hasFocus()) {
             Cursor cursor = (Cursor) list.getSelectedItem();
             if (cursor != null) {
-                long dataId = cursor.getLong(ID_COLUMN_INDEX);
-                if (dataId == 0) {
+                boolean hasPhone = cursor.getInt(SUMMARY_HAS_PHONE_COLUMN_INDEX) != 0;
+                if (!hasPhone) {
                     // There is no phone number.
                     signalError();
                     return false;
                 }
-                Uri uri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
-                Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, uri);
+
+                String phone = ContactsUtils.querySuperPrimaryPhone(getContentResolver(), cursor.
+                        getLong(ID_COLUMN_INDEX));
+                if (phone == null) {
+                    signalError();
+                    return false;
+                }
+
+                Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED,
+                        Uri.fromParts("tel", phone, null));
                 startActivity(intent);
                 return true;
             }
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index 7611026..76f885e 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -21,6 +21,8 @@
 import com.android.contacts.ui.FastTrackWindow;
 
 import java.io.ByteArrayInputStream;
+
+import android.provider.Contacts.People.Phones;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
 
@@ -36,15 +38,13 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.drawable.Drawable;
-import android.provider.Contacts;
-import android.provider.Contacts.Photos;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Im;
 import android.provider.ContactsContract.CommonDataKinds.Organization;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.Photo;
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
+import android.provider.ContactsContract.Contacts;
 import android.provider.Im.ProviderNames;
 import android.database.Cursor;
 import android.text.TextUtils;
@@ -260,6 +260,49 @@
         return contactId;
     }
 
+    public static String querySuperPrimaryPhone(ContentResolver cr, long contactId) {
+        Cursor c = null;
+        String phone = null;
+        try {
+            Uri baseUri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);
+            Uri dataUri = Uri.withAppendedPath(baseUri, "data");
+
+            c = cr.query(dataUri,
+                    new String[] {Phone.NUMBER},
+                    Data.MIMETYPE + "=" + Phone.MIMETYPE +
+                        " AND " + Data.IS_SUPER_PRIMARY + "=1",
+                    null, null);
+            if (c != null && c.moveToFirst()) {
+                // Just return the first one.
+                phone = c.getString(0);
+            }
+        } finally {
+            if (c != null) {
+                c.close();
+            }
+        }
+        return phone;
+    }
+
+    public static long queryForRawContactId(ContentResolver cr, long contactId) {
+        Cursor rawContactIdCursor = null;
+        long rawContactId = -1;
+        try {
+            rawContactIdCursor = cr.query(RawContacts.CONTENT_URI,
+                    new String[] {RawContacts._ID},
+                    RawContacts.CONTACT_ID + "=" + contactId, null, null);
+            if (rawContactIdCursor != null && rawContactIdCursor.moveToFirst()) {
+                // Just return the first one.
+                rawContactId = rawContactIdCursor.getLong(0);
+            }
+        } finally {
+            if (rawContactIdCursor != null) {
+                rawContactIdCursor.close();
+            }
+        }
+        return rawContactId;
+    }
+
 
     /**
      * Utility for creating a standard tab indicator view.