diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt index ba716942..3fa20029 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/MainActivity.kt @@ -158,15 +158,15 @@ class MainActivity : SimpleActivity() { private fun getCachedConversations() { ensureBackgroundThread { - val conversations = conversationsDB.getAll().toMutableList() as ArrayList + val conversations = conversationsDB.getAll().sortedByDescending { it.date }.toMutableList() as ArrayList runOnUiThread { setupConversations(conversations) - getNewConversations() + getNewConversations(conversations) } } } - private fun getNewConversations() { + private fun getNewConversations(cachedConversations: ArrayList) { val privateCursor = getMyContactsContentProviderCursorLoader().loadInBackground() ensureBackgroundThread { val conversations = getConversations() @@ -186,7 +186,25 @@ class MainActivity : SimpleActivity() { setupConversations(conversations) } - conversationsDB.insertAll(conversations) + conversations.forEach { clonedConversation -> + if (!cachedConversations.map { it.system_id }.contains(clonedConversation.system_id)) { + conversationsDB.insertOrUpdate(clonedConversation) + cachedConversations.add(clonedConversation) + } + } + + cachedConversations.forEach { cachedConversation -> + if (!conversations.map { it.system_id }.contains(cachedConversation.system_id)) { + conversationsDB.delete(cachedConversation.id!!) + } + } + + cachedConversations.forEach { cachedConversation -> + val conv = conversations.firstOrNull { it.system_id == cachedConversation.system_id && it.getStringToCompare() != cachedConversation.getStringToCompare() } + if (conv != null) { + conversationsDB.insertOrUpdate(conv) + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt index 13813bef..21c789f9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/activities/ThreadActivity.kt @@ -343,9 +343,13 @@ class ThreadActivity : SimpleActivity() { private fun askConfirmDelete() { ConfirmationDialog(this, getString(R.string.delete_whole_conversation_confirmation)) { - deleteConversation(threadId) - refreshMessages() - finish() + ensureBackgroundThread { + deleteConversation(threadId) + runOnUiThread { + refreshMessages() + finish() + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt index 164c3328..d5a2fc17 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/extensions/Context.kt @@ -462,10 +462,12 @@ fun Context.insertNewSMS(address: String, subject: String, body: String, date: L return newUri?.lastPathSegment?.toInt() ?: 0 } -fun Context.deleteConversation(id: Int) { +fun Context.deleteConversation(threadId: Int) { + conversationsDB.deleteThreadId(threadId.toLong()) + var uri = Sms.CONTENT_URI val selection = "${Sms.THREAD_ID} = ?" - val selectionArgs = arrayOf(id.toString()) + val selectionArgs = arrayOf(threadId.toString()) contentResolver.delete(uri, selection, selectionArgs) uri = Mms.CONTENT_URI diff --git a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt index d901e965..6cc15187 100644 --- a/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/smsmessenger/interfaces/ConversationsDao.kt @@ -9,11 +9,14 @@ import com.simplemobiletools.smsmessenger.models.Conversation @Dao interface ConversationsDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insert(conversation: Conversation): Long - - @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertAll(conversations: List) + fun insertOrUpdate(conversation: Conversation): Long @Query("SELECT * FROM conversations") fun getAll(): List + + @Query("DELETE FROM conversations WHERE id = :id") + fun delete(id: Long) + + @Query("DELETE FROM conversations WHERE system_id = :threadId") + fun deleteThreadId(threadId: Long) }