package com.example.contactimporter; import android.app.Activity; import android.content.ContentProviderOperation; import android.content.ContentProviderResult; import android.content.OperationApplicationException; import android.content.res.AssetManager; import android.os.AsyncTask; import android.os.AsyncTask.Status; import android.os.Bundle; import android.os.RemoteException; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import android.widget.ToggleButton; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; public class MainActivity extends Activity implements OnClickListener { private static final String LENOVO_S868T_LOCAL_ACCOUNT_NAME = "contacts.account.name.local"; private static final String LENOVO_S868T_LOCAL_ACCOUNT_TYPE = "contacts.account.type.local"; private ToggleButton mTbStart; private TextView mTvProgress; private ImportTask mImportTask; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTbStart = (ToggleButton) findViewById(R.id.start_import); mTbStart.setOnClickListener(this); mTvProgress = (TextView) findViewById(R.id.progress); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public void onClick(View v) { if (v == mTbStart) { if (mTbStart.isChecked()) { startImport(); } else { stopImport(); } } } private void stopImport() { if (mImportTask != null && mImportTask.getStatus() != Status.FINISHED) { mImportTask.cancel(true); } } private void startImport() { mImportTask = new ImportTask(); mImportTask.execute((Void) null); } private class ImportTask extends AsyncTask<Void, Integer, Boolean> { private boolean addContact(String email) { ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); ops.add(ContentProviderOperation .newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, LENOVO_S868T_LOCAL_ACCOUNT_TYPE) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, LENOVO_S868T_LOCAL_ACCOUNT_NAME) .withValue(ContactsContract.RawContacts.AGGREGATION_MODE, ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED).build()); 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, Email.TYPE_WORK).build()); ContentProviderResult[] results; try { results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); // insert RawContact result ContentProviderResult result = results[0]; return true; } catch (RemoteException e) { e.printStackTrace(); return false; } catch (OperationApplicationException e) { e.printStackTrace(); return false; } } @Override protected Boolean doInBackground(Void... params) { AssetManager am = getAssets(); try { InputStream is = am.open("mail_accounts.dat"); BufferedReader br = new BufferedReader(new InputStreamReader(is, "utf-8")); String line; int count = 0; while ((line = br.readLine()) != null) { if (!isCancelled()) { publishProgress(++count); addContact(line.trim()); } } return true; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } @Override protected void onProgressUpdate(Integer... values) { mTvProgress.setText(String.format("importing %d", values[0])); } @Override protected void onPostExecute(Boolean result) { mTvProgress.setText(String.format("import %s", result ? "success": "failed")); } @Override protected void onCancelled(Boolean result) { mTvProgress.setText("import cancelled"); } } }