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