Skip to content

Commit c77a6c0

Browse files
committed
fix: reschedule scheduled messages when they are cleared
Refs: #641
1 parent a59d4ac commit c77a6c0

File tree

7 files changed

+73
-6
lines changed

7 files changed

+73
-6
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
### Fixed
1515
- Fixed missing notifications in some cases ([#159])
1616
- Fixed incorrect blocking of MMS messages in some rare cases ([#644])
17+
- Fixed issue where scheduled messages were not sent after a reboot or app updates ([#641])
1718

1819
## [1.7.0] - 2025-12-16
1920
### Added
@@ -204,6 +205,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
204205
[#209]: https://github.com/FossifyOrg/Messages/issues/209
205206
[#217]: https://github.com/FossifyOrg/Messages/issues/217
206207
[#225]: https://github.com/FossifyOrg/Messages/issues/225
208+
[#232]: https://github.com/FossifyOrg/Messages/issues/232
207209
[#234]: https://github.com/FossifyOrg/Messages/issues/234
208210
[#243]: https://github.com/FossifyOrg/Messages/issues/243
209211
[#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
228230
[#574]: https://github.com/FossifyOrg/Messages/issues/574
229231
[#600]: https://github.com/FossifyOrg/Messages/issues/600
230232
[#610]: https://github.com/FossifyOrg/Messages/issues/610
233+
[#641]: https://github.com/FossifyOrg/Messages/issues/641
231234
[#644]: https://github.com/FossifyOrg/Messages/issues/644
232235
[#651]: https://github.com/FossifyOrg/Messages/issues/651
233236

app/src/main/AndroidManifest.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<uses-permission android:name="android.provider.Telephony.SMS_RECEIVED" />
1212
<uses-permission android:name="android.permission.WAKE_LOCK" />
1313
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
14+
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
1415
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
1516
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
1617
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
@@ -242,6 +243,18 @@
242243
android:name=".receivers.ScheduledMessageReceiver"
243244
android:exported="false" />
244245

246+
<receiver
247+
android:name=".receivers.RescheduleAlarmsReceiver"
248+
android:enabled="true"
249+
android:exported="false">
250+
<intent-filter>
251+
<action android:name="android.intent.action.BOOT_COMPLETED" />
252+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
253+
<action android:name="android.intent.action.TIME_SET" />
254+
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
255+
</intent-filter>
256+
</receiver>
257+
245258
<provider
246259
android:name="androidx.core.content.FileProvider"
247260
android:authorities="${applicationId}.provider"

app/src/main/kotlin/org/fossify/messages/activities/MainActivity.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import android.os.Bundle
1111
import android.provider.Telephony
1212
import android.text.TextUtils
1313
import androidx.appcompat.content.res.AppCompatResources
14-
import androidx.coordinatorlayout.widget.CoordinatorLayout
1514
import org.fossify.commons.dialogs.PermissionRequiredDialog
1615
import org.fossify.commons.extensions.adjustAlpha
1716
import org.fossify.commons.extensions.appLaunched

app/src/main/kotlin/org/fossify/messages/extensions/Context.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import org.fossify.messages.interfaces.MessagesDao
6868
import org.fossify.messages.messaging.MessagingUtils
6969
import org.fossify.messages.messaging.MessagingUtils.Companion.ADDRESS_SEPARATOR
7070
import org.fossify.messages.messaging.SmsSender
71+
import org.fossify.messages.messaging.scheduleMessage
7172
import org.fossify.messages.models.Attachment
7273
import org.fossify.messages.models.Conversation
7374
import org.fossify.messages.models.Draft
@@ -1332,6 +1333,18 @@ fun Context.clearExpiredScheduledMessages(threadId: Long, messagesToDelete: List
13321333
}
13331334
}
13341335

1336+
fun Context.rescheduleAllScheduledMessages() {
1337+
val scheduledMessages = try {
1338+
messagesDB.getAllScheduledMessages()
1339+
} catch (_: Exception) {
1340+
return
1341+
}
1342+
1343+
scheduledMessages.forEach { message ->
1344+
runCatching { scheduleMessage(message) }
1345+
}
1346+
}
1347+
13351348
fun Context.getDefaultKeyboardHeight(): Int {
13361349
return resources.getDimensionPixelSize(R.dimen.default_keyboard_height)
13371350
}

app/src/main/kotlin/org/fossify/messages/interfaces/MessagesDao.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.fossify.messages.interfaces
22

3-
import androidx.room.*
3+
import androidx.room.Dao
4+
import androidx.room.Insert
5+
import androidx.room.OnConflictStrategy
6+
import androidx.room.Query
7+
import androidx.room.Transaction
48
import org.fossify.messages.models.Message
59
import org.fossify.messages.models.RecycleBinMessage
610

@@ -24,6 +28,9 @@ interface MessagesDao {
2428
@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")
2529
fun getAllRecycleBinMessages(): List<Message>
2630

31+
@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")
32+
fun getAllScheduledMessages(): List<Message>
33+
2734
@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")
2835
fun getOldRecycleBinMessages(timestamp: Long): List<Message>
2936

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.fossify.messages.receivers
2+
3+
import android.content.BroadcastReceiver
4+
import android.content.Context
5+
import android.content.Intent
6+
import org.fossify.commons.helpers.ensureBackgroundThread
7+
import org.fossify.messages.extensions.rescheduleAllScheduledMessages
8+
9+
/**
10+
* Reschedules exact alarms after boot/package updates and catches up overdue scheduled messages.
11+
*/
12+
class RescheduleAlarmsReceiver : BroadcastReceiver() {
13+
override fun onReceive(context: Context, intent: Intent) {
14+
val pendingResult = goAsync()
15+
ensureBackgroundThread {
16+
context.rescheduleAllScheduledMessages()
17+
pendingResult.finish()
18+
}
19+
}
20+
}

app/src/main/kotlin/org/fossify/messages/receivers/ScheduledMessageReceiver.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,24 @@ class ScheduledMessageReceiver : BroadcastReceiver() {
2222

2323
override fun onReceive(context: Context, intent: Intent) {
2424
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
25-
val wakelock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "simple.messenger:scheduled.message.receiver")
26-
wakelock.acquire(3000)
27-
25+
val wakelock = powerManager.newWakeLock(
26+
PowerManager.PARTIAL_WAKE_LOCK,
27+
"simple.messenger:scheduled.message.receiver"
28+
)
29+
wakelock.acquire(10_000)
2830

31+
val pendingResult = goAsync()
2932
ensureBackgroundThread {
30-
handleIntent(context, intent)
33+
try {
34+
handleIntent(context, intent)
35+
} finally {
36+
try {
37+
if (wakelock.isHeld) wakelock.release()
38+
} catch (_: Exception) {
39+
}
40+
41+
pendingResult.finish()
42+
}
3143
}
3244
}
3345

0 commit comments

Comments
 (0)