From 83f90ddd4e4ad5422c1f0d47671ebf6707b88e1b Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Sun, 6 Jan 2013 13:13:14 -0800 Subject: [PATCH] Display both sent and received time in message details. 1) We record time sent in SMS database (date_sent). 2) We record time received in MMS database (date_received). 3) We union this information correctly in MmsSmsDatabase. --- res/values/strings.xml | 1 + .../securesms/ConversationAdapter.java | 19 +++++---- .../securesms/ConversationFragment.java | 25 ++++++++---- .../securesms/ConversationItem.java | 4 +- .../securesms/database/DatabaseFactory.java | 18 ++++++++- .../securesms/database/MmsDatabase.java | 20 +++++++--- .../securesms/database/MmsSmsDatabase.java | 40 +++++++++++++------ .../securesms/database/SmsDatabase.java | 40 +++++++++++++------ .../securesms/database/SmsMigrator.java | 21 +++++----- .../securesms/database/ThreadDatabase.java | 2 +- .../database/model/DisplayRecord.java | 22 ++++++---- .../database/model/MediaMmsMessageRecord.java | 7 ++-- .../database/model/MessageRecord.java | 6 +-- .../model/NotificationMmsMessageRecord.java | 7 ++-- .../database/model/SmsMessageRecord.java | 11 +++-- .../database/model/ThreadRecord.java | 6 ++- 16 files changed, 168 insertions(+), 81 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 4b6381f2e2..0593b20b62 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -87,6 +87,7 @@ Message details Sender: %1$s\nTransport: %2$s\nSent/Received:%3$s + Sender: %1$s\nTransport: %2$s\nSent: %3$s\nReceived:%4$s Confirm Message Delete Are you sure that you want to permanently delete this message? diff --git a/src/org/thoughtcrime/securesms/ConversationAdapter.java b/src/org/thoughtcrime/securesms/ConversationAdapter.java index e0025ddd22..bf614a2fbc 100644 --- a/src/org/thoughtcrime/securesms/ConversationAdapter.java +++ b/src/org/thoughtcrime/securesms/ConversationAdapter.java @@ -143,7 +143,8 @@ public class ConversationAdapter extends CursorAdapter { private MediaMmsMessageRecord getMediaMmsMessageRecord(long messageId, Cursor cursor) { long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.ID)); - long date = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.DATE)); + long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsDatabase.DATE_SENT)); + long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsDatabase.DATE_RECEIVED)); long box = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)); Recipient recipient = getIndividualRecipientFor(null); GroupData groupData = null; @@ -175,13 +176,15 @@ public class ConversationAdapter extends CursorAdapter { } return new MediaMmsMessageRecord(context, id, recipients, recipient, - date, threadId, slideDeck, box, groupData); + dateSent, dateReceived, threadId, + slideDeck, box, groupData); } private NotificationMmsMessageRecord getNotificationMmsMessageRecord(long messageId, Cursor cursor) { Recipient recipient = getIndividualRecipientFor(null); long id = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.ID)); - long date = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.DATE)); + long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsDatabase.DATE_SENT)); + long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsDatabase.DATE_RECEIVED)); NotificationInd notification; @@ -192,7 +195,8 @@ public class ConversationAdapter extends CursorAdapter { notification = new NotificationInd(new PduHeaders()); } - return new NotificationMmsMessageRecord(id, recipients, recipient, date, threadId, + return new NotificationMmsMessageRecord(id, recipients, recipient, + dateSent, dateReceived, threadId, notification.getContentLocation(), notification.getMessageSize(), notification.getExpiry(), @@ -201,7 +205,8 @@ public class ConversationAdapter extends CursorAdapter { } private SmsMessageRecord getSmsMessageRecord(long messageId, Cursor cursor) { - long date = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.DATE)); + long dateReceived = cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsDatabase.DATE_RECEIVED)); + long dateSent = cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsDatabase.DATE_SENT)); long type = cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.TYPE)); String body = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.BODY)); String address = cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.ADDRESS)); @@ -220,8 +225,8 @@ public class ConversationAdapter extends CursorAdapter { } SmsMessageRecord messageRecord = new SmsMessageRecord(context, messageId, recipients, - recipient, date, type, threadId, - groupData); + recipient, dateSent, dateReceived, + type, threadId, groupData); if (body == null) { body = ""; diff --git a/src/org/thoughtcrime/securesms/ConversationFragment.java b/src/org/thoughtcrime/securesms/ConversationFragment.java index 429207e6cf..9a29a4b3d0 100644 --- a/src/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/org/thoughtcrime/securesms/ConversationFragment.java @@ -123,19 +123,30 @@ public class ConversationFragment extends SherlockListFragment } private void handleDisplayDetails(MessageRecord message) { - String sender = message.getRecipients().getPrimaryRecipient().getNumber(); - String transport = message.isMms() ? "mms" : "sms"; - long date = message.getDate(); + String sender = message.getRecipients().getPrimaryRecipient().getNumber(); + String transport = message.isMms() ? "mms" : "sms"; + long dateReceived = message.getDateReceived(); + long dateSent = message.getDateSent(); SimpleDateFormat dateFormatter = new SimpleDateFormat("EEE MMM d, yyyy 'at' hh:mm:ss a zzz"); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.ConversationFragment_message_details); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setCancelable(false); - builder.setMessage(String.format(getSherlockActivity() - .getString(R.string.ConversationFragment_sender_s_transport_s_sent_received_s), - sender, transport.toUpperCase(), - dateFormatter.format(new Date(date)))); + + if (dateReceived == dateSent || message.isOutgoing()) { + builder.setMessage(String.format(getSherlockActivity() + .getString(R.string.ConversationFragment_sender_s_transport_s_sent_received_s), + sender, transport.toUpperCase(), + dateFormatter.format(new Date(dateSent)))); + } else { + builder.setMessage(String.format(getSherlockActivity() + .getString(R.string.ConversationFragment_sender_s_transport_s_sent_s_received_s), + sender, transport.toUpperCase(), + dateFormatter.format(new Date(dateSent)), + dateFormatter.format(new Date(dateReceived)))); + } + builder.setPositiveButton(android.R.string.ok, null); builder.show(); } diff --git a/src/org/thoughtcrime/securesms/ConversationItem.java b/src/org/thoughtcrime/securesms/ConversationItem.java index a6076adc40..3220dc005d 100644 --- a/src/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/org/thoughtcrime/securesms/ConversationItem.java @@ -190,7 +190,9 @@ public class ConversationItem extends LinearLayout { if (messageRecord.isFailed()) dateText.setText(R.string.ConversationItem_error_sending_message); else if (messageRecord.isPending()) dateText.setText(R.string.ConversationItem_sending); else dateText.setText(DateUtils.getRelativeTimeSpanString(getContext(), - messageRecord.getDate(), + (messageRecord.isOutgoing() ? + messageRecord.getDateSent() : + messageRecord.getDateReceived()), false)); } diff --git a/src/org/thoughtcrime/securesms/database/DatabaseFactory.java b/src/org/thoughtcrime/securesms/database/DatabaseFactory.java index e4ff5238ae..91d4faf540 100644 --- a/src/org/thoughtcrime/securesms/database/DatabaseFactory.java +++ b/src/org/thoughtcrime/securesms/database/DatabaseFactory.java @@ -27,7 +27,8 @@ public class DatabaseFactory { private static final int INTRODUCED_IDENTITIES_VERSION = 2; private static final int INTRODUCED_INDEXES_VERSION = 3; - private static final int DATABASE_VERSION = 3; + private static final int INTRODUCED_DATE_SENT_VERSION = 4; + private static final int DATABASE_VERSION = 4; private static final String DATABASE_NAME = "messages.db"; private static final Object lock = new Object(); @@ -171,6 +172,21 @@ public class DatabaseFactory { executeStatements(db, ThreadDatabase.CREATE_INDEXS); executeStatements(db, MmsAddressDatabase.CREATE_INDEXS); } + + if (oldVersion < INTRODUCED_DATE_SENT_VERSION) { + db.beginTransaction(); + db.execSQL("ALTER TABLE " + SmsDatabase.TABLE_NAME + + " ADD COLUMN " + SmsDatabase.DATE_SENT + " INTEGER;"); + db.execSQL("UPDATE " + SmsDatabase.TABLE_NAME + + " SET " + SmsDatabase.DATE_SENT + " = " + SmsDatabase.DATE_RECEIVED + ";"); + + db.execSQL("ALTER TABLE " + MmsDatabase.TABLE_NAME + + " ADD COLUMN " + MmsDatabase.DATE_RECEIVED + " INTEGER;"); + db.execSQL("UPDATE " + MmsDatabase.TABLE_NAME + + " SET " + MmsDatabase.DATE_RECEIVED + " = " + MmsDatabase.DATE_SENT + ";"); + db.setTransactionSuccessful(); + db.endTransaction(); + } } private void executeStatements(SQLiteDatabase db, String[] statements) { diff --git a/src/org/thoughtcrime/securesms/database/MmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsDatabase.java index 0bbedc9c59..bf508f5309 100644 --- a/src/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -49,7 +49,8 @@ public class MmsDatabase extends Database { public static final String TABLE_NAME = "mms"; public static final String ID = "_id"; private static final String THREAD_ID = "thread_id"; - public static final String DATE = "date"; + public static final String DATE_SENT = "date"; + public static final String DATE_RECEIVED = "date_received"; public static final String MESSAGE_BOX = "msg_box"; private static final String READ = "read"; private static final String MESSAGE_ID = "m_id"; @@ -78,7 +79,7 @@ public class MmsDatabase extends Database { private static final String DELIVERY_REPORT = "d_rpt"; public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY, " + - THREAD_ID + " INTEGER, " + DATE + " INTEGER, " + MESSAGE_BOX + " INTEGER, " + + THREAD_ID + " INTEGER, " + DATE_SENT + " INTEGER, " + DATE_RECEIVED + "INTEGER, " + MESSAGE_BOX + " INTEGER, " + READ + " INTEGER DEFAULT 0, " + MESSAGE_ID + " TEXT, " + SUBJECT + " TEXT, " + SUBJECT_CHARSET + " INTEGER, " + CONTENT_TYPE + " TEXT, " + CONTENT_LOCATION + " TEXT, " + EXPIRY + " INTEGER, " + MESSAGE_CLASS + " TEXT, " + MESSAGE_TYPE + " INTEGER, " + @@ -297,6 +298,10 @@ public class MmsDatabase extends Database { contentValues.put(THREAD_ID, threadId); contentValues.put(CONTENT_LOCATION, contentLocation); contentValues.put(STATUS, Types.DOWNLOAD_INITIALIZED); + contentValues.put(DATE_RECEIVED, System.currentTimeMillis() / 1000); + + if (!contentValues.containsKey(DATE_SENT)) + contentValues.put(DATE_SENT, contentValues.getAsLong(DATE_RECEIVED)); long messageId = insertMediaMessage(retrieved, contentValues); return messageId; @@ -327,8 +332,10 @@ public class MmsDatabase extends Database { contentValues.put(MESSAGE_BOX, Types.MESSAGE_BOX_INBOX); contentValues.put(THREAD_ID, threadId); contentValues.put(STATUS, Types.DOWNLOAD_INITIALIZED); - if (!contentValues.containsKey(DATE)) - contentValues.put(DATE, System.currentTimeMillis() / 1000); + contentValues.put(DATE_RECEIVED, System.currentTimeMillis() / 1000); + + if (!contentValues.containsKey(DATE_SENT)) + contentValues.put(DATE_SENT, contentValues.getAsLong(DATE_RECEIVED)); long messageId = db.insert(TABLE_NAME, null, contentValues); addressDatabase.insertAddressesForId(messageId, headers); @@ -353,6 +360,7 @@ public class MmsDatabase extends Database { contentValues.put(THREAD_ID, threadId); contentValues.put(READ, 1); + contentValues.put(DATE_RECEIVED, contentValues.getAsLong(DATE_SENT)); long messageId = insertMediaMessage(sendRequest, contentValues); DatabaseFactory.getThreadDatabase(context).setRead(threadId); @@ -480,7 +488,7 @@ public class MmsDatabase extends Database { phb.addOctet(REPORT_ALLOWED, PduHeaders.REPORT_ALLOWED); phb.addOctet(RETRIEVE_STATUS, PduHeaders.RETRIEVE_STATUS); phb.addOctet(STATUS, PduHeaders.STATUS); - phb.addLong(DATE, PduHeaders.DATE); + phb.addLong(DATE_SENT, PduHeaders.DATE); phb.addLong(DELIVERY_TIME, PduHeaders.DELIVERY_TIME); phb.addLong(EXPIRY, PduHeaders.EXPIRY); phb.addLong(MESSAGE_SIZE, PduHeaders.MESSAGE_SIZE); @@ -510,7 +518,7 @@ public class MmsDatabase extends Database { cvb.add(REPORT_ALLOWED, headers.getOctet(PduHeaders.REPORT_ALLOWED)); cvb.add(RETRIEVE_STATUS, headers.getOctet(PduHeaders.RETRIEVE_STATUS)); cvb.add(STATUS, headers.getOctet(PduHeaders.STATUS)); - cvb.add(DATE, headers.getLongInteger(PduHeaders.DATE)); + cvb.add(DATE_SENT, headers.getLongInteger(PduHeaders.DATE)); cvb.add(DELIVERY_TIME, headers.getLongInteger(PduHeaders.DELIVERY_TIME)); cvb.add(EXPIRY, headers.getLongInteger(PduHeaders.EXPIRY)); cvb.add(MESSAGE_SIZE, headers.getLongInteger(PduHeaders.MESSAGE_SIZE)); diff --git a/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index f49f720c99..e252e6afc5 100644 --- a/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -35,6 +35,9 @@ public class MmsSmsDatabase extends Database { public static final String MMS_GROUP_SENT_COUNT = "mms_group_sent_count"; public static final String MMS_GROUP_SEND_FAILED_COUNT = "mms_group_sent_failed_count"; + public static final String DATE_SENT = "date_sent"; + public static final String DATE_RECEIVED = "date_received"; + public MmsSmsDatabase(Context context, SQLiteOpenHelper databaseHelper) { super(context, databaseHelper); } @@ -75,10 +78,10 @@ public class MmsSmsDatabase extends Database { "WHEN " + SmsDatabase.Types.FAILED_TYPE + " THEN 1 " + "ELSE 0 END)"; - String[] projection = {"_id", "body", "type", "address", "subject", "normalized_date AS date", "m_type", "msg_box", "transport_type", "COUNT(_id) AS group_size", mmsGroupSentCount + " AS mms_group_sent_count", mmsGroupSentFailedCount + " AS mms_group_sent_failed_count", smsGroupSentCount + " AS sms_group_sent_count", smsGroupSentFailedCount + " AS sms_group_sent_failed_count", smsCaseSecurity + " AS sms_collate", mmsCaseSecurity + " AS mms_collate"}; - String order = "normalized_date ASC"; + String[] projection = {"_id", "body", "type", "address", "subject", "normalized_date_sent AS date_sent", "normalized_date_received AS date_received", "m_type", "msg_box", "transport_type", "COUNT(_id) AS group_size", mmsGroupSentCount + " AS mms_group_sent_count", mmsGroupSentFailedCount + " AS mms_group_sent_failed_count", smsGroupSentCount + " AS sms_group_sent_count", smsGroupSentFailedCount + " AS sms_group_sent_failed_count", smsCaseSecurity + " AS sms_collate", mmsCaseSecurity + " AS mms_collate"}; + String order = "normalized_date_received ASC"; String selection = "thread_id = " + threadId; - String groupBy = "normalized_date / 1000, sms_collate, mms_collate"; + String groupBy = "normalized_date_sent / 1000, sms_collate, mms_collate"; Cursor cursor = queryTables(projection, selection, order, groupBy, null); setNotifyConverationListeners(cursor, threadId); @@ -87,8 +90,11 @@ public class MmsSmsDatabase extends Database { } public Cursor getConversation(long threadId) { - String[] projection = {"_id", "body", "type", "address", "subject", "normalized_date AS date", "m_type", "msg_box", "transport_type"}; - String order = "normalized_date ASC"; + String[] projection = {"_id", "body", "type", "address", "subject", + "normalized_date_sent AS date_sent", + "normalized_date_received AS date_received", + "m_type", "msg_box", "transport_type"}; + String order = "normalized_date_received ASC"; String selection = "thread_id = " + threadId; Cursor cursor = queryTables(projection, selection, order, null, null); @@ -98,8 +104,11 @@ public class MmsSmsDatabase extends Database { } public Cursor getConversationSnippet(long threadId) { - String[] projection = {"_id", "body", "type", "address", "subject", "normalized_date AS date", "m_type", "msg_box", "transport_type"}; - String order = "normalized_date DESC"; + String[] projection = {"_id", "body", "type", "address", "subject", + "normalized_date_sent AS date_sent", + "normalized_date_received AS date_received", + "m_type", "msg_box", "transport_type"}; + String order = "normalized_date_received DESC"; String selection = "thread_id = " + threadId; Cursor cursor = queryTables(projection, selection, order, null, "1"); @@ -107,8 +116,11 @@ public class MmsSmsDatabase extends Database { } public Cursor getUnread() { - String[] projection = {"_id", "body", "read", "type", "address", "subject", "thread_id", "normalized_date AS date", "m_type", "msg_box", "transport_type"}; - String order = "normalized_date ASC"; + String[] projection = {"_id", "body", "read", "type", "address", "subject", "thread_id", + "normalized_date_sent AS date_sent", + "normalized_date_received AS date_received", + "m_type", "msg_box", "transport_type"}; + String order = "normalized_date_received ASC"; String selection = "read = 0"; Cursor cursor = queryTables(projection, selection, order, null, null); @@ -123,8 +135,8 @@ public class MmsSmsDatabase extends Database { } private Cursor queryTables(String[] projection, String selection, String order, String groupBy, String limit) { - String[] mmsProjection = {"date * 1000 AS normalized_date", "_id", "body", "read", "thread_id", "type", "address", "subject", "date", "m_type", "msg_box", "transport_type"}; - String[] smsProjection = {"date * 1 AS normalized_date", "_id", "body", "read", "thread_id", "type", "address", "subject", "date", "m_type", "msg_box", "transport_type"}; + String[] mmsProjection = {"date * 1000 AS normalized_date_sent", "date_received * 1000 AS normalized_date_received", "_id", "body", "read", "thread_id", "type", "address", "subject", "date", "m_type", "msg_box", "transport_type"}; + String[] smsProjection = {"date_sent * 1 AS normalized_date_sent", "date * 1 AS normalized_date_received", "_id", "body", "read", "thread_id", "type", "address", "subject", "date", "m_type", "msg_box", "transport_type"}; SQLiteQueryBuilder mmsQueryBuilder = new SQLiteQueryBuilder(); SQLiteQueryBuilder smsQueryBuilder = new SQLiteQueryBuilder(); @@ -140,6 +152,7 @@ public class MmsSmsDatabase extends Database { mmsColumnsPresent.add("m_type"); mmsColumnsPresent.add("msg_box"); mmsColumnsPresent.add("date"); + mmsColumnsPresent.add("date_received"); mmsColumnsPresent.add("read"); mmsColumnsPresent.add("thread_id"); @@ -149,12 +162,13 @@ public class MmsSmsDatabase extends Database { smsColumnsPresent.add("type"); smsColumnsPresent.add("address"); smsColumnsPresent.add("subject"); + smsColumnsPresent.add("date_sent"); smsColumnsPresent.add("date"); smsColumnsPresent.add("read"); smsColumnsPresent.add("thread_id"); - String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery("transport_type", mmsProjection, mmsColumnsPresent, 0, "mms", selection, null, null, null); - String smsSubQuery = smsQueryBuilder.buildUnionSubQuery("transport_type", smsProjection, smsColumnsPresent, 0, "sms", selection, null, null, null); + String mmsSubQuery = mmsQueryBuilder.buildUnionSubQuery("transport_type", mmsProjection, mmsColumnsPresent, 2, "mms", selection, null, null, null); + String smsSubQuery = smsQueryBuilder.buildUnionSubQuery("transport_type", smsProjection, smsColumnsPresent, 2, "sms", selection, null, null, null); SQLiteQueryBuilder unionQueryBuilder = new SQLiteQueryBuilder(); String unionQuery = unionQueryBuilder.buildUnionQuery(new String[] {smsSubQuery, mmsSubQuery}, order, null); diff --git a/src/org/thoughtcrime/securesms/database/SmsDatabase.java b/src/org/thoughtcrime/securesms/database/SmsDatabase.java index 16944b7d4e..ebcfff571d 100644 --- a/src/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -45,7 +45,8 @@ public class SmsDatabase extends Database { public static final String THREAD_ID = "thread_id"; public static final String ADDRESS = "address"; public static final String PERSON = "person"; - public static final String DATE = "date"; + public static final String DATE_RECEIVED = "date"; + public static final String DATE_SENT = "date_sent"; public static final String PROTOCOL = "protocol"; public static final String READ = "read"; public static final String STATUS = "status"; @@ -56,10 +57,10 @@ public class SmsDatabase extends Database { public static final String SERVICE_CENTER = "service_center"; public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " integer PRIMARY KEY, " + - THREAD_ID + " INTEGER, " + ADDRESS + " TEXT, " + PERSON + " INTEGER, " + DATE + " INTEGER, " + - PROTOCOL + " INTEGER, " + READ + " INTEGER DEFAULT 0, " + STATUS + " INTEGER DEFAULT -1," + - TYPE + " INTEGER, " + REPLY_PATH_PRESENT + " INTEGER, " + SUBJECT + " TEXT, " + BODY + " TEXT, " + - SERVICE_CENTER + " TEXT);"; + THREAD_ID + " INTEGER, " + ADDRESS + " TEXT, " + PERSON + " INTEGER, " + DATE_RECEIVED + " INTEGER, " + + DATE_SENT + " INTEGER, " + PROTOCOL + " INTEGER, " + READ + " INTEGER DEFAULT 0, " + + STATUS + " INTEGER DEFAULT -1," + TYPE + " INTEGER, " + REPLY_PATH_PRESENT + " INTEGER, " + + SUBJECT + " TEXT, " + BODY + " TEXT, " + SERVICE_CENTER + " TEXT);"; public static final String[] CREATE_INDEXS = { "CREATE INDEX IF NOT EXISTS sms_thread_id_index ON " + TABLE_NAME + " (" + THREAD_ID + ");", @@ -82,7 +83,7 @@ public class SmsDatabase extends Database { notifyConversationListeners(getThreadIdForMessage(id)); } - private long insertMessageReceived(SmsMessage message, String body, long type) { + private long insertMessageReceived(SmsMessage message, String body, long type, long timeSent) { List recipientList = new ArrayList(1); recipientList.add(new Recipient(null, message.getDisplayOriginatingAddress(), null, null)); Recipients recipients = new Recipients(recipientList); @@ -91,7 +92,8 @@ public class SmsDatabase extends Database { ContentValues values = new ContentValues(6); values.put(ADDRESS, message.getDisplayOriginatingAddress()); - values.put(DATE, Long.valueOf(System.currentTimeMillis())); + values.put(DATE_RECEIVED, Long.valueOf(System.currentTimeMillis())); + values.put(DATE_SENT, timeSent); values.put(PROTOCOL, message.getProtocolIdentifier()); values.put(READ, Integer.valueOf(0)); @@ -198,11 +200,12 @@ public class SmsDatabase extends Database { } public long insertSecureMessageReceived(SmsMessage message, String body) { - return insertMessageReceived(message, body, Types.DECRYPT_IN_PROGRESS_TYPE); + return insertMessageReceived(message, body, Types.DECRYPT_IN_PROGRESS_TYPE, + message.getTimestampMillis()); } public long insertMessageReceived(SmsMessage message, String body) { - return insertMessageReceived(message, body, Types.INBOX_TYPE); + return insertMessageReceived(message, body, Types.INBOX_TYPE, message.getTimestampMillis()); } public long insertMessageSent(String address, long threadId, String body, long date, long type) { @@ -211,7 +214,8 @@ public class SmsDatabase extends Database { contentValues.put(ADDRESS, address); contentValues.put(THREAD_ID, threadId); contentValues.put(BODY, body); - contentValues.put(DATE, date); + contentValues.put(DATE_RECEIVED, date); + contentValues.put(DATE_SENT, date); contentValues.put(READ, 1); contentValues.put(TYPE, type); @@ -297,8 +301,20 @@ public class SmsDatabase extends Database { } /*package*/ SQLiteStatement createInsertStatement(SQLiteDatabase database) { - return database.compileStatement("INSERT INTO " + TABLE_NAME + " (" + ADDRESS + ", " + PERSON + ", " + DATE + ", " + PROTOCOL + ", " + READ + ", " + STATUS + ", " + TYPE + ", " + REPLY_PATH_PRESENT + ", " + SUBJECT + ", " + BODY + ", " + SERVICE_CENTER + ", THREAD_ID) " + - " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + return database.compileStatement("INSERT INTO " + TABLE_NAME + " (" + ADDRESS + ", " + + PERSON + ", " + + DATE_SENT + ", " + + DATE_RECEIVED + ", " + + PROTOCOL + ", " + + READ + ", " + + STATUS + ", " + + TYPE + ", " + + REPLY_PATH_PRESENT + ", " + + SUBJECT + ", " + + BODY + ", " + + SERVICE_CENTER + + ", THREAD_ID) " + + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); } public static class Types { diff --git a/src/org/thoughtcrime/securesms/database/SmsMigrator.java b/src/org/thoughtcrime/securesms/database/SmsMigrator.java index 51e6536bde..acda6907ca 100644 --- a/src/org/thoughtcrime/securesms/database/SmsMigrator.java +++ b/src/org/thoughtcrime/securesms/database/SmsMigrator.java @@ -77,17 +77,18 @@ public class SmsMigrator { { addStringToStatement(statement, cursor, 1, SmsDatabase.ADDRESS); addIntToStatement(statement, cursor, 2, SmsDatabase.PERSON); - addIntToStatement(statement, cursor, 3, SmsDatabase.DATE); - addIntToStatement(statement, cursor, 4, SmsDatabase.PROTOCOL); - addIntToStatement(statement, cursor, 5, SmsDatabase.READ); - addIntToStatement(statement, cursor, 6, SmsDatabase.STATUS); - addIntToStatement(statement, cursor, 7, SmsDatabase.TYPE); - addIntToStatement(statement, cursor, 8, SmsDatabase.REPLY_PATH_PRESENT); - addStringToStatement(statement, cursor, 9, SmsDatabase.SUBJECT); - addEncryptedStringToStatement(context, statement, cursor, masterSecret, 10, SmsDatabase.BODY); - addStringToStatement(statement, cursor, 11, SmsDatabase.SERVICE_CENTER); + addIntToStatement(statement, cursor, 3, SmsDatabase.DATE_SENT); + addIntToStatement(statement, cursor, 4, SmsDatabase.DATE_RECEIVED); + addIntToStatement(statement, cursor, 5, SmsDatabase.PROTOCOL); + addIntToStatement(statement, cursor, 6, SmsDatabase.READ); + addIntToStatement(statement, cursor, 7, SmsDatabase.STATUS); + addIntToStatement(statement, cursor, 8, SmsDatabase.TYPE); + addIntToStatement(statement, cursor, 9, SmsDatabase.REPLY_PATH_PRESENT); + addStringToStatement(statement, cursor, 10, SmsDatabase.SUBJECT); + addEncryptedStringToStatement(context, statement, cursor, masterSecret, 11, SmsDatabase.BODY); + addStringToStatement(statement, cursor, 12, SmsDatabase.SERVICE_CENTER); - statement.bindLong(12, threadId); + statement.bindLong(13, threadId); } private static String getTheirCanonicalAddress(Context context, String theirRecipientId) { diff --git a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java index d0ab6fe769..c4511e8fed 100644 --- a/src/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/src/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -279,7 +279,7 @@ public class ThreadDatabase extends Database { if (cursor != null && cursor.moveToFirst()) { updateThread(threadId, count, cursor.getString(cursor.getColumnIndexOrThrow(SmsDatabase.BODY)), - cursor.getLong(cursor.getColumnIndexOrThrow(SmsDatabase.DATE))); + cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsDatabase.DATE_RECEIVED))); } else { deleteThread(threadId); } diff --git a/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java index 8009b62158..1e4ef34225 100644 --- a/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/DisplayRecord.java @@ -30,7 +30,8 @@ import org.thoughtcrime.securesms.recipients.Recipients; public abstract class DisplayRecord { private final Recipients recipients; - private final long date; + private final long dateSent; + private final long dateReceived; private final long threadId; private String body; @@ -39,11 +40,12 @@ public abstract class DisplayRecord { protected boolean processedKeyExchange; protected boolean staleKeyExchange; - public DisplayRecord(Recipients recipients, long date, long threadId) { - this.threadId = threadId; - this.recipients = recipients; - this.date = date; - this.emphasis = false; + public DisplayRecord(Recipients recipients, long dateSent, long dateReceived, long threadId) { + this.threadId = threadId; + this.recipients = recipients; + this.dateSent = dateSent; + this.dateReceived = dateReceived; + this.emphasis = false; } public void setEmphasis(boolean emphasis) { @@ -81,8 +83,12 @@ public abstract class DisplayRecord { return recipients; } - public long getDate() { - return date; + public long getDateSent() { + return dateSent; + } + + public long getDateReceived() { + return dateReceived; } public long getThreadId() { diff --git a/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java b/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java index 07721db144..97837287c3 100644 --- a/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/MediaMmsMessageRecord.java @@ -42,10 +42,11 @@ public class MediaMmsMessageRecord extends MessageRecord { private final long mailbox; public MediaMmsMessageRecord(Context context, long id, Recipients recipients, - Recipient individualRecipient, long date, long threadId, - SlideDeck slideDeck, long mailbox, GroupData groupData) + Recipient individualRecipient, long dateSent, long dateReceived, + long threadId, SlideDeck slideDeck, long mailbox, + GroupData groupData) { - super(id, recipients, individualRecipient, date, threadId, groupData); + super(id, recipients, individualRecipient, dateSent, dateReceived, threadId, groupData); this.slideDeck = slideDeck; this.mailbox = mailbox; diff --git a/src/org/thoughtcrime/securesms/database/model/MessageRecord.java b/src/org/thoughtcrime/securesms/database/model/MessageRecord.java index 32133775f0..44d2888642 100644 --- a/src/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -35,10 +35,10 @@ public abstract class MessageRecord extends DisplayRecord { public MessageRecord(long id, Recipients recipients, Recipient individualRecipient, - long date, long threadId, - GroupData groupData) + long dateSent, long dateReceived, + long threadId, GroupData groupData) { - super(recipients, date, threadId); + super(recipients, dateSent, dateReceived, threadId); this.id = id; this.individualRecipient = individualRecipient; this.groupData = groupData; diff --git a/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java b/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java index 99867978bc..f640725e04 100644 --- a/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/NotificationMmsMessageRecord.java @@ -37,11 +37,11 @@ public class NotificationMmsMessageRecord extends MessageRecord { private final byte[] transactionId; public NotificationMmsMessageRecord(long id, Recipients recipients, Recipient individualRecipient, - long date, long threadId, byte[] contentLocation, - long messageSize, long expiry, + long dateSent, long dateReceived, long threadId, + byte[] contentLocation, long messageSize, long expiry, int status, byte[] transactionId) { - super(id, recipients, individualRecipient, date, threadId, null); + super(id, recipients, individualRecipient, dateSent, dateReceived, threadId, null); this.contentLocation = contentLocation; this.messageSize = messageSize; this.expiry = expiry; @@ -60,7 +60,6 @@ public class NotificationMmsMessageRecord extends MessageRecord { return this.status; } - public byte[] getContentLocation() { return contentLocation; } diff --git a/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java b/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java index b55181bbf2..b087a28806 100644 --- a/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/SmsMessageRecord.java @@ -36,16 +36,19 @@ public class SmsMessageRecord extends MessageRecord { private final Context context; private final long type; + private final long dateSent; public SmsMessageRecord(Context context, long id, Recipients recipients, Recipient individualRecipient, - long date, long type, long threadId, + long dateSent, long dateReceived, + long type, long threadId, GroupData groupData) { - super(id, recipients, individualRecipient, date, threadId, groupData); - this.context = context.getApplicationContext(); - this.type = type; + super(id, recipients, individualRecipient, dateSent, dateReceived, threadId, groupData); + this.context = context.getApplicationContext(); + this.type = type; + this.dateSent = dateSent; } public long getType() { diff --git a/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java index 52137f954f..667438cd06 100644 --- a/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java +++ b/src/org/thoughtcrime/securesms/database/model/ThreadRecord.java @@ -38,7 +38,7 @@ public class ThreadRecord extends DisplayRecord { long date, long count, boolean read, long threadId) { - super(recipients, date, threadId); + super(recipients, date, date, threadId); this.context = context.getApplicationContext(); this.count = count; this.read = read; @@ -68,4 +68,8 @@ public class ThreadRecord extends DisplayRecord { return read; } + public long getDate() { + return getDateReceived(); + } + }