package com.moez.QKSMS.data;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import android.widget.Toast;
import com.moez.QKSMS.R;
import com.moez.QKSMS.receiver.UnreadBadgeService;
import com.moez.QKSMS.common.google.DraftCache;
import com.moez.QKSMS.transaction.NotificationManager;
import com.moez.QKSMS.transaction.SmsHelper;
import com.moez.QKSMS.transaction.SqliteWrapper;
import com.moez.QKSMS.ui.dialog.DefaultSmsHelper;
import com.moez.QKSMS.ui.messagelist.MessageColumns;
import com.moez.QKSMS.ui.messagelist.MessageItem;
/**
* Use this class (rather than Conversation) for marking conversations as read, and managing drafts.
*/
public class ConversationLegacy {
private final String TAG = "ConversationLegacy";
public static final Uri CONVERSATIONS_CONTENT_PROVIDER = Uri.parse("content://mms-sms/conversations?simple=true");
public static final Uri ADDRESSES_CONTENT_PROVIDER = Uri.parse("content://mms-sms/canonical-addresses");
public static final int COLUMN_ADDRESSES_ADDRESS = 1;
private ContactHelper contactHelper;
private Context context;
private long threadId;
private String name;
private String address;
private long recipient;
private String draft;
private int type;
private Cursor cursor;
public ConversationLegacy(Context context, long threadId) {
this.context = context;
this.threadId = threadId;
contactHelper = new ContactHelper();
}
public long getThreadId() {
return threadId;
}
public Uri getUri() {
return Uri.parse("content://mms-sms/conversations/" + getThreadId());
}
public String getName(boolean findIfNull) {
if (name == null || name.trim().isEmpty()) {
if (findIfNull) name = contactHelper.getName(context, getAddress());
else return getAddress();
}
return name;
}
public String getAddress() {
if (address == null) {
if (getType() == 0) { //Single person
try {
cursor = context.getContentResolver().query(ADDRESSES_CONTENT_PROVIDER, null, "_id=" + getRecipient(), null, null);
cursor.moveToFirst();
address = cursor.getString(COLUMN_ADDRESSES_ADDRESS);
address = PhoneNumberUtils.stripSeparators(address);
if (address == null || address.isEmpty()) {
cursor = context.getContentResolver().query(SmsHelper.RECEIVED_MESSAGE_CONTENT_PROVIDER, new String[]{SmsHelper.COLUMN_ID}, "thread_id=" + threadId, null, SmsHelper.sortDateDesc);
cursor.moveToFirst();
long id = cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID));
address = new Message(context, id).getAddress();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}
return address;
}
public long getRecipient() {
if (recipient == 0) {
try {
cursor = context.getContentResolver().query(CONVERSATIONS_CONTENT_PROVIDER, null, "_id=" + threadId, null, null);
cursor.moveToFirst();
recipient = cursor.getInt(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_RECIPIENT));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
return recipient;
}
public boolean hasDraft() {
return DraftCache.getInstance().hasDraft(threadId);
}
public String getDraft() {
if (draft == null) {
try {
cursor = context.getContentResolver().query(SmsHelper.DRAFTS_CONTENT_PROVIDER, null, SmsHelper.COLUMN_THREAD_ID + "=" + threadId, null, null);
cursor.moveToFirst();
draft = cursor.getString(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_BODY));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
return draft;
}
public void clearDrafts() {
if (hasDraft()) {
try {
DraftCache.getInstance().setSavingDraft(true);
DraftCache.getInstance().setDraftState(threadId, false);
cursor = context.getContentResolver().query(SmsHelper.DRAFTS_CONTENT_PROVIDER, null, SmsHelper.COLUMN_THREAD_ID + "=" + threadId, null, null);
if (cursor.moveToFirst()) {
do {
context.getContentResolver().delete(Uri.parse("content://sms/" + cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID))), null, null);
} while (cursor.moveToNext());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
DraftCache.getInstance().setSavingDraft(false);
}
}
}
public void saveDraft(final String draft) {
clearDrafts();
if (draft.length() > 0) {
try {
DraftCache.getInstance().setSavingDraft(true);
DraftCache.getInstance().setDraftState(threadId, true);
ConversationLegacy.this.draft = draft;
ContentResolver contentResolver = context.getContentResolver();
ContentValues cv = new ContentValues();
cv.put("address", getAddress());
cv.put("body", draft);
contentResolver.insert(SmsHelper.DRAFTS_CONTENT_PROVIDER, cv);
} finally {
DraftCache.getInstance().setSavingDraft(false);
}
} else {
ConversationLegacy.this.draft = null;
}
Toast.makeText(context, R.string.toast_draft, Toast.LENGTH_SHORT).show();
}
public int getType() {
if (type == 0) {
try {
cursor = context.getContentResolver().query(CONVERSATIONS_CONTENT_PROVIDER, null, "_id=" + threadId, null, null);
cursor.moveToFirst();
type = cursor.getInt(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_TYPE));
} catch (Exception e) {
e.printStackTrace();
} finally {
cursor.close();
}
}
return type;
}
private long[] getUnreadIds() {
long[] ids = new long[0];
try {
cursor = context.getContentResolver().query(getUri(), new String[]{SmsHelper.COLUMN_ID}, SmsHelper.UNREAD_SELECTION, null, null);
ids = new long[cursor.getCount()];
cursor.moveToFirst();
for (int i = 0; i < ids.length; i++) {
ids[i] = cursor.getLong(cursor.getColumnIndexOrThrow(SmsHelper.COLUMN_ID));
cursor.moveToNext();
Log.d(TAG, "Unread ID: " + ids[i]);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
return ids;
}
public void markRead() {
new Thread() {
public void run() {
long[] ids = getUnreadIds();
if (ids.length > 0) {
new DefaultSmsHelper(context, R.string.not_default_mark_read).showIfNotDefault(null);
ContentValues cv = new ContentValues();
cv.put("read", true);
cv.put("seen", true);
for (long id : ids) {
context.getContentResolver().update(getUri(), cv, SmsHelper.COLUMN_ID + "=" + id, null);
}
NotificationManager.update(context);
UnreadBadgeService.update(context);
}
}
}.start();
}
public void markUnread() {
new DefaultSmsHelper(context, R.string.not_default_mark_unread).showIfNotDefault(null);
try {
cursor = context.getContentResolver().query(getUri(), MessageColumns.PROJECTION, null, null, SmsHelper.sortDateDesc);
cursor.moveToFirst();
MessageColumns.ColumnsMap columnsMap = new MessageColumns.ColumnsMap(cursor);
MessageItem message = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType), cursor, columnsMap, null, true);
if (message.isMe()) {
while (cursor.moveToNext()) {
MessageItem message2 = new MessageItem(context, cursor.getString(columnsMap.mColumnMsgType), cursor, columnsMap, null, true);
if (!message2.isMe()) {
message = message2;
break;
}
}
}
ContentValues cv = new ContentValues();
cv.put("read", false);
cv.put("seen", false);
context.getContentResolver().update(message.mMessageUri, cv, null, null);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
NotificationManager.create(context);
}
public void delete() { //TODO do this using AsyncQueryHandler
new DefaultSmsHelper(context, R.string.not_default_delete).showIfNotDefault(null);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
SqliteWrapper.delete(context, context.getContentResolver(), getUri(), null, null);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
Toast.makeText(context, R.string.toast_conversation_deleted, Toast.LENGTH_SHORT).show();
}
}.execute((Void[]) null);
}
}