Fix re-parenting for modifications to the profile.

Bug 5274218

Change-Id: Icbeed88032dcdab643aaa85216fb4363473cc80b
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index 78c4b18..2df2e47 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -18,6 +18,7 @@
 
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.AccountWithDataSet;
+import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityDeltaList;
 import com.android.contacts.model.EntityModifier;
 import com.google.android.collect.Lists;
@@ -48,6 +49,7 @@
 import android.provider.ContactsContract.Groups;
 import android.provider.ContactsContract.Profile;
 import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.RawContactsEntity;
 import android.util.Log;
 import android.widget.Toast;
 
@@ -355,9 +357,19 @@
                     throw new IllegalStateException("Version consistency failed for a new contact");
                 }
 
-                final EntityDeltaList newState = EntityDeltaList.fromQuery(resolver,
-                        sb.toString(), null, null);
+                final EntityDeltaList newState = EntityDeltaList.fromQuery(
+                        isProfile
+                                ? RawContactsEntity.PROFILE_CONTENT_URI
+                                : RawContactsEntity.CONTENT_URI,
+                        resolver, sb.toString(), null, null);
                 state = EntityDeltaList.mergeAfter(newState, state);
+
+                // Update the new state to use profile URIs if appropriate.
+                if (isProfile) {
+                    for (EntityDelta delta : state) {
+                        delta.setProfileQueryUri();
+                    }
+                }
             }
         }
 
diff --git a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
index 418c8e3..3d4b70f 100644
--- a/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
+++ b/src/com/android/contacts/activities/ConfirmAddDetailActivity.java
@@ -58,6 +58,7 @@
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.RawContacts;
+import android.provider.ContactsContract.RawContactsEntity;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.util.Log;
@@ -378,7 +379,10 @@
                 mSelection = Data.RAW_CONTACT_ID + "=?";
             }
 
-            return EntityDeltaList.fromQuery(activityTarget.getContentResolver(), mSelection,
+            // Note that this query does not need to concern itself with whether the contact is
+            // the user's profile, since the profile does not show up in the picker.
+            return EntityDeltaList.fromQuery(RawContactsEntity.CONTENT_URI,
+                    activityTarget.getContentResolver(), mSelection,
                     new String[] { selectionArg }, null);
         }
 
diff --git a/src/com/android/contacts/model/EntityDeltaList.java b/src/com/android/contacts/model/EntityDeltaList.java
index 9b7bdc6..5a9355b 100644
--- a/src/com/android/contacts/model/EntityDeltaList.java
+++ b/src/com/android/contacts/model/EntityDeltaList.java
@@ -21,6 +21,7 @@
 import android.content.Entity;
 import android.content.EntityIterator;
 import android.content.ContentProviderOperation.Builder;
+import android.net.Uri;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.provider.ContactsContract.AggregationExceptions;
@@ -63,10 +64,10 @@
      * given query parameters. This closes the {@link EntityIterator} when
      * finished, so it doesn't subscribe to updates.
      */
-    public static EntityDeltaList fromQuery(ContentResolver resolver, String selection,
-            String[] selectionArgs, String sortOrder) {
+    public static EntityDeltaList fromQuery(Uri entityUri, ContentResolver resolver,
+            String selection, String[] selectionArgs, String sortOrder) {
         final EntityIterator iterator = RawContacts.newEntityIterator(resolver.query(
-                RawContactsEntity.CONTENT_URI, null, selection, selectionArgs,
+                entityUri, null, selection, selectionArgs,
                 sortOrder));
         try {
             return fromIterator(iterator);