From cf839e99df0cb33e43f0ff3a0d62b04bd272e3ba Mon Sep 17 00:00:00 2001 From: Naveen Singh <36371707+naveensingh@users.noreply.github.com> Date: Mon, 1 Sep 2025 01:15:01 +0530 Subject: [PATCH] feat: add option to keep conversations archived (#501) * feat: add option to keep conversations archived Refs: https://github.com/FossifyOrg/Messages/issues/334 * fix: archive/unarchive when mms is received Previously, conversations weren't unarchived for new MMS messages. * docs: update changelog --- CHANGELOG.md | 3 +++ .../messages/activities/SettingsActivity.kt | 9 +++++++ .../messages/activities/ThreadActivity.kt | 5 +++- .../fossify/messages/extensions/Context.kt | 4 +++ .../org/fossify/messages/helpers/Config.kt | 5 ++++ .../org/fossify/messages/helpers/Constants.kt | 1 + .../fossify/messages/receivers/MmsReceiver.kt | 5 ++++ .../fossify/messages/receivers/SmsReceiver.kt | 2 +- app/src/main/res/layout/activity_settings.xml | 26 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 10 files changed, 59 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81a1323b..6f1f8fb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added +- Option to keep conversations archived ([#334]) ## [1.2.3] - 2025-08-21 ### Changed @@ -134,6 +136,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#288]: https://github.com/FossifyOrg/Messages/issues/288 [#294]: https://github.com/FossifyOrg/Messages/issues/294 [#309]: https://github.com/FossifyOrg/Messages/issues/309 +[#334]: https://github.com/FossifyOrg/Messages/issues/334 [#349]: https://github.com/FossifyOrg/Messages/issues/349 [#359]: https://github.com/FossifyOrg/Messages/issues/359 [#461]: https://github.com/FossifyOrg/Messages/issues/461 diff --git a/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt b/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt index d324ed15..62846beb 100644 --- a/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/org/fossify/messages/activities/SettingsActivity.kt @@ -120,6 +120,7 @@ class SettingsActivity : SimpleActivity() { setupEnableDeliveryReports() setupSendLongMessageAsMMS() setupGroupMessageAsMMS() + setupKeepConversationsArchived() setupLockScreenVisibility() setupMMSFileSizeLimit() setupUseRecycleBin() @@ -310,6 +311,14 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupKeepConversationsArchived() = binding.apply { + settingsKeepConversationsArchived.isChecked = config.keepConversationsArchived + settingsKeepConversationsArchivedHolder.setOnClickListener { + settingsKeepConversationsArchived.toggle() + config.keepConversationsArchived = settingsKeepConversationsArchived.isChecked + } + } + private fun setupLockScreenVisibility() = binding.apply { settingsLockScreenVisibility.text = getLockScreenVisibilityText() settingsLockScreenVisibilityHolder.setOnClickListener { diff --git a/app/src/main/kotlin/org/fossify/messages/activities/ThreadActivity.kt b/app/src/main/kotlin/org/fossify/messages/activities/ThreadActivity.kt index d54e7d1b..1251f19b 100644 --- a/app/src/main/kotlin/org/fossify/messages/activities/ThreadActivity.kt +++ b/app/src/main/kotlin/org/fossify/messages/activities/ThreadActivity.kt @@ -141,6 +141,7 @@ import org.fossify.messages.extensions.renameConversation import org.fossify.messages.extensions.restoreAllMessagesFromRecycleBinForConversation import org.fossify.messages.extensions.restoreMessageFromRecycleBin import org.fossify.messages.extensions.saveSmsDraft +import org.fossify.messages.extensions.shouldUnarchive import org.fossify.messages.extensions.showWithAnimation import org.fossify.messages.extensions.subscriptionManagerCompat import org.fossify.messages.extensions.toArrayList @@ -1640,7 +1641,9 @@ class ThreadActivity : SimpleActivity() { } } messagesDB.insertOrUpdate(message) - updateConversationArchivedStatus(message.threadId, false) + if (shouldUnarchive()) { + updateConversationArchivedStatus(message.threadId, false) + } } // show selected contacts, properly split to new lines when appropriate 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 939c03b9..eee14f4a 100644 --- a/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/messages/extensions/Context.kt @@ -1330,3 +1330,7 @@ fun Context.clearExpiredScheduledMessages(threadId: Long, messagesToDelete: List fun Context.getDefaultKeyboardHeight(): Int { return resources.getDimensionPixelSize(R.dimen.default_keyboard_height) } + +fun Context.shouldUnarchive(): Boolean { + return config.isArchiveAvailable && !config.keepConversationsArchived +} diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt b/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt index 29507906..deb00357 100644 --- a/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt +++ b/app/src/main/kotlin/org/fossify/messages/helpers/Config.kt @@ -143,4 +143,9 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getString(LAST_BLOCKED_KEYWORD_EXPORT_PATH, "")!! set(lastBlockedNumbersExportPath) = prefs.edit() .putString(LAST_BLOCKED_KEYWORD_EXPORT_PATH, lastBlockedNumbersExportPath).apply() + + var keepConversationsArchived: Boolean + get() = prefs.getBoolean(KEEP_CONVERSATIONS_ARCHIVED, false) + set(keepConversationsArchived) = prefs.edit() + .putBoolean(KEEP_CONVERSATIONS_ARCHIVED, keepConversationsArchived).apply() } diff --git a/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt b/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt index 3f4e1082..a0a01520 100644 --- a/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt +++ b/app/src/main/kotlin/org/fossify/messages/helpers/Constants.kt @@ -47,6 +47,7 @@ const val IS_RECYCLE_BIN = "is_recycle_bin" const val IS_ARCHIVE_AVAILABLE = "is_archive_available" const val CUSTOM_NOTIFICATIONS = "custom_notifications" const val IS_LAUNCHED_FROM_SHORTCUT = "is_launched_from_shortcut" +const val KEEP_CONVERSATIONS_ARCHIVED = "keep_conversations_archived" private const val PATH = "org.fossify.org.fossify.messages.action." const val MARK_AS_READ = PATH + "mark_as_read" diff --git a/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt b/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt index b258fe6e..4d961a4b 100644 --- a/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt +++ b/app/src/main/kotlin/org/fossify/messages/receivers/MmsReceiver.kt @@ -17,7 +17,9 @@ import org.fossify.messages.R import org.fossify.messages.extensions.getConversations import org.fossify.messages.extensions.getLatestMMS import org.fossify.messages.extensions.insertOrUpdateConversation +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.refreshMessages import org.fossify.messages.models.Message @@ -88,6 +90,9 @@ class MmsReceiver : MmsReceivedReceiver() { val conversation = context.getConversations(mms.threadId).firstOrNull() ?: return@ensureBackgroundThread context.insertOrUpdateConversation(conversation) + if (context.shouldUnarchive()) { + context.updateConversationArchivedStatus(mms.threadId, false) + } refreshMessages() } } diff --git a/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt b/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt index 044e0b06..cebd6c9f 100644 --- a/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt +++ b/app/src/main/kotlin/org/fossify/messages/receivers/SmsReceiver.kt @@ -108,7 +108,7 @@ class SmsReceiver : BroadcastReceiver() { subscriptionId ) context.messagesDB.insertOrUpdate(message) - if (context.config.isArchiveAvailable) { + if (context.shouldUnarchive()) { context.updateConversationArchivedStatus(threadId, false) } refreshMessages() diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index ebd96909..713d41de 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -351,6 +351,32 @@ android:id="@+id/settings_outgoing_messages_divider" layout="@layout/divider" /> + + + + + + + + + + No archived conversations have been found The archive has been emptied successfully Are you sure you want to empty the archive? All archived conversations will be permanently lost. + Keep conversations archived Restore Restore all messages