fix: avoid unnecessary refresh by splitting refresh events (#556)

* fix: avoid unnecessary refresh by splitting refresh events

* fix: suppress unused parameter lint error

Refs: https://github.com/FossifyOrg/Messages/issues/82
This commit is contained in:
Naveen Singh 2025-10-15 01:40:20 +05:30 committed by GitHub
parent 72eb0af8ec
commit 3303fc7c07
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 78 additions and 37 deletions

View file

@ -8,6 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Optimized loading messages in conversations
### Fixed
- Fixed position reset when opening attachments in conversations ([#82])
## [1.4.0] - 2025-10-12
### Added
- Ability to save multiple attachments ([#75])
@ -165,6 +168,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#334]: https://github.com/FossifyOrg/Messages/issues/334
[#349]: https://github.com/FossifyOrg/Messages/issues/349
[#359]: https://github.com/FossifyOrg/Messages/issues/359
[#82]: https://github.com/FossifyOrg/Messages/issues/82
[#456]: https://github.com/FossifyOrg/Messages/issues/456
[#461]: https://github.com/FossifyOrg/Messages/issues/461

View file

@ -4,7 +4,13 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import org.fossify.commons.dialogs.ConfirmationDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.extensions.areSystemAnimationsEnabled
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.getProperBackgroundColor
import org.fossify.commons.extensions.getProperTextColor
import org.fossify.commons.extensions.hideKeyboard
import org.fossify.commons.extensions.viewBinding
import org.fossify.commons.helpers.NavigationIcon
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.messages.R
@ -169,7 +175,7 @@ class ArchivedConversationsActivity : SimpleActivity() {
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun refreshMessages(event: Events.RefreshMessages) {
fun refreshConversations(@Suppress("unused") event: Events.RefreshConversations) {
loadArchivedConversations()
}
}

View file

@ -682,7 +682,7 @@ class MainActivity : SimpleActivity() {
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun refreshMessages(event: Events.RefreshMessages) {
fun refreshConversations(@Suppress("unused") event: Events.RefreshConversations) {
initMessenger()
}

View file

@ -180,7 +180,7 @@ class RecycleBinConversationsActivity : SimpleActivity() {
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun refreshMessages(event: Events.RefreshMessages) {
fun refreshConversations(@Suppress("unused") event: Events.RefreshConversations) {
loadRecycleBinConversations()
}
}

View file

@ -11,7 +11,6 @@ import org.fossify.commons.dialogs.RadioGroupDialog
import org.fossify.commons.dialogs.SecurityDialog
import org.fossify.commons.extensions.addLockedLabelIfNeeded
import org.fossify.commons.extensions.beGone
import org.fossify.commons.extensions.beGoneIf
import org.fossify.commons.extensions.beVisible
import org.fossify.commons.extensions.beVisibleIf
import org.fossify.commons.extensions.getBlockedNumbers
@ -49,7 +48,7 @@ import org.fossify.messages.helpers.LOCK_SCREEN_NOTHING
import org.fossify.messages.helpers.LOCK_SCREEN_SENDER
import org.fossify.messages.helpers.LOCK_SCREEN_SENDER_MESSAGE
import org.fossify.messages.helpers.MessagesImporter
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.helpers.refreshConversations
import java.util.Locale
import kotlin.system.exitProcess
@ -133,7 +132,7 @@ class SettingsActivity : SimpleActivity() {
if (
blockedNumbersAtPause != -1 && blockedNumbersAtPause != getBlockedNumbers().hashCode()
) {
refreshMessages()
refreshConversations()
}
arrayOf(
@ -238,7 +237,7 @@ class SettingsActivity : SimpleActivity() {
private fun setupChangeDateTimeFormat() = binding.apply {
settingsChangeDateTimeFormatHolder.setOnClickListener {
ChangeDateTimeFormatDialog(this@SettingsActivity) {
refreshMessages()
refreshConversations()
}
}
}

View file

@ -40,6 +40,7 @@ import androidx.annotation.StringRes
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.net.toUri
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsAnimationCompat
@ -47,6 +48,7 @@ import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.documentfile.provider.DocumentFile
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import org.fossify.commons.dialogs.ConfirmationDialog
@ -122,6 +124,7 @@ import org.fossify.messages.extensions.deleteScheduledMessage
import org.fossify.messages.extensions.deleteSmsDraft
import org.fossify.messages.extensions.dialNumber
import org.fossify.messages.extensions.emptyMessagesRecycleBinForConversation
import org.fossify.messages.extensions.filterNotInByKey
import org.fossify.messages.extensions.getAddresses
import org.fossify.messages.extensions.getDefaultKeyboardHeight
import org.fossify.messages.extensions.getFileSizeFromUri
@ -172,6 +175,7 @@ import org.fossify.messages.helpers.THREAD_NUMBER
import org.fossify.messages.helpers.THREAD_TEXT
import org.fossify.messages.helpers.THREAD_TITLE
import org.fossify.messages.helpers.generateRandomId
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.messaging.cancelScheduleSendPendingIntent
import org.fossify.messages.messaging.isLongMmsMessage
@ -195,9 +199,6 @@ import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.joda.time.DateTime
import java.io.File
import androidx.core.net.toUri
import androidx.recyclerview.widget.RecyclerView
import org.fossify.messages.extensions.filterNotInByKey
class ThreadActivity : SimpleActivity() {
private var threadId = 0L
@ -312,7 +313,7 @@ class ThreadActivity : SimpleActivity() {
override fun onPause() {
super.onPause()
saveDraftMessage()
bus?.post(Events.RefreshMessages())
bus?.post(Events.RefreshConversations())
isActivityVisible = false
}
@ -1069,7 +1070,7 @@ class ThreadActivity : SimpleActivity() {
numbers.forEach {
addBlockedNumber(it)
}
refreshMessages()
refreshConversations()
finish()
}
}
@ -1085,7 +1086,7 @@ class ThreadActivity : SimpleActivity() {
deleteConversation(threadId)
}
runOnUiThread {
refreshMessages()
refreshConversations()
finish()
}
}
@ -1097,7 +1098,7 @@ class ThreadActivity : SimpleActivity() {
ensureBackgroundThread {
restoreAllMessagesFromRecycleBinForConversation(threadId)
runOnUiThread {
refreshMessages()
refreshConversations()
finish()
}
}
@ -1108,7 +1109,7 @@ class ThreadActivity : SimpleActivity() {
ensureBackgroundThread {
updateConversationArchivedStatus(threadId, true)
runOnUiThread {
refreshMessages()
refreshConversations()
finish()
}
}
@ -1118,7 +1119,7 @@ class ThreadActivity : SimpleActivity() {
ensureBackgroundThread {
updateConversationArchivedStatus(threadId, false)
runOnUiThread {
refreshMessages()
refreshConversations()
finish()
}
}
@ -1188,7 +1189,7 @@ class ThreadActivity : SimpleActivity() {
markThreadMessagesUnread(threadId)
runOnUiThread {
finish()
bus?.post(Events.RefreshMessages())
bus?.post(Events.RefreshConversations())
}
}
}
@ -1273,7 +1274,7 @@ class ThreadActivity : SimpleActivity() {
}
if (hadUnreadItems) {
bus?.post(Events.RefreshMessages())
bus?.post(Events.RefreshConversations())
}
return items
@ -1581,6 +1582,7 @@ class ThreadActivity : SimpleActivity() {
messagesDB.insertOrUpdate(message)
if (shouldUnarchive()) {
updateConversationArchivedStatus(message.threadId, false)
refreshConversations()
}
}

View file

@ -9,7 +9,7 @@ import org.fossify.messages.R
import org.fossify.messages.activities.SimpleActivity
import org.fossify.messages.extensions.deleteConversation
import org.fossify.messages.extensions.updateConversationArchivedStatus
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.models.Conversation
class ArchivedConversationsAdapter(
@ -83,12 +83,12 @@ class ArchivedConversationsAdapter(
activity.runOnUiThread {
if (newList.none { selectedKeys.contains(it.hashCode()) }) {
refreshMessages()
refreshConversations()
finishActMode()
} else {
submitList(newList)
if (newList.isEmpty()) {
refreshMessages()
refreshConversations()
}
}
}

View file

@ -25,7 +25,6 @@ import org.fossify.messages.extensions.markThreadMessagesRead
import org.fossify.messages.extensions.markThreadMessagesUnread
import org.fossify.messages.extensions.renameConversation
import org.fossify.messages.extensions.updateConversationArchivedStatus
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.messaging.isShortCodeWithLetters
import org.fossify.messages.models.Conversation
@ -189,12 +188,12 @@ class ConversationsAdapter(
activity.runOnUiThread {
if (newList.none { selectedKeys.contains(it.hashCode()) }) {
refreshMessages()
refreshConversations()
finishActMode()
} else {
submitList(newList)
if (newList.isEmpty()) {
refreshMessages()
refreshConversations()
}
}
}
@ -220,12 +219,12 @@ class ConversationsAdapter(
activity.runOnUiThread {
if (newList.none { selectedKeys.contains(it.hashCode()) }) {
refreshMessages()
refreshConversations()
finishActMode()
} else {
submitList(newList)
if (newList.isEmpty()) {
refreshMessages()
refreshConversations()
}
}
}
@ -317,7 +316,7 @@ class ConversationsAdapter(
private fun refreshConversations() {
activity.runOnUiThread {
refreshMessages()
refreshConversations()
finishActMode()
}
}

View file

@ -9,7 +9,7 @@ import org.fossify.messages.R
import org.fossify.messages.activities.SimpleActivity
import org.fossify.messages.extensions.deleteConversation
import org.fossify.messages.extensions.restoreAllMessagesFromRecycleBinForConversation
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.models.Conversation
class RecycleBinConversationsAdapter(
@ -95,12 +95,12 @@ class RecycleBinConversationsAdapter(
activity.runOnUiThread {
if (newList.none { selectedKeys.contains(it.hashCode()) }) {
refreshMessages()
refreshConversations()
finishActMode()
} else {
submitList(newList)
if (newList.isEmpty()) {
refreshMessages()
refreshConversations()
}
}
}

View file

@ -104,6 +104,10 @@ fun refreshMessages() {
EventBus.getDefault().post(Events.RefreshMessages())
}
fun refreshConversations() {
EventBus.getDefault().post(Events.RefreshConversations())
}
/** Not to be used with real messages persisted in the telephony db. This is for internal use only (e.g. scheduled messages, notification ids etc). */
fun generateRandomId(length: Int = 9): Long {
val millis = DateTime.now(DateTimeZone.UTC).millis

View file

@ -99,7 +99,7 @@ class MessagesImporter(private val activity: SimpleActivity) {
}
messageWriter.fixConversationDates()
refreshMessages()
refreshConversations()
} catch (e: Exception) {
activity.showErrorToast(e)
}
@ -153,7 +153,7 @@ class MessagesImporter(private val activity: SimpleActivity) {
messagesFailed++
}
}
refreshMessages()
refreshConversations()
}
when {
messagesFailed > 0 && messagesImported > 0 -> {

View file

@ -2,4 +2,5 @@ package org.fossify.messages.models
class Events {
class RefreshMessages
class RefreshConversations
}

View file

@ -10,6 +10,7 @@ import org.fossify.messages.extensions.updateLastConversationMessage
import org.fossify.messages.helpers.IS_MMS
import org.fossify.messages.helpers.MESSAGE_ID
import org.fossify.messages.helpers.THREAD_ID
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.helpers.refreshMessages
class DeleteSmsReceiver : BroadcastReceiver() {
@ -23,6 +24,7 @@ class DeleteSmsReceiver : BroadcastReceiver() {
context.deleteMessage(messageId, isMms)
context.updateLastConversationMessage(threadId)
refreshMessages()
refreshConversations()
}
}
}

View file

@ -9,7 +9,7 @@ import org.fossify.messages.extensions.conversationsDB
import org.fossify.messages.extensions.markThreadMessagesRead
import org.fossify.messages.helpers.MARK_AS_READ
import org.fossify.messages.helpers.THREAD_ID
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.helpers.refreshConversations
class MarkAsReadReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
@ -20,7 +20,7 @@ class MarkAsReadReceiver : BroadcastReceiver() {
ensureBackgroundThread {
context.markThreadMessagesRead(threadId)
context.conversationsDB.markRead(threadId)
refreshMessages()
refreshConversations()
}
}
}

View file

@ -21,6 +21,7 @@ import org.fossify.messages.extensions.shouldUnarchive
import org.fossify.messages.extensions.showReceivedMessageNotification
import org.fossify.messages.extensions.updateConversationArchivedStatus
import org.fossify.messages.helpers.ReceiverUtils.isMessageFilteredOut
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.models.Message
@ -93,6 +94,7 @@ class MmsReceiver : MmsReceivedReceiver() {
context.updateConversationArchivedStatus(mms.threadId, false)
}
refreshMessages()
refreshConversations()
}
}
}

View file

@ -12,6 +12,7 @@ import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toast
import org.fossify.messages.R
import org.fossify.messages.extensions.deleteMessage
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.helpers.refreshMessages
import java.io.File
@ -52,6 +53,7 @@ class MmsSentReceiver : SendStatusReceiver() {
override fun updateAppDatabase(context: Context, intent: Intent, receiverResultCode: Int) {
refreshMessages()
refreshConversations()
}
companion object {

View file

@ -14,6 +14,7 @@ import org.fossify.messages.extensions.getAddresses
import org.fossify.messages.extensions.messagesDB
import org.fossify.messages.helpers.SCHEDULED_MESSAGE_ID
import org.fossify.messages.helpers.THREAD_ID
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.messaging.sendMessageCompat
@ -52,6 +53,7 @@ class ScheduledMessageReceiver : BroadcastReceiver() {
context.deleteScheduledMessage(messageId)
context.conversationsDB.deleteThreadId(messageId)
refreshMessages()
refreshConversations()
} catch (e: Exception) {
context.showErrorToast(e)
} catch (e: Error) {

View file

@ -13,8 +13,18 @@ import org.fossify.commons.helpers.SimpleContactsHelper
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.models.PhoneNumber
import org.fossify.commons.models.SimpleContact
import org.fossify.messages.extensions.*
import org.fossify.messages.extensions.getConversations
import org.fossify.messages.extensions.getNameFromAddress
import org.fossify.messages.extensions.getNotificationBitmap
import org.fossify.messages.extensions.getThreadId
import org.fossify.messages.extensions.insertNewSMS
import org.fossify.messages.extensions.insertOrUpdateConversation
import org.fossify.messages.extensions.messagesDB
import org.fossify.messages.extensions.shouldUnarchive
import org.fossify.messages.extensions.showReceivedMessageNotification
import org.fossify.messages.extensions.updateConversationArchivedStatus
import org.fossify.messages.helpers.ReceiverUtils.isMessageFilteredOut
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.helpers.refreshMessages
import org.fossify.messages.models.Message
@ -112,6 +122,7 @@ class SmsReceiver : BroadcastReceiver() {
context.updateConversationArchivedStatus(threadId, false)
}
refreshMessages()
refreshConversations()
context.showReceivedMessageNotification(newMessageId, address, body, threadId, bitmap)
}
}

View file

@ -11,7 +11,13 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ProcessLifecycleOwner
import org.fossify.commons.extensions.getMyContactsCursor
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.messages.extensions.*
import org.fossify.messages.extensions.getMessageRecipientAddress
import org.fossify.messages.extensions.getNameFromAddress
import org.fossify.messages.extensions.getThreadId
import org.fossify.messages.extensions.messagesDB
import org.fossify.messages.extensions.messagingUtils
import org.fossify.messages.extensions.notificationHelper
import org.fossify.messages.helpers.refreshConversations
import org.fossify.messages.helpers.refreshMessages
/** Handles updating databases and states when a SMS message is sent. */
@ -48,6 +54,7 @@ class SmsStatusSentReceiver : SendStatusReceiver() {
context.messagesDB.updateType(messageId, type)
refreshMessages()
refreshConversations()
}
}
}