diff --git a/changelog.d/1451.feature b/changelog.d/1451.feature
new file mode 100644
index 0000000000..1869f0ecd5
--- /dev/null
+++ b/changelog.d/1451.feature
@@ -0,0 +1 @@
+Display different notifications for mentions.
diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolver.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolver.kt
index 9093b36615..26c8a7d55b 100644
--- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolver.kt
+++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolver.kt
@@ -82,6 +82,11 @@ class NotifiableEventResolver @Inject constructor(
return when (val content = this.content) {
is NotificationContent.MessageLike.RoomMessage -> {
val messageBody = descriptionFromMessageContent(content, senderDisplayName ?: content.senderId.value)
+ val notificationBody = if (hasMention) {
+ stringProvider.getString(R.string.notification_mentioned_you_body, messageBody)
+ } else {
+ messageBody
+ }
buildNotifiableMessageEvent(
sessionId = userId,
senderId = content.senderId,
@@ -90,7 +95,7 @@ class NotifiableEventResolver @Inject constructor(
noisy = isNoisy,
timestamp = this.timestamp,
senderName = senderDisplayName,
- body = messageBody,
+ body = notificationBody,
imageUriString = this.contentUrl,
roomName = roomDisplayName,
roomIsDirect = isDirect,
diff --git a/libraries/push/impl/src/main/res/values-cs/translations.xml b/libraries/push/impl/src/main/res/values-cs/translations.xml
index 84525a427e..2b76d7b93e 100644
--- a/libraries/push/impl/src/main/res/values-cs/translations.xml
+++ b/libraries/push/impl/src/main/res/values-cs/translations.xml
@@ -8,6 +8,7 @@
"Vstoupit"
"Odmítnout"
"Vás pozval(a) do chatu"
+ "Zmínili vás: %1$s"
"Nové zprávy"
"Reagoval(a) s %1$s"
"Označit jako přečtené"
diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt
index 819a1e94a2..6276983cc9 100644
--- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt
+++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/NotifiableEventResolverTest.kt
@@ -25,8 +25,10 @@ import io.element.android.libraries.matrix.api.room.RoomMembershipState
import io.element.android.libraries.matrix.api.timeline.item.event.AudioMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.EmoteMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.FileMessageType
+import io.element.android.libraries.matrix.api.timeline.item.event.FormattedBody
import io.element.android.libraries.matrix.api.timeline.item.event.ImageMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.LocationMessageType
+import io.element.android.libraries.matrix.api.timeline.item.event.MessageFormat
import io.element.android.libraries.matrix.api.timeline.item.event.NoticeMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.TextMessageType
import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType
@@ -51,6 +53,7 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
+import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class)
class NotifiableEventResolverTest {
@@ -97,6 +100,71 @@ class NotifiableEventResolverTest {
assertThat(result).isEqualTo(expectedResult)
}
+ @Test
+ @Config(qualifiers = "en")
+ fun `resolve event message with mention`() = runTest {
+ val sut = createNotifiableEventResolver(
+ notificationResult = Result.success(
+ createNotificationData(
+ content = NotificationContent.MessageLike.RoomMessage(
+ senderId = A_USER_ID_2,
+ messageType = TextMessageType(body = "Hello world", formatted = null)
+ ),
+ hasMention = true,
+ )
+ )
+ )
+ val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID)
+ val expectedResult = createNotifiableMessageEvent(body = "Mentioned you: Hello world")
+ assertThat(result).isEqualTo(expectedResult)
+ }
+
+ @Test
+ fun `resolve HTML formatted event message text takes plain text version`() = runTest {
+ val sut = createNotifiableEventResolver(
+ notificationResult = Result.success(
+ createNotificationData(
+ content = NotificationContent.MessageLike.RoomMessage(
+ senderId = A_USER_ID_2,
+ messageType = TextMessageType(
+ body = "Hello world!",
+ formatted = FormattedBody(
+ body = "Hello world",
+ format = MessageFormat.HTML,
+ )
+ )
+ )
+ )
+ )
+ )
+ val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID)
+ val expectedResult = createNotifiableMessageEvent(body = "Hello world")
+ assertThat(result).isEqualTo(expectedResult)
+ }
+
+ @Test
+ fun `resolve incorrectly formatted event message text uses fallback`() = runTest {
+ val sut = createNotifiableEventResolver(
+ notificationResult = Result.success(
+ createNotificationData(
+ content = NotificationContent.MessageLike.RoomMessage(
+ senderId = A_USER_ID_2,
+ messageType = TextMessageType(
+ body = "Hello world",
+ formatted = FormattedBody(
+ body = "???Hello world!???",
+ format = MessageFormat.UNKNOWN,
+ )
+ )
+ )
+ )
+ )
+ )
+ val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID)
+ val expectedResult = createNotifiableMessageEvent(body = "Hello world")
+ assertThat(result).isEqualTo(expectedResult)
+ }
+
@Test
fun `resolve event message audio`() = runTest {
val sut = createNotifiableEventResolver(
@@ -430,6 +498,7 @@ class NotifiableEventResolverTest {
private fun createNotificationData(
content: NotificationContent,
isDirect: Boolean = false,
+ hasMention: Boolean = false,
): NotificationData {
return NotificationData(
eventId = AN_EVENT_ID,
@@ -444,7 +513,7 @@ class NotifiableEventResolverTest {
timestamp = A_TIMESTAMP,
content = content,
contentUrl = null,
- hasMention = false,
+ hasMention = hasMention,
)
}
diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml
index fae900dd9c..c816850f98 100644
--- a/libraries/ui-strings/src/main/res/values/localazy.xml
+++ b/libraries/ui-strings/src/main/res/values/localazy.xml
@@ -227,6 +227,9 @@
- "%d votes"
"Rageshake to report bug"
+ "Are you sure you want to delete this poll?"
+ "Delete Poll"
+ "Edit poll"
"Failed selecting media, please try again."
"Failed processing media to upload, please try again."
"Failed uploading media, please try again."