diff --git a/src/org/thoughtcrime/securesms/ConversationAdapter.java b/src/org/thoughtcrime/securesms/ConversationAdapter.java index ae2a526885..741030d66c 100644 --- a/src/org/thoughtcrime/securesms/ConversationAdapter.java +++ b/src/org/thoughtcrime/securesms/ConversationAdapter.java @@ -18,8 +18,6 @@ package org.thoughtcrime.securesms; import android.content.Context; import android.database.Cursor; -import android.graphics.Canvas; -import android.graphics.Rect; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -33,12 +31,13 @@ import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.TextView; +import org.thoughtcrime.redphone.util.Conversions; +import org.thoughtcrime.securesms.ConversationAdapter.HeaderViewHolder; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.MmsSmsColumns; import org.thoughtcrime.securesms.database.MmsSmsDatabase; -import org.thoughtcrime.securesms.database.SmsDatabase; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MmsMessageRecord; import org.thoughtcrime.securesms.recipients.Recipients; @@ -47,9 +46,10 @@ import org.thoughtcrime.securesms.util.LRUCache; import org.thoughtcrime.securesms.util.StickyHeaderDecoration; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; -import org.thoughtcrime.securesms.ConversationAdapter.HeaderViewHolder; import java.lang.ref.SoftReference; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.Calendar; import java.util.Collections; import java.util.Date; @@ -93,6 +93,7 @@ public class ConversationAdapter private final @NonNull MmsSmsDatabase db; private final @NonNull LayoutInflater inflater; private final @NonNull Calendar calendar; + private final @NonNull MessageDigest digest; protected static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(final @NonNull V itemView) { @@ -134,13 +135,18 @@ public class ConversationAdapter @VisibleForTesting ConversationAdapter(Context context, Cursor cursor) { super(context, cursor); - this.masterSecret = null; - this.locale = null; - this.clickListener = null; - this.recipients = null; - this.inflater = null; - this.db = null; - this.calendar = null; + try { + this.masterSecret = null; + this.locale = null; + this.clickListener = null; + this.recipients = null; + this.inflater = null; + this.db = null; + this.calendar = null; + this.digest = MessageDigest.getInstance("SHA1"); + } catch (NoSuchAlgorithmException nsae) { + throw new AssertionError("SHA1 isn't supported!"); + } } public ConversationAdapter(@NonNull Context context, @@ -151,15 +157,21 @@ public class ConversationAdapter @NonNull Recipients recipients) { super(context, cursor); - this.masterSecret = masterSecret; - this.locale = locale; - this.clickListener = clickListener; - this.recipients = recipients; - this.inflater = LayoutInflater.from(context); - this.db = DatabaseFactory.getMmsSmsDatabase(context); - this.calendar = Calendar.getInstance(); - setHasStableIds(true); + try { + this.masterSecret = masterSecret; + this.locale = locale; + this.clickListener = clickListener; + this.recipients = recipients; + this.inflater = LayoutInflater.from(context); + this.db = DatabaseFactory.getMmsSmsDatabase(context); + this.calendar = Calendar.getInstance(); + this.digest = MessageDigest.getInstance("SHA1"); + + setHasStableIds(true); + } catch (NoSuchAlgorithmException nsae) { + throw new AssertionError("SHA1 isn't supported!"); + } } @Override @@ -242,7 +254,9 @@ public class ConversationAdapter @Override public long getItemId(@NonNull Cursor cursor) { - return cursor.getLong(cursor.getColumnIndexOrThrow(MmsSmsColumns.UNIQUE_ROW_ID)); + final String unique = cursor.getString(cursor.getColumnIndexOrThrow(MmsSmsColumns.UNIQUE_ROW_ID)); + final byte[] bytes = digest.digest(unique.getBytes()); + return Conversions.byteArrayToLong(bytes); } private MessageRecord getMessageRecord(Cursor cursor) { diff --git a/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index 1616ecf0e2..106fd94093 100644 --- a/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/src/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -138,7 +138,8 @@ public class MmsSmsDatabase extends Database { String[] mmsProjection = {MmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT, MmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED, MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " AS " + MmsSmsColumns.ID, - "CAST('2' || " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " || " + MmsDatabase.DATE_SENT + " AS INTEGER)" + "'MMS::' || " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + + " || '::' || " + MmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.UNIQUE_ROW_ID, AttachmentDatabase.TABLE_NAME + "." + AttachmentDatabase.ROW_ID + " AS " + AttachmentDatabase.ATTACHMENT_ID_ALIAS, SmsDatabase.BODY, MmsSmsColumns.READ, MmsSmsColumns.THREAD_ID, @@ -163,7 +164,8 @@ public class MmsSmsDatabase extends Database { String[] smsProjection = {SmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.NORMALIZED_DATE_SENT, SmsDatabase.DATE_RECEIVED + " AS " + MmsSmsColumns.NORMALIZED_DATE_RECEIVED, MmsSmsColumns.ID, - "CAST('1' || " + MmsSmsColumns.ID + " || " + SmsDatabase.DATE_SENT + " AS INTEGER)" + "'SMS::' || " + MmsSmsColumns.ID + + " || '::' || " + SmsDatabase.DATE_SENT + " AS " + MmsSmsColumns.UNIQUE_ROW_ID, "NULL AS " + AttachmentDatabase.ATTACHMENT_ID_ALIAS, SmsDatabase.BODY, MmsSmsColumns.READ, MmsSmsColumns.THREAD_ID,