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."