diff --git a/src/Ikar.AndroidKotlin/app/build.gradle.kts b/src/Ikar.AndroidKotlin/app/build.gradle.kts index 7c79e56..73a9c5d 100644 --- a/src/Ikar.AndroidKotlin/app/build.gradle.kts +++ b/src/Ikar.AndroidKotlin/app/build.gradle.kts @@ -37,8 +37,8 @@ android { applicationId = "com.seven.ikar.kotlin" minSdk = 24 targetSdk = 36 - versionCode = 211 - versionName = "3.98" + versionCode = 212 + versionName = "3.99" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt index 54ccfa7..c335742 100644 --- a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/IkarFirebaseMessagingService.kt @@ -26,6 +26,7 @@ class IkarFirebaseMessagingService : FirebaseMessagingService() { runCatching { val data = message.data.orEmpty() if (data.isNotEmpty()) { + notifyChatDataChanged(data) PushNotificationDisplayService.show(this, data) return } @@ -42,6 +43,15 @@ class IkarFirebaseMessagingService : FirebaseMessagingService() { } } + private fun notifyChatDataChanged(data: Map) { + if (!data.changesChatData()) { + return + } + + val app = applicationContext as? IkarNativeApp ?: return + app.container.realtimeService.notifyChatsChangedLocally() + } + companion object { private const val LOG_TAG = "IkarKotlinFcm" } diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt index 53de193..2c92203 100644 --- a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/push/PushData.kt @@ -27,3 +27,7 @@ object PushDataKinds { const val VideoCallEnded = "video_call_ended" const val AppUpdateAvailable = "app_update_available" } + +internal fun Map.changesChatData(): Boolean = + this[PushDataKeys.Kind] == PushDataKinds.ChatMessage || + this[PushDataKeys.Kind] == PushDataKinds.MessageReaction diff --git a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt index 2b907cf..3325014 100644 --- a/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt +++ b/src/Ikar.AndroidKotlin/app/src/main/java/com/seven/ikar/kotlin/core/realtime/RealtimeDtos.kt @@ -18,6 +18,7 @@ import com.seven.ikar.kotlin.core.model.MessageDto import com.seven.ikar.kotlin.core.model.MessageReactionDto import com.seven.ikar.kotlin.core.model.MessageReplyDto import com.seven.ikar.kotlin.core.model.OutgoingCallDto +import com.seven.ikar.kotlin.core.model.StoryReplyDto import com.seven.ikar.kotlin.core.model.UserSummaryDto data class RealtimeUserSummaryDto( @@ -65,8 +66,10 @@ data class RealtimeMessageDto( val postedAsChannel: Boolean = false, val displayAuthorName: String? = null, val viewCount: Int? = null, + val storyReply: RealtimeStoryReplyDto? = null, val discussionMessageId: String? = null, - val commentCount: Int? = null + val commentCount: Int? = null, + val clientMessageId: String? = null ) data class RealtimeMessageReplyDto( @@ -82,6 +85,13 @@ data class RealtimeMessageReactionDto( val isMine: Boolean ) +data class RealtimeStoryReplyDto( + val storyId: String, + val authorUserId: String, + val previewText: String, + val attachmentKind: String? = null +) + data class RealtimeChatSummaryDto( val id: String, val title: String, @@ -210,8 +220,10 @@ fun RealtimeMessageDto.toCore(): MessageDto = MessageDto( postedAsChannel = postedAsChannel, displayAuthorName = displayAuthorName, viewCount = viewCount, + storyReply = storyReply?.toCore(), discussionMessageId = discussionMessageId, - commentCount = commentCount + commentCount = commentCount, + clientMessageId = clientMessageId ) fun RealtimeMessageReplyDto.toCore(): MessageReplyDto = MessageReplyDto( @@ -227,6 +239,13 @@ fun RealtimeMessageReactionDto.toCore(): MessageReactionDto = MessageReactionDto isMine = isMine ) +fun RealtimeStoryReplyDto.toCore(): StoryReplyDto = StoryReplyDto( + storyId = storyId, + authorUserId = authorUserId, + previewText = previewText, + attachmentKind = attachmentKind +) + fun RealtimeChatSummaryDto.toCore(): ChatSummaryDto = ChatSummaryDto( id = id, title = title, diff --git a/src/Ikar.AndroidKotlin/app/src/test/java/com/seven/ikar/kotlin/core/push/PushDataTest.kt b/src/Ikar.AndroidKotlin/app/src/test/java/com/seven/ikar/kotlin/core/push/PushDataTest.kt new file mode 100644 index 0000000..6811914 --- /dev/null +++ b/src/Ikar.AndroidKotlin/app/src/test/java/com/seven/ikar/kotlin/core/push/PushDataTest.kt @@ -0,0 +1,20 @@ +package com.seven.ikar.kotlin.core.push + +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Test + +class PushDataTest { + @Test + fun messagePushesChangeChatData() { + assertTrue(mapOf(PushDataKeys.Kind to PushDataKinds.ChatMessage).changesChatData()) + assertTrue(mapOf(PushDataKeys.Kind to PushDataKinds.MessageReaction).changesChatData()) + } + + @Test + fun unrelatedPushesDoNotChangeChatData() { + assertFalse(mapOf(PushDataKeys.Kind to PushDataKinds.AudioCallInvite).changesChatData()) + assertFalse(mapOf(PushDataKeys.Kind to PushDataKinds.AppUpdateAvailable).changesChatData()) + assertFalse(emptyMap().changesChatData()) + } +}