am 8545c42c: am 1513fec5: Updating "Add Contact" to pre-populate full contact info.

* commit '8545c42c6d494fbd240c3bab7450f01ce05cb985':
  Updating "Add Contact" to pre-populate full contact info.
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 5e6f035..95b7215 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -1050,8 +1050,22 @@
     }
 
     public static Intent getAddNumberToContactIntent(CharSequence text) {
-        final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
-        intent.putExtra(Intents.Insert.PHONE, text);
+        return getAddToContactIntent(null /* name */, text /* phoneNumber */,
+                -1 /* phoneNumberType */);
+    }
+
+    public static Intent getAddToContactIntent(CharSequence name, CharSequence phoneNumber,
+            int phoneNumberType) {
+        Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+        intent.putExtra(Intents.Insert.PHONE, phoneNumber);
+        // Only include the name and phone type extras if they are specified (the method
+        // getAddNumberToContactIntent does not use them).
+        if (name != null) {
+            intent.putExtra(Intents.Insert.NAME, name);
+        }
+        if (phoneNumberType != -1) {
+            intent.putExtra(Intents.Insert.PHONE_TYPE, phoneNumberType);
+        }
         intent.setType(Contacts.CONTENT_ITEM_TYPE);
         return intent;
     }
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 9528e45..e799b00 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -19,13 +19,14 @@
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
+import android.content.Loader;
 import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
 import android.provider.CallLog.Calls;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.PhoneLookup;
 import android.telecom.PhoneAccountHandle;
 import android.text.TextUtils;
@@ -44,6 +45,8 @@
 import com.android.contacts.common.CallUtil;
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.model.Contact;
+import com.android.contacts.common.model.ContactLoader;
 import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.PhoneCallDetails;
@@ -55,6 +58,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 
@@ -1062,7 +1066,7 @@
     }
 
     protected void bindBadge(
-            View view, ContactInfo info, final PhoneCallDetails details, int callType) {
+            View view, final ContactInfo info, final PhoneCallDetails details, int callType) {
         // Do not show badge in call log.
         if (!mIsCallLog) {
             final ViewStub stub = (ViewStub) view.findViewById(R.id.link_stub);
@@ -1082,10 +1086,18 @@
                     clickableArea.setOnClickListener(new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
-                            final Intent intent =
-                                    DialtactsActivity.getAddNumberToContactIntent(details.number);
-                            DialerUtils.startActivityWithErrorToast(mContext, intent,
-                                    R.string.add_contact_not_available);
+                            // If no lookup uri is provided, we need to rely on what information
+                            // we have available; namely the phone number and name.
+                            if (info.lookupUri == null) {
+                                final Intent intent =
+                                        DialtactsActivity.getAddToContactIntent(details.name,
+                                                details.number,
+                                                details.numberType);
+                                DialerUtils.startActivityWithErrorToast(mContext, intent,
+                                        R.string.add_contact_not_available);
+                            } else {
+                                addContactFromLookupUri(info.lookupUri);
+                            }
                         }
                     });
                 }
@@ -1434,4 +1446,53 @@
             }
         }
     }
+
+    /**
+     * Invokes the "add contact" activity given the expanded contact information stored in a
+     * lookup URI.  This can include, for example, address and website information.
+     *
+     * @param lookupUri The lookup URI.
+     */
+    private void addContactFromLookupUri(Uri lookupUri) {
+        Contact contactToSave = ContactLoader.parseEncodedContactEntity(lookupUri);
+        if (contactToSave == null) {
+            return;
+        }
+
+        // Note: This code mirrors code in Contacts/QuickContactsActivity.
+        final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+        intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
+
+        ArrayList<ContentValues> values = contactToSave.getContentValues();
+        // Only pre-fill the name field if the provided display name is an nickname
+        // or better (e.g. structured name, nickname)
+        if (contactToSave.getDisplayNameSource()
+                >= ContactsContract.DisplayNameSources.NICKNAME) {
+            intent.putExtra(ContactsContract.Intents.Insert.NAME,
+                    contactToSave.getDisplayName());
+        } else if (contactToSave.getDisplayNameSource()
+                == ContactsContract.DisplayNameSources.ORGANIZATION) {
+            // This is probably an organization. Instead of copying the organization
+            // name into a name entry, copy it into the organization entry. This
+            // way we will still consider the contact an organization.
+            final ContentValues organization = new ContentValues();
+            organization.put(ContactsContract.CommonDataKinds.Organization.COMPANY,
+                    contactToSave.getDisplayName());
+            organization.put(ContactsContract.Data.MIMETYPE,
+                    ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
+            values.add(organization);
+        }
+
+        // Last time used and times used are aggregated values from the usage stat
+        // table. They need to be removed from data values so the SQL table can insert
+        // properly
+        for (ContentValues value : values) {
+            value.remove(ContactsContract.Data.LAST_TIME_USED);
+            value.remove(ContactsContract.Data.TIMES_USED);
+        }
+        intent.putExtra(ContactsContract.Intents.Insert.DATA, values);
+
+        DialerUtils.startActivityWithErrorToast(mContext, intent,
+                R.string.add_contact_not_available);
+    }
 }