From c77a6c085f2dccb631649f8af760336f3ebacdf4 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Tue, 23 Dec 2025 19:27:31 +0530 Subject: [PATCH 1/2] fix: reschedule scheduled messages when they are cleared Refs: https://github.com/FossifyOrg/Messages/issues/641 --- CHANGELOG.md | 3 +++ app/src/main/AndroidManifest.xml | 13 ++++++++++++ .../messages/activities/MainActivity.kt | 1 - .../fossify/messages/extensions/Context.kt | 13 ++++++++++++ .../messages/interfaces/MessagesDao.kt | 9 ++++++++- .../receivers/RescheduleAlarmsReceiver.kt | 20 +++++++++++++++++++ .../receivers/ScheduledMessageReceiver.kt | 20 +++++++++++++++---- 7 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b6c4484c..9af2fef91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed missing notifications in some cases ([#159]) - Fixed incorrect blocking of MMS messages in some rare cases ([#644]) +- Fixed issue where scheduled messages were not sent after a reboot or app updates ([#641]) ## [1.7.0] - 2025-12-16 ### Added @@ -204,6 +205,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#209]: https://github.com/FossifyOrg/Messages/issues/209 [#217]: https://github.com/FossifyOrg/Messages/issues/217 [#225]: https://github.com/FossifyOrg/Messages/issues/225 +[#232]: https://github.com/FossifyOrg/Messages/issues/232 [#234]: https://github.com/FossifyOrg/Messages/issues/234 [#243]: https://github.com/FossifyOrg/Messages/issues/243 [#262]: https://github.com/FossifyOrg/Messages/issues/262 @@ -228,6 +230,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#574]: https://github.com/FossifyOrg/Messages/issues/574 [#600]: https://github.com/FossifyOrg/Messages/issues/600 [#610]: https://github.com/FossifyOrg/Messages/issues/610 +[#641]: https://github.com/FossifyOrg/Messages/issues/641 [#644]: https://github.com/FossifyOrg/Messages/issues/644 [#651]: https://github.com/FossifyOrg/Messages/issues/651 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 326db512b..2fa856ddb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + @@ -242,6 +243,18 @@ android:name=".receivers.ScheduledMessageReceiver" android:exported="false" /> + + + + + + + + + + runCatching { scheduleMessage(message) } + } +} + fun Context.getDefaultKeyboardHeight(): Int { return resources.getDimensionPixelSize(R.dimen.default_keyboard_height) } diff --git a/app/src/main/kotlin/org/fossify/messages/interfaces/MessagesDao.kt b/app/src/main/kotlin/org/fossify/messages/interfaces/MessagesDao.kt index f97efe3e8..d831b883d 100644 --- a/app/src/main/kotlin/org/fossify/messages/interfaces/MessagesDao.kt +++ b/app/src/main/kotlin/org/fossify/messages/interfaces/MessagesDao.kt @@ -1,6 +1,10 @@ package org.fossify.messages.interfaces -import androidx.room.* +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Transaction import org.fossify.messages.models.Message import org.fossify.messages.models.RecycleBinMessage @@ -24,6 +28,9 @@ interface MessagesDao { @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL") fun getAllRecycleBinMessages(): List + @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NULL AND is_scheduled = 1") + fun getAllScheduledMessages(): List + @Query("SELECT messages.* FROM messages LEFT OUTER JOIN recycle_bin_messages ON messages.id = recycle_bin_messages.id WHERE recycle_bin_messages.id IS NOT NULL AND recycle_bin_messages.deleted_ts < :timestamp") fun getOldRecycleBinMessages(timestamp: Long): List diff --git a/app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt b/app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt new file mode 100644 index 000000000..2220a217c --- /dev/null +++ b/app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt @@ -0,0 +1,20 @@ +package org.fossify.messages.receivers + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import org.fossify.commons.helpers.ensureBackgroundThread +import org.fossify.messages.extensions.rescheduleAllScheduledMessages + +/** + * Reschedules exact alarms after boot/package updates and catches up overdue scheduled messages. + */ +class RescheduleAlarmsReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val pendingResult = goAsync() + ensureBackgroundThread { + context.rescheduleAllScheduledMessages() + pendingResult.finish() + } + } +} diff --git a/app/src/main/kotlin/org/fossify/messages/receivers/ScheduledMessageReceiver.kt b/app/src/main/kotlin/org/fossify/messages/receivers/ScheduledMessageReceiver.kt index 8764c4fc6..cfc5ab168 100644 --- a/app/src/main/kotlin/org/fossify/messages/receivers/ScheduledMessageReceiver.kt +++ b/app/src/main/kotlin/org/fossify/messages/receivers/ScheduledMessageReceiver.kt @@ -22,12 +22,24 @@ class ScheduledMessageReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager - val wakelock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "simple.messenger:scheduled.message.receiver") - wakelock.acquire(3000) - + val wakelock = powerManager.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, + "simple.messenger:scheduled.message.receiver" + ) + wakelock.acquire(10_000) + val pendingResult = goAsync() ensureBackgroundThread { - handleIntent(context, intent) + try { + handleIntent(context, intent) + } finally { + try { + if (wakelock.isHeld) wakelock.release() + } catch (_: Exception) { + } + + pendingResult.finish() + } } } From 8925d39837841289977930acee89c8c586bcb7c5 Mon Sep 17 00:00:00 2001 From: Naveen Singh Date: Tue, 23 Dec 2025 20:29:52 +0530 Subject: [PATCH 2/2] docs: remove comment about overdue messages That will be solved in another PR. --- .../org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt b/app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt index 2220a217c..33040518a 100644 --- a/app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt +++ b/app/src/main/kotlin/org/fossify/messages/receivers/RescheduleAlarmsReceiver.kt @@ -7,7 +7,7 @@ import org.fossify.commons.helpers.ensureBackgroundThread import org.fossify.messages.extensions.rescheduleAllScheduledMessages /** - * Reschedules exact alarms after boot/package updates and catches up overdue scheduled messages. + * Reschedules alarms after boot/package updates. */ class RescheduleAlarmsReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) {