From 3ad36c00213b2005611f5d2c978baef9529dedd3 Mon Sep 17 00:00:00 2001 From: Tom Levy Date: Sat, 23 Mar 2024 10:51:17 +0000 Subject: [PATCH] Fix conversation dates on import When we insert a message, Android's Telephony provider sets the conversation date to the current time rather than the time of the message that was inserted.[1] This commit implements a workaround that fixes the conversation timestamps. Fixes #146, #42. [1] https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/android14-release/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java#134 --- .../fossify/messages/helpers/MessagesImporter.kt | 1 + .../fossify/messages/helpers/MessagesWriter.kt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt b/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt index 558b48a6..ee70d832 100644 --- a/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt +++ b/app/src/main/kotlin/org/fossify/messages/helpers/MessagesImporter.kt @@ -96,6 +96,7 @@ class MessagesImporter(private val activity: SimpleActivity) { messagesFailed++ } } + messageWriter.fixCoversationDates() refreshMessages() } catch (e: Exception) { activity.showErrorToast(e) diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/MessagesWriter.kt b/app/src/main/kotlin/org/fossify/messages/helpers/MessagesWriter.kt index 52f474fc..d0248bb7 100644 --- a/app/src/main/kotlin/org/fossify/messages/helpers/MessagesWriter.kt +++ b/app/src/main/kotlin/org/fossify/messages/helpers/MessagesWriter.kt @@ -11,6 +11,7 @@ import com.klinker.android.send_message.Utils import org.fossify.commons.extensions.getLongValue import org.fossify.commons.extensions.queryCursor import org.fossify.commons.helpers.isRPlus +import org.fossify.messages.extensions.updateLastConversationMessage import org.fossify.messages.models.MmsAddress import org.fossify.messages.models.MmsBackup import org.fossify.messages.models.MmsPart @@ -19,12 +20,14 @@ import org.fossify.messages.models.SmsBackup class MessagesWriter(private val context: Context) { private val INVALID_ID = -1L private val contentResolver = context.contentResolver + private val modifiedThreadIds = mutableSetOf() fun writeSmsMessage(smsBackup: SmsBackup) { val contentValues = smsBackup.toContentValues() val threadId = Utils.getOrCreateThreadId(context, smsBackup.address) contentValues.put(Sms.THREAD_ID, threadId) if (!smsExist(smsBackup)) { + modifiedThreadIds.add(threadId) contentResolver.insert(Sms.CONTENT_URI, contentValues) } } @@ -50,6 +53,7 @@ class MessagesWriter(private val context: Context) { if (threadId != INVALID_ID) { contentValues.put(Mms.THREAD_ID, threadId) if (!mmsExist(mmsBackup)) { + modifiedThreadIds.add(threadId) contentResolver.insert(Mms.CONTENT_URI, contentValues) } val messageId = getMmsId(mmsBackup) @@ -152,4 +156,16 @@ class MessagesWriter(private val context: Context) { } return exists } + + /** Fixes the timestamps of all conversations modified by previous writes. */ + fun fixCoversationDates() { + // This method should be called after messages are written, to set the correct conversation + // timestamps. + // + // It is necessary because when we insert a message, Android's Telephony provider sets the + // conversation date to the current time rather than the time of the message that was + // inserted. Source code reference: + // https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/android14-release/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java#134 + context.updateLastConversationMessage(modifiedThreadIds) + } }