package com.amossys.hooker.generatecontacts;
import java.util.ArrayList;
import java.util.Random;
import android.content.ContentProviderOperation;
import android.content.Context;
import android.os.AsyncTask;
import android.provider.ContactsContract;
import android.util.Log;
public class ContactsBuilder extends AsyncTask<Void, Integer, Void>{
String LOGGER_NAME = "GenerateContacts";
Context context;
ImportContacts parent;
ContactsBuilder(Context _con, ImportContacts _parent){
context = _con;
parent = _parent;
}
/**
* Generate contacts from asset names.txt.
* @param v
*/
public void generateContacts() {
if (parent.getContactList().length()!=0){
String[] lines = parent.getContactList().split("\n");
Log.i(LOGGER_NAME, "Number of lines : "+lines.length);
//Make some random here
shuffleArray(lines);
//Create a number of contacts between 150 and 350.
int nbContacts = parent.getNbContacts();
for(int i=0; i<nbContacts; i++){
publishProgress(i);
String [] items = lines[i].split("\\|");
if(items.length != 4){
Log.e(LOGGER_NAME, "Line " + i + " hasn't been parsed correctly.");
}
else{
createAContact(items[0], items[1]+" "+ items[2], items[3]);
}
}
Log.i(LOGGER_NAME, "Total of " + nbContacts + " have been added to the phone.");
} else {
Log.e(LOGGER_NAME, "File assets doesn't exist, cannot create contacts.");
}
}
/**
* Shuffle the array of contacts, to change between emulators.
* @param arrayOfContacts
*/
private void shuffleArray(String[] arrayOfContacts)
{
int index;
String temp;
Random random = new Random();
for (int i = arrayOfContacts.length - 1; i > 0; i--)
{
index = random.nextInt(i + 1);
temp = arrayOfContacts[index];
arrayOfContacts[index] = arrayOfContacts[i];
arrayOfContacts[i] = temp;
}
}
/**
* Method to add a contact to the contact list.
* @param mobile number of the contact.
* @param name
* @param email
*/
private void createAContact(String mobile, String name, String email) {
//Log.i(LOGGER_NAME, "Addind contact: " + name + ", mobile: "+mobile+", email:"+email);
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation
.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
//Names
if (name != null) {
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(
ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
name).build());
}
//Mobile Number
if (mobile != null) {
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(
ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,
mobile)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.build());
}
//Email
if (email != null) {
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(
ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.DATA,
email)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE,
ContactsContract.CommonDataKinds.Email.TYPE_WORK)
.build());
}
//Apply batch now
try {
context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
//Log.i(LOGGER_NAME, "done !");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected Void doInBackground(Void... params) {
generateContacts();
return null;
}
protected void onProgressUpdate(Integer... progress) {
parent.setProgressPercent(progress[0]);
}
protected void onPostExecute(Void res) {
parent.finished();
}
}