package vandy.mooc.presenter.ContactsOpsImplSimple;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import vandy.mooc.common.Command;
import vandy.mooc.common.Utils;
import vandy.mooc.presenter.ContactsOpsImpl;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.OperationApplicationException;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
/**
* Insert all designated contacts in the UI thread.
*/
public class InsertContactsCommand
implements Command<Iterator<String>> {
/**
* Store a reference to the ContactsOps object.
*/
private ContactsOpsImpl mOps;
/**
* Store a reference to the Application context's ContentResolver.
*/
private ContentResolver mContentResolver;
/**
* Constructor initializes the field.
*/
public InsertContactsCommand(ContactsOpsImpl ops) {
// Store the ContactOps and the ContentResolver from the
// Application context.
mOps = ops;
mContentResolver =
ops.getApplicationContext().getContentResolver();
}
/**
* Run the command.
*/
@Override
public void execute(Iterator<String> contactsIter) {
int totalContactsInserted =
insertAllContacts(contactsIter);
Utils.showToast(mOps.getActivityContext(),
totalContactsInserted
+ " contact(s) inserted");
}
/**
* Synchronously insert all contacts designated by the Iterator.
*/
private Integer insertAllContacts(Iterator<String> contactsIter) {
// Set up a batch operation on ContactsContentProvider.
final ArrayList<ContentProviderOperation> batchOperation =
new ArrayList<ContentProviderOperation>();
// Add each contact in the Iterator into the Contacts
// ContentProvider.
while (contactsIter.hasNext())
addContact(contactsIter.next(),
batchOperation);
try {
// Apply all the batched operations synchronously.
ContentProviderResult[] results =
mContentResolver.applyBatch(ContactsContract.AUTHORITY,
batchOperation);
// Divide by 2 since each insert required two operations.
return results.length / 2;
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
return 0;
}
/**
* Synchronously insert a contact with the designated @name into
* the ContactsContentProvider. This code is explained at
* http://developer.android.com/reference/android/provider/ContactsContract.RawContacts.html.
*/
private void addContact(String name,
List<ContentProviderOperation> cpops) {
final int position = cpops.size();
// First part of operation.
cpops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE,
mOps.getAccountType())
.withValue(RawContacts.ACCOUNT_NAME,
mOps.getAccountName())
.withValue(Contacts.STARRED,
1)
.build());
// Second part of operation.
cpops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID,
position)
.withValue(Data.MIMETYPE,
StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.DISPLAY_NAME,
name)
.build());
}
}