Merge "Disable search key press on 1-pane detail/editor activities"
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index 194d0ba..775009e 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -371,19 +371,29 @@
}
/**
- * Creates an intent that can be sent to this service to create a new group.
+ * Creates an intent that can be sent to this service to create a new group as
+ * well as add new members at the same time.
+ *
+ * @param context of the application
+ * @param account in which the group should be created
+ * @param label is the name of the group (cannot be null)
+ * @param rawContactsToAdd is an array of raw contact IDs for contacts that
+ * should be added to the group
+ * @param callbackActivity is the activity to send the callback intent to
+ * @param callbackAction is the intent action for the callback intent
*/
- public static Intent createNewGroupIntent(Context context, Account account, String label,
- Class<?> callbackActivity, String callbackAction) {
+ public static Intent createNewGroupIntent(Context context, Account account,
+ String label, long[] rawContactsToAdd, Class<?> callbackActivity,
+ String callbackAction) {
Intent serviceIntent = new Intent(context, ContactSaveService.class);
serviceIntent.setAction(ContactSaveService.ACTION_CREATE_GROUP);
serviceIntent.putExtra(ContactSaveService.EXTRA_ACCOUNT_TYPE, account.type);
serviceIntent.putExtra(ContactSaveService.EXTRA_ACCOUNT_NAME, account.name);
serviceIntent.putExtra(ContactSaveService.EXTRA_GROUP_LABEL, label);
+ serviceIntent.putExtra(ContactSaveService.EXTRA_RAW_CONTACTS_TO_ADD, rawContactsToAdd);
// Callback intent will be invoked by the service once the new group is
- // created. The service will put a group membership row in the extras
- // of the callback intent.
+ // created.
Intent callbackIntent = new Intent(context, callbackActivity);
callbackIntent.setAction(callbackAction);
serviceIntent.putExtra(ContactSaveService.EXTRA_CALLBACK_INTENT, callbackIntent);
@@ -392,28 +402,41 @@
}
private void createGroup(Intent intent) {
- String accountType = intent.getStringExtra(EXTRA_ACCOUNT_TYPE);
- String accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
- String label = intent.getStringExtra(EXTRA_GROUP_LABEL);
+ final String accountType = intent.getStringExtra(EXTRA_ACCOUNT_TYPE);
+ final String accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
+ final String label = intent.getStringExtra(EXTRA_GROUP_LABEL);
+ final long[] rawContactsToAdd = intent.getLongArrayExtra(EXTRA_RAW_CONTACTS_TO_ADD);
ContentValues values = new ContentValues();
values.put(Groups.ACCOUNT_TYPE, accountType);
values.put(Groups.ACCOUNT_NAME, accountName);
values.put(Groups.TITLE, label);
- Uri groupUri = getContentResolver().insert(Groups.CONTENT_URI, values);
+ final ContentResolver resolver = getContentResolver();
+
+ // Create the new group
+ final Uri groupUri = resolver.insert(Groups.CONTENT_URI, values);
+
+ // If there's no URI, then the insertion failed. Abort early because group members can't be
+ // added if the group doesn't exist
if (groupUri == null) {
+ Log.e(TAG, "Couldn't create group with label " + label);
return;
}
+ // Add new group members
+ addMembersToGroup(resolver, rawContactsToAdd, ContentUris.parseId(groupUri));
+
+ // TODO: Move this into the contact editor where it belongs. This needs to be integrated
+ // with the way other intent extras that are passed to the {@link ContactEditorActivity}.
values.clear();
values.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE);
values.put(GroupMembership.GROUP_ROW_ID, ContentUris.parseId(groupUri));
Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
callbackIntent.setData(groupUri);
+ // TODO: This can be taken out when the above TODO is addressed
callbackIntent.putExtra(ContactsContract.Intents.Insert.DATA, Lists.newArrayList(values));
-
deliverCallback(callbackIntent);
}
@@ -527,10 +550,23 @@
if (label != null) {
ContentValues values = new ContentValues();
values.put(Groups.TITLE, label);
- getContentResolver().update(groupUri, values, null, null);
+ resolver.update(groupUri, values, null, null);
}
- // Add new group members
+ // Add and remove members if necessary
+ addMembersToGroup(resolver, rawContactsToAdd, groupId);
+ removeMembersFromGroup(resolver, rawContactsToRemove, groupId);
+
+ Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
+ callbackIntent.setData(groupUri);
+ deliverCallback(callbackIntent);
+ }
+
+ private void addMembersToGroup(ContentResolver resolver, long[] rawContactsToAdd,
+ long groupId) {
+ if (rawContactsToAdd == null) {
+ return;
+ }
for (long rawContactId : rawContactsToAdd) {
try {
final ArrayList<ContentProviderOperation> rawContactOperations =
@@ -577,8 +613,13 @@
String.valueOf(groupId), e);
}
}
+ }
- // Remove group members
+ private void removeMembersFromGroup(ContentResolver resolver, long[] rawContactsToRemove,
+ long groupId) {
+ if (rawContactsToRemove == null) {
+ return;
+ }
for (long rawContactId : rawContactsToRemove) {
// Apply the delete operation on the data row for the given raw contact's
// membership in the given group. If no contact matches the provided selection, then
@@ -588,10 +629,6 @@
new String[] { String.valueOf(rawContactId),
GroupMembership.CONTENT_ITEM_TYPE, String.valueOf(groupId)});
}
-
- Intent callbackIntent = intent.getParcelableExtra(EXTRA_CALLBACK_INTENT);
- callbackIntent.setData(groupUri);
- deliverCallback(callbackIntent);
}
/**
diff --git a/src/com/android/contacts/group/GroupEditorFragment.java b/src/com/android/contacts/group/GroupEditorFragment.java
index 76f48a3..da57c82 100644
--- a/src/com/android/contacts/group/GroupEditorFragment.java
+++ b/src/com/android/contacts/group/GroupEditorFragment.java
@@ -238,20 +238,11 @@
// Account specified in Intent
mAccountName = account.name;
mAccountType = account.type;
- setupAccountHeader();
+ setupEditorForAccount();
} else {
// No Account specified. Let the user choose from a disambiguation dialog.
selectAccountAndCreateGroup();
}
-
- mStatus = Status.EDITING;
-
- // The user wants to create a new group, temporarily hide the "add members" text view
- // TODO: Need to allow users to add members if it's a new group. Under the current
- // approach, we can't add members because it needs a group ID in order to save,
- // and we don't have a group ID for a new group until the whole group is saved.
- // Take this out when batch add/remove members is working.
- mAutoCompleteTextView.setVisibility(View.GONE);
} else {
throw new IllegalArgumentException("Unknown Action String " + mAction +
". Only support " + Intent.ACTION_EDIT + " or " + Intent.ACTION_INSERT);
@@ -278,7 +269,7 @@
if (accounts.size() == 1) {
mAccountName = accounts.get(0).name;
mAccountType = accounts.get(0).type;
- setupAccountHeader();
+ setupEditorForAccount();
return; // Don't show a dialog.
}
@@ -292,7 +283,7 @@
public void onAccountChosen(int requestCode, Account account) {
mAccountName = account.name;
mAccountType = account.type;
- setupAccountHeader();
+ setupEditorForAccount();
}
@Override
@@ -304,9 +295,10 @@
}
/**
- * Sets up the account header.
+ * Sets up the editor based on the group's account name and type.
*/
- private void setupAccountHeader() {
+ private void setupEditorForAccount() {
+ // Setup the account header
final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(mContext);
final AccountType accountType = accountTypeManager.getAccountType(mAccountType);
CharSequence accountTypeDisplayLabel = accountType.getDisplayLabel(mContext);
@@ -316,6 +308,31 @@
}
mAccountTypeTextView.setText(accountTypeDisplayLabel);
mAccountIcon.setImageDrawable(accountType.getDisplayIcon(mContext));
+
+ // Setup the autocomplete adapter (for contacts to suggest to add to the group) based on the
+ // account name and type
+ mAutoCompleteAdapter = new SuggestedMemberListAdapter(mContext,
+ android.R.layout.simple_dropdown_item_1line);
+ mAutoCompleteAdapter.setContentResolver(mContentResolver);
+ mAutoCompleteAdapter.setAccountType(mAccountType);
+ mAutoCompleteAdapter.setAccountName(mAccountName);
+ mAutoCompleteTextView.setAdapter(mAutoCompleteAdapter);
+ mAutoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ SuggestedMember member = mAutoCompleteAdapter.getItem(position);
+ loadMemberToAddToGroup(member.getRawContactId(),
+ String.valueOf(member.getContactId()));
+
+ // Update the autocomplete adapter so the contact doesn't get suggested again
+ mAutoCompleteAdapter.addNewMember(member.getContactId());
+
+ // Clear out the text field
+ mAutoCompleteTextView.setText("");
+ }
+ });
+
+ mStatus = Status.EDITING;
}
public void load(String action, Uri groupUri, Bundle intentExtras) {
@@ -349,7 +366,7 @@
// focus on the field).
mGroupNameView.setText(mOriginalGroupName);
mGroupNameView.setFocusable(!mGroupNameIsReadOnly);
- setupAccountHeader();
+ setupEditorForAccount();
}
public void loadMemberToAddToGroup(long rawContactId, String contactId) {
@@ -380,8 +397,7 @@
}
private boolean revert() {
- if (mGroupNameView.getText() != null &&
- mGroupNameView.getText().toString().equals(mOriginalGroupName)) {
+ if (!hasNameChange() && !hasMembershipChange()) {
doRevertAction();
} else {
CancelEditDialogFragment.show(this);
@@ -453,24 +469,20 @@
}
Intent saveIntent = null;
if (mAction == Intent.ACTION_INSERT) {
- // TODO: Perform similar work to add members at the same time as creating a new group
+ // Create array of raw contact IDs for contacts to add to the group
+ long[] membersToAddArray = convertToArray(mListMembersToAdd);
+
+ // Create the save intent to create the group and add members at the same time
saveIntent = ContactSaveService.createNewGroupIntent(activity,
new Account(mAccountName, mAccountType), mGroupNameView.getText().toString(),
- activity.getClass(), GroupEditorActivity.ACTION_SAVE_COMPLETED);
+ membersToAddArray, activity.getClass(),
+ GroupEditorActivity.ACTION_SAVE_COMPLETED);
} else if (mAction == Intent.ACTION_EDIT) {
// Create array of raw contact IDs for contacts to add to the group
- int membersToAddCount = mListMembersToAdd.size();
- long[] membersToAddArray = new long[membersToAddCount];
- for (int i = 0; i < membersToAddCount; i++) {
- membersToAddArray[i] = mListMembersToAdd.get(i).getRawContactId();
- }
+ long[] membersToAddArray = convertToArray(mListMembersToAdd);
// Create array of raw contact IDs for contacts to add to the group
- int membersToRemoveCount = mListMembersToRemove.size();
- long[] membersToRemoveArray = new long[membersToRemoveCount];
- for (int i = 0; i < membersToRemoveCount; i++) {
- membersToRemoveArray[i] = mListMembersToRemove.get(i).getRawContactId();
- }
+ long[] membersToRemoveArray = convertToArray(mListMembersToRemove);
// Create the update intent (which includes the updated group name if necessary)
saveIntent = ContactSaveService.createGroupUpdateIntent(activity, mGroupId,
@@ -555,6 +567,15 @@
return groupNameFromTextView;
}
+ private static long[] convertToArray(List<Member> listMembers) {
+ int size = listMembers.size();
+ long[] membersArray = new long[size];
+ for (int i = 0; i < size; i++) {
+ membersArray[i] = listMembers.get(i).getRawContactId();
+ }
+ return membersArray;
+ }
+
private void addExistingMembers(List<Member> members, List<Long> listContactIds) {
mListToDisplay.addAll(members);
mMemberListAdapter.notifyDataSetChanged();
@@ -605,7 +626,6 @@
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
- mStatus = Status.EDITING;
bindGroupMetaData(data);
// Load existing members
@@ -651,27 +671,6 @@
data.close();
}
- mAutoCompleteAdapter = new SuggestedMemberListAdapter(getActivity(),
- android.R.layout.simple_dropdown_item_1line);
- mAutoCompleteAdapter.setContentResolver(mContentResolver);
- mAutoCompleteAdapter.setAccountType(mAccountType);
- mAutoCompleteAdapter.setAccountName(mAccountName);
- mAutoCompleteTextView.setAdapter(mAutoCompleteAdapter);
- mAutoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- SuggestedMember member = mAutoCompleteAdapter.getItem(position);
- loadMemberToAddToGroup(member.getRawContactId(),
- String.valueOf(member.getContactId()));
-
- // Update the autocomplete adapter so the contact doesn't get suggested again
- mAutoCompleteAdapter.addNewMember(member.getContactId());
-
- // Clear out the text field
- mAutoCompleteTextView.setText("");
- }
- });
-
// Update the display list
addExistingMembers(listExistingMembers, listContactIds);
diff --git a/src/com/android/contacts/interactions/GroupCreationDialogFragment.java b/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
index 8991928..87d83b4 100644
--- a/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
+++ b/src/com/android/contacts/interactions/GroupCreationDialogFragment.java
@@ -60,6 +60,7 @@
Activity activity = getActivity();
activity.startService(ContactSaveService.createNewGroupIntent(activity,
new Account(accountName, accountType), groupLabel,
+ null /* no new members to add */,
activity.getClass(), Intent.ACTION_EDIT));
}
}