Fix deletion of random SMS when trying to update threads

Commit 44c540b9 (Fixed updating last message after deleting (#167),
2021-09-04) introduced a hack to update the conversation snippet,
however there is a bug in that code: it tries to delete by thread ID,
but the condition is applied to the SMS table, not to the threads
table.[1] So instead of deleting the thread with that ID, it deletes
whichever SMS happens to have that ID.

The fix is to change the condition to an always-false condition, so
that no messages will be deleted. The threads will still get
updated.[2]

Fixes #148.

[1] https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/android14-release/src/com/android/providers/telephony/MmsSmsProvider.java#1405
[2] https://android.googlesource.com/platform/packages/providers/TelephonyProvider/+/android14-release/src/com/android/providers/telephony/MmsSmsProvider.java#1409
This commit is contained in:
Tom Levy 2024-03-23 14:04:30 +00:00
parent 1c7376c0f2
commit 99cea602c8

View file

@ -990,11 +990,13 @@ fun Context.deleteSmsDraft(threadId: Long) {
} }
fun Context.updateLastConversationMessage(threadId: Long) { fun Context.updateLastConversationMessage(threadId: Long) {
// update the date and the snippet of the thread, 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 val uri = Threads.CONTENT_URI
val selection = "${Threads._ID} = ?" val selection = "1 = 0" // always-false condition, because we don't actually want to delete any messages
val selectionArgs = arrayOf(threadId.toString())
try { try {
contentResolver.delete(uri, selection, selectionArgs) contentResolver.delete(uri, selection, null)
val newConversation = getConversations(threadId)[0] val newConversation = getConversations(threadId)[0]
insertOrUpdateConversation(newConversation) insertOrUpdateConversation(newConversation)
} catch (e: Exception) { } catch (e: Exception) {