package com.tinfoil.sms.settings; import java.util.ArrayList; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.preference.PreferenceManager; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Contacts; import com.tinfoil.sms.dataStructures.Message; import com.tinfoil.sms.dataStructures.Number; import com.tinfoil.sms.dataStructures.TrustedContact; import com.tinfoil.sms.database.DBAccessor; import com.tinfoil.sms.loader.OnFinishedImportingListener; import com.tinfoil.sms.utility.SMSUtility; public class ImportTask extends AsyncTask<Context, Void, Integer>{ private OnFinishedImportingListener listener; private ArrayList<TrustedContact> tc; private ArrayList<Boolean> inDb; private boolean clicked; private DBAccessor loader; private boolean doNothing; private SharedPreferences sharedPrefs; public ImportTask(OnFinishedImportingListener listener, boolean doNothing) { super(); this.listener = listener; this.clicked = false; this.doNothing = doNothing; } public ImportTask(OnFinishedImportingListener listener, boolean clicked, boolean doNothing, ArrayList<TrustedContact> tc, ArrayList<Boolean> inDb) { super(); this.listener = listener; this.clicked = clicked; this.doNothing = doNothing; this.tc = tc; this.inDb = inDb; } /* * (non-Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Integer doInBackground(Context... params) { Context context = params[0]; loader = new DBAccessor(context); sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); if (!doNothing) { if (!this.clicked) { tc = new ArrayList<TrustedContact>(); ArrayList<Number> number; String name; String id; final Uri mContacts = ContactsContract.Contacts.CONTENT_URI; final Cursor cur = context.getContentResolver().query(mContacts, new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.HAS_PHONE_NUMBER }, null, null, Contacts.DISPLAY_NAME); this.inDb = new ArrayList<Boolean>(); if (cur != null && cur.moveToFirst()) { do { number = new ArrayList<Number>(); name = cur.getString(cur.getColumnIndex(Contacts.DISPLAY_NAME)); id = cur.getString(cur.getColumnIndex(Contacts._ID)); if (cur.getString(cur.getColumnIndex(Contacts.HAS_PHONE_NUMBER)).equalsIgnoreCase("1")) { Cursor mCur = null; final Cursor pCur = context.getContentResolver().query(Phone.CONTENT_URI, new String[] { Phone.NUMBER, Phone.TYPE }, Phone.CONTACT_ID + " = ?", new String[] { id }, null); if (pCur != null && pCur.moveToFirst()) { do { final String numb = pCur.getString(pCur.getColumnIndex(Phone.NUMBER)); final int type = pCur.getInt(pCur.getColumnIndex(Phone.TYPE)); final Uri uriSMSURI = Uri.parse("content://sms/"); // Ensure that the number retrieved is not null if(numb != null) { number.add(new Number(SMSUtility.format(numb), type)); //This now takes into account the different formats of the numbers. mCur = context.getContentResolver().query(uriSMSURI, new String[] { "body", "date", "type" }, "address = ? or address = ? or address = ?", new String[] { SMSUtility.format(numb), "+1" + SMSUtility.format(numb), "1" + SMSUtility.format(numb) }, "date DESC LIMIT " + Integer.valueOf(sharedPrefs.getString (QuickPrefsActivity.MESSAGE_LIMIT_SETTING_KEY, String.valueOf(SMSUtility.LIMIT)))); if (mCur != null && mCur.moveToFirst()) { do { //Toast.makeText(this, ContactRetriever.millisToDate(mCur.getLong(mCur.getColumnIndex("date"))), Toast.LENGTH_LONG); final Message myM = new Message(mCur.getString(mCur.getColumnIndex("body")), mCur.getLong(mCur.getColumnIndex("date")), mCur.getInt(mCur.getColumnIndex("type"))); number.get(number.size() - 1).addMessage(myM); } while (mCur.moveToNext()); } } } while (pCur.moveToNext()); } if(mCur != null) { mCur.close(); } pCur.close(); } /* * Added a check to see if the number array is empty * if a contact has no number they can not be texted * therefore there is no point allowing them to be * added. */ if (number != null && !number.isEmpty() && !loader.inDatabase(number)) { tc.add(new TrustedContact(name, number)); this.inDb.add(false); } number = null; } while (cur.moveToNext()); } // cur.close(); final Uri uriSMSURI = Uri.parse("content://sms/conversations/"); final Cursor convCur = context.getContentResolver().query(uriSMSURI, new String[] { "thread_id" }, null, null, "date DESC"); Cursor nCur = null; Cursor sCur = null; Number newNumber = null; //Check if the thread has been stopped while (convCur != null && convCur.moveToNext()) { id = convCur.getString(convCur.getColumnIndex("thread_id")); nCur = context.getContentResolver().query(Uri.parse("content://sms/inbox"), new String[] { "body", "address", "date", "type" }, "thread_id = ?", new String[] { id }, "date DESC LIMIT " + Integer.valueOf(sharedPrefs.getString (QuickPrefsActivity.MESSAGE_LIMIT_SETTING_KEY, String.valueOf(SMSUtility.LIMIT)))); if (nCur != null && nCur.moveToFirst()) { String value = nCur.getString(nCur.getColumnIndex("address")); if(value != null) { newNumber = new Number(SMSUtility.format(value)); do { newNumber.addMessage(new Message(nCur.getString(nCur.getColumnIndex("body")), nCur.getLong(nCur.getColumnIndex("date")), nCur.getInt(nCur.getColumnIndex("type")))); //newNumber.setDate(nCur.getLong(nCur.getColumnIndex("date"))); } while (nCur.moveToNext()); } } sCur = context.getContentResolver().query(Uri.parse("content://sms/sent"), new String[] { "body", "address", "date", "type" }, "thread_id = ?", new String[] { id }, "date DESC LIMIT " + Integer.valueOf(sharedPrefs.getString (QuickPrefsActivity.MESSAGE_LIMIT_SETTING_KEY, String.valueOf(SMSUtility.LIMIT)))); if (sCur != null && sCur.moveToFirst()) { if (newNumber == null) { newNumber = new Number(SMSUtility.format( sCur.getString(sCur.getColumnIndex("address")))); } do { newNumber.addMessage(new Message(sCur.getString(sCur.getColumnIndex("body")), sCur.getLong(sCur.getColumnIndex("date")), sCur.getInt(sCur.getColumnIndex("type")))); //newNumber.setDate(nCur.getLong(nCur.getColumnIndex("date"))); } while (sCur.moveToNext()); } int [] ent = null; if(newNumber != null) { ent = TrustedContact.isNumberUsed(tc, newNumber.getNumber()); } if (ent == null && newNumber != null && !loader.inDatabase(newNumber.getNumber()) && newNumber.getNumber() != null) { tc.add(new TrustedContact(newNumber)); this.inDb.add(false); } else if(newNumber != null && newNumber.getNumber() != null && ent != null && !loader.inDatabase(newNumber.getNumber())) { //Add messages to list //newNumber.getNumber(); Number num = tc.get(ent[0]).getNumberOb(ent[1]); if(num != null) { for(int i = 0; i < newNumber.getMessages().size(); i++) { if(!num.getMessages().contains(newNumber.getMessages().get(i))) { num.getMessages().add(newNumber.getMessages().get(i)); } } //num.setMessage(newNumber.getMessages()); } } } if(nCur != null) { nCur.close(); } if(sCur != null) { sCur.close(); } if(convCur != null) { convCur.close(); } } else { //Ensure list of trusted contacts is populated if(tc == null) { return ImportContacts.NOTHING; } for (int i = 0; i < this.tc.size(); i++) { if (this.inDb.get(i)) { loader.addRow(tc.get(i)); } } return ImportContacts.FINISH; } return ImportContacts.LOAD; } return ImportContacts.NOTHING; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(final Integer success) { // Call the listener if this is successful. if (listener != null) { listener.onFinishedImportingListener(success, tc, inDb); } } /* * (non-Javadoc) * * @see android.os.AsyncTask#onCancelled() */ @Override protected void onCancelled() { // Not implemented. Provided to satisfy interface. } /** * setOnFinishedTaskListener Used to set the task listener. * * @param listener * The listener to set to. */ public void setOnFinshedTaskListener(OnFinishedImportingListener listener) { this.listener = listener; } /** * Set the stop flag to to true */ public synchronized void setClicked(boolean clicked) { this.clicked = clicked; } /** * Get the stop flag * @return The stop flag */ public synchronized boolean getClicked() { return this.clicked; } }