Add "Add to contacts" button in QC for supported contacts

Allow users to directly add an unknown contact to local contacts
from the QC card. Nearby places contacts are not supported because
directory export support is disabled.

Bug: 10693314
Change-Id: I4c6a5850282460b61cff1ad1a341cb1cbcb546ca
diff --git a/src/com/android/contacts/model/RawContactModifier.java b/src/com/android/contacts/model/RawContactModifier.java
index f1f5697..631efd8 100644
--- a/src/com/android/contacts/model/RawContactModifier.java
+++ b/src/com/android/contacts/model/RawContactModifier.java
@@ -58,6 +58,7 @@
 import com.android.contacts.common.model.account.AccountType.EventEditType;
 import com.android.contacts.common.model.account.GoogleAccountType;
 import com.android.contacts.common.model.dataitem.DataKind;
+import com.android.contacts.model.dataitem.PhoneDataItem;
 import com.android.contacts.model.dataitem.StructuredNameDataItem;
 import com.android.contacts.util.DateUtils;
 import com.android.contacts.util.NameConverter;
@@ -693,6 +694,8 @@
             // Won't override the contact name
             if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 continue;
+            } else if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                values.remove(PhoneDataItem.KEY_FORMATTED_PHONE_NUMBER);
             }
 
             DataKind kind = accountType.getKindForMimetype(mimeType);
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 1e91fb6..28d63ec 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -37,6 +37,9 @@
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
 import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.DisplayNameSources;
+import android.provider.ContactsContract.Intents.Insert;
+import android.provider.ContactsContract.Directory;
 import android.provider.ContactsContract.QuickContact;
 import android.provider.ContactsContract.RawContacts;
 import android.support.v13.app.FragmentPagerAdapter;
@@ -114,11 +117,12 @@
     private View mLineAfterTrack;
 
     private ImageView mPhotoView;
-    private ImageView mOpenDetailsImage;
+    private ImageView mOpenDetailsOrAddContactImage;
     private ImageView mStarImage;
     private ViewPager mListPager;
     private ViewPagerAdapter mPagerAdapter;
 
+    private Contact mContactData;
     private ContactLoader mContactLoader;
 
     private final ImageViewDrawableSetter mPhotoSetter = new ImageViewDrawableSetter();
@@ -159,6 +163,37 @@
     private StopWatch mStopWatch = ENABLE_STOPWATCH
             ? StopWatch.start("QuickContact") : StopWatch.getNullStopWatch();
 
+    final OnClickListener mOpenDetailsClickHandler = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            final Intent intent = new Intent(Intent.ACTION_VIEW, mLookupUri);
+            mContactLoader.cacheResult();
+            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+            startActivity(intent);
+            close(false);
+        }
+    };
+
+    final OnClickListener mAddToContactsClickHandler = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (mContactData == null) {
+                Log.e(TAG, "Empty contact data when trying to add to contact");
+                return;
+            }
+            final Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
+            intent.setType(Contacts.CONTENT_ITEM_TYPE);
+
+            // Only pre-fill the name field if the provided display name is an organization
+            // name or better (e.g. structured name, nickname)
+            if (mContactData.getDisplayNameSource() >= DisplayNameSources.ORGANIZATION) {
+                intent.putExtra(Insert.NAME, mContactData.getDisplayName());
+            }
+            intent.putExtra(Insert.DATA, mContactData.getContentValues());
+            startActivity(intent);
+        }
+    };
+
     @Override
     protected void onCreate(Bundle icicle) {
         mStopWatch.lap("c"); // create start
@@ -202,7 +237,7 @@
         mFloatingLayout = (FloatingChildLayout) findViewById(R.id.floating_layout);
         mTrack = (ViewGroup) findViewById(R.id.track);
         mTrackScroller = (HorizontalScrollView) findViewById(R.id.track_scroller);
-        mOpenDetailsImage = (ImageView) findViewById(R.id.contact_details_image);
+        mOpenDetailsOrAddContactImage = (ImageView) findViewById(R.id.contact_details_image);
         mStarImage = (ImageView) findViewById(R.id.quickcontact_star_button);
         mListPager = (ViewPager) findViewById(R.id.item_list_pager);
         mSelectedTabRectangle = findViewById(R.id.selected_tab_rectangle);
@@ -216,17 +251,7 @@
             }
         });
 
-        final OnClickListener openDetailsClickHandler = new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                final Intent intent = new Intent(Intent.ACTION_VIEW, mLookupUri);
-                mContactLoader.cacheResult();
-                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-                startActivity(intent);
-                close(false);
-            }
-        };
-        mOpenDetailsImage.setOnClickListener(openDetailsClickHandler);
+        mOpenDetailsOrAddContactImage.setOnClickListener(mOpenDetailsClickHandler);
 
         mPagerAdapter = new ViewPagerAdapter(getFragmentManager());
         mListPager.setAdapter(mPagerAdapter);
@@ -243,7 +268,7 @@
         setHeaderNameText(R.id.name, R.string.missing_name);
 
         mPhotoView = (ImageView) mPhotoContainer.findViewById(R.id.photo);
-        mPhotoView.setOnClickListener(openDetailsClickHandler);
+        mPhotoView.setOnClickListener(mOpenDetailsClickHandler);
 
         mStopWatch.lap("v"); // view initialized
 
@@ -341,11 +366,12 @@
      * Handle the result from the ContactLoader
      */
     private void bindData(Contact data) {
+        mContactData = data;
         final ResolveCache cache = ResolveCache.getInstance(this);
         final Context context = this;
 
-        mOpenDetailsImage.setVisibility(isMimeExcluded(Contacts.CONTENT_ITEM_TYPE) ? View.GONE
-                : View.VISIBLE);
+        mOpenDetailsOrAddContactImage.setVisibility(isMimeExcluded(Contacts.CONTENT_ITEM_TYPE) ?
+                View.GONE : View.VISIBLE);
         final boolean isStarred = data.getStarred();
         if (isStarred) {
             mStarImage.setImageResource(R.drawable.ic_favorite_on_lt);
@@ -357,7 +383,19 @@
         // If this is a json encoded URI, there is no local contact to star
         if (UriUtils.isEncodedContactUri(lookupUri)) {
             mStarImage.setVisibility(View.GONE);
+
+            // If directory export support is not allowed, then don't allow the user to add
+            // to contacts
+            if (mContactData.getDirectoryExportSupport() == Directory.EXPORT_SUPPORT_NONE) {
+                mOpenDetailsOrAddContactImage.setImageResource(R.drawable.ic_contacts_holo_dark);
+                mOpenDetailsOrAddContactImage.setOnClickListener(mOpenDetailsClickHandler);
+            } else {
+                mOpenDetailsOrAddContactImage.setImageResource(R.drawable.ic_add_contact_holo_dark);
+                mOpenDetailsOrAddContactImage.setOnClickListener(mAddToContactsClickHandler);
+            }
         } else {
+            mOpenDetailsOrAddContactImage.setImageResource(R.drawable.ic_contacts_holo_dark);
+            mOpenDetailsOrAddContactImage.setOnClickListener(mOpenDetailsClickHandler);
             mStarImage.setVisibility(View.VISIBLE);
             mStarImage.setOnClickListener(new OnClickListener() {
                 @Override