Checklist
Affected app version
1.9.1
Affected Android/Custom ROM version
Android 17 / GrapheneOS (build 2026091001)
Affected device model
Pixel 10 Pro XL
How did you install the app?
F-Droid / IzzyOnDroid
Steps to reproduce the bug
- Open a conversation and stay in it, scrolled to the bottom.
- Receive an SMS in that same conversation.
- Pull down the notification shade.
Expected behavior
No notification for a message that is already visible on screen. The message was read as it arrived, so there should be nothing left to dismiss.
Actual behavior
A notification is posted for the message and has to be dismissed by hand, even though the conversation was open and the message was visible the whole time. The conversation also stays marked as unread in the conversations list until it is left and reopened.
For anyone in an active back-and-forth, this means dismissing a notification for every incoming message in the chat they are currently typing in.
Additional information
ThreadActivity.refreshMessages() does try to handle this - it calls notificationManager.cancel(threadId.hashCode()) when isActivityVisible. But that runs from the RefreshMessages EventBus subscriber, which is ThreadMode.ASYNC, while SmsReceiver.handleMessageSync() calls refreshMessages() and then showReceivedMessageNotification() immediately afterwards. The cancel therefore usually runs before the notification is posted and has no effect. MmsReceiver posts the notification before calling refreshMessages() at all.
Suppressing the notification at the source rather than cancelling it afterwards avoids the race. I have a working fix for this and would be glad to open a PR if this gets the help wanted label.
Checklist
Affected app version
1.9.1
Affected Android/Custom ROM version
Android 17 / GrapheneOS (build 2026091001)
Affected device model
Pixel 10 Pro XL
How did you install the app?
F-Droid / IzzyOnDroid
Steps to reproduce the bug
Expected behavior
No notification for a message that is already visible on screen. The message was read as it arrived, so there should be nothing left to dismiss.
Actual behavior
A notification is posted for the message and has to be dismissed by hand, even though the conversation was open and the message was visible the whole time. The conversation also stays marked as unread in the conversations list until it is left and reopened.
For anyone in an active back-and-forth, this means dismissing a notification for every incoming message in the chat they are currently typing in.
Additional information
ThreadActivity.refreshMessages()does try to handle this - it callsnotificationManager.cancel(threadId.hashCode())whenisActivityVisible. But that runs from theRefreshMessagesEventBus subscriber, which isThreadMode.ASYNC, whileSmsReceiver.handleMessageSync()callsrefreshMessages()and thenshowReceivedMessageNotification()immediately afterwards. The cancel therefore usually runs before the notification is posted and has no effect.MmsReceiverposts the notification before callingrefreshMessages()at all.Suppressing the notification at the source rather than cancelling it afterwards avoids the race. I have a working fix for this and would be glad to open a PR if this gets the
help wantedlabel.