From bfd5450435d2aebee425516da16e4d1965205344 Mon Sep 17 00:00:00 2001 From: Tom Levy Date: Fri, 5 Apr 2024 10:57:32 +0000 Subject: [PATCH 1/2] Add bulk version of updateLastConversationMessage() In situations where we want to update multiple conversations (e.g. during import), we can make it faster by only calling contentResolver.delete() once. (We still make separate calls to getConversations() because it doesn't support multiple IDs, and likewise insertOrUpdateConversation() doesn't support bulk insert.) --- .../org/fossify/messages/extensions/Context.kt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt b/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt index 26c6d226..f4fff271 100644 --- a/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt @@ -1114,7 +1114,11 @@ fun Context.deleteSmsDraft(threadId: Long) { } fun Context.updateLastConversationMessage(threadId: Long) { - // update the date and the snippet of the thread, by triggering the + updateLastConversationMessage(setOf(threadId)) +} + +fun Context.updateLastConversationMessage(threadIds: Iterable) { + // update the date and the snippet of the threads, by triggering the // following Android code (which runs even if no messages are deleted): // https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/android14-release/src/com/android/providers/telephony/MmsSmsProvider.java#1409 val uri = Threads.CONTENT_URI @@ -1122,8 +1126,10 @@ fun Context.updateLastConversationMessage(threadId: Long) { "1 = 0" // always-false condition, because we don't actually want to delete any messages try { contentResolver.delete(uri, selection, null) - val newConversation = getConversations(threadId)[0] - insertOrUpdateConversation(newConversation) + for (threadId in threadIds) { + val newConversation = getConversations(threadId)[0] + insertOrUpdateConversation(newConversation) + } } catch (e: Exception) { } } From 3ad36c00213b2005611f5d2c978baef9529dedd3 Mon Sep 17 00:00:00 2001 From: Tom Levy Date: Sat, 23 Mar 2024 10:51:17 +0000 Subject: [PATCH 2/2] 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) + } }