Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import com.wire.android.ui.home.conversations.ConversationNavArgs
import com.wire.android.ui.home.conversations.ConversationSnackbarMessages
import com.wire.android.ui.home.conversations.ConversationSnackbarMessages.OnResetSession
import com.wire.android.ui.home.conversations.delete.DeleteMessageDialogState
import com.wire.android.ui.home.conversations.messages.item.withOfflineIndicator
import com.wire.android.ui.home.conversations.model.AssetBundle
import com.wire.android.ui.home.conversations.model.UIMessage
import com.wire.android.ui.home.conversations.model.UIMessageContent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
* along with this program. If not, see http://www.gnu.org/licenses/.
*/

package com.wire.android.ui.home.conversations.messages
package com.wire.android.ui.home.conversations.messages.item

import androidx.paging.PagingData
import androidx.paging.insertSeparators
Expand All @@ -39,18 +39,23 @@ internal fun PagingData<UIMessage>.withOfflineIndicator(
): PagingData<UIMessage> {
if (!isOffline) return this

val offlineMessage = offlineMessage(conversationId)
return insertSeparators { before, after ->
when {
before == null && after == null -> offlineMessage
before == null && after?.isPending == false -> offlineMessage
before?.isPending == true && after?.isPending != true -> offlineMessage
val keySuffix = when {
before == null && after == null -> "empty"
before == null && after?.isPending == false -> "before:${after.header.messageId}"
before?.isPending == true && after?.isPending != true -> "after:${before.header.messageId}"
else -> null
}

if (keySuffix != null) {
offlineMessage(conversationId, keySuffix)
} else {
null
}
}
}

internal fun offlineMessage(conversationId: ConversationId): UIMessage.System =
internal fun offlineMessage(conversationId: ConversationId, keySuffix: String): UIMessage.System =
UIMessage.System(
conversationId = conversationId,
source = MessageSource.Self,
Expand All @@ -64,7 +69,7 @@ internal fun offlineMessage(conversationId: ConversationId): UIMessage.System =
flowStatus = MessageFlowStatus.Sent,
expirationStatus = ExpirationStatus.NotExpirable,
),
messageId = "offline-message:$conversationId",
messageId = "offline-message:$conversationId:$keySuffix",
userId = null,
connectionState = null,
isSenderDeleted = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runTest
import okio.Path.Companion.toPath
import com.wire.android.assertions.shouldBeEqualTo
import com.wire.android.ui.home.conversations.messages.item.withOfflineIndicator
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -255,7 +256,7 @@ class ConversationMessagesViewModelTest {
).asSnapshot()

assertEquals(
listOf("offline-message:$TEST_CONVERSATION_ID", "sent"),
listOf("offline-message:$TEST_CONVERSATION_ID:before:sent", "sent"),
snapshot.map { it.header.messageId }
)
}
Expand All @@ -273,7 +274,7 @@ class ConversationMessagesViewModelTest {
).asSnapshot()

assertEquals(
listOf("pending-1", "pending-2", "offline-message:$TEST_CONVERSATION_ID", "sent"),
listOf("pending-1", "pending-2", "offline-message:$TEST_CONVERSATION_ID:after:pending-2", "sent"),
snapshot.map { it.header.messageId }
)
}
Expand All @@ -295,11 +296,11 @@ class ConversationMessagesViewModelTest {
PagingData.from(emptyList<UIMessage>()).withOfflineIndicator(TEST_CONVERSATION_ID, isOffline = true)
).asSnapshot()

assertEquals(listOf("offline-message:$TEST_CONVERSATION_ID"), snapshot.map { it.header.messageId })
assertEquals(listOf("offline-message:$TEST_CONVERSATION_ID:empty"), snapshot.map { it.header.messageId })
}

@Test
fun `given network becomes disconnected, when observing messages, then offline message is shown`() = runTest {
fun `given network becomes disconnected with no pending messages, when observing messages, then offline message is shown`() = runTest {
val message = regularMessage(id = "sent")
val (arrangement, viewModel) = ConversationMessagesViewModelArrangement()
.withSuccessfulViewModelInit()
Expand All @@ -314,13 +315,13 @@ class ConversationMessagesViewModelTest {
advanceUntilIdle()

awaitMessageIds(
expectedMessageIds = listOf("offline-message:${arrangement.conversationId}", "sent")
expectedMessageIds = listOf("offline-message:${arrangement.conversationId}:before:sent", "sent")
)
}
}

@Test
fun `given network is connected without internet, when observing messages, then offline message is shown`() = runTest {
fun `given network is connected without internet with no pending messages, when observing messages, then offline message is shown`() = runTest {
val message = regularMessage(id = "sent")
val (arrangement, viewModel) = ConversationMessagesViewModelArrangement()
.withSuccessfulViewModelInit()
Expand All @@ -332,7 +333,7 @@ class ConversationMessagesViewModelTest {
arrangement.withPaginatedMessagesReturning(PagingData.from(listOf(message)))

assertEquals(
listOf("offline-message:${arrangement.conversationId}", "sent"),
listOf("offline-message:${arrangement.conversationId}:before:sent", "sent"),
flowOf(awaitItem()).asSnapshot().map { it.header.messageId }
)
}
Expand All @@ -350,7 +351,7 @@ class ConversationMessagesViewModelTest {
viewModel.conversationViewState.messages.test {
arrangement.withPaginatedMessagesReturning(PagingData.from(listOf(message)))
assertEquals(
listOf("offline-message:${arrangement.conversationId}", "sent"),
listOf("offline-message:${arrangement.conversationId}:before:sent", "sent"),
flowOf(awaitItem()).asSnapshot().map { it.header.messageId }
)

Expand Down
Loading