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);