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..33040518a
--- /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 alarms after boot/package updates.
+ */
+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()
+ }
}
}