Skip to content

Commit

Permalink
feat: add more message status icons (#2079)
Browse files Browse the repository at this point in the history
  • Loading branch information
trOnk12 committed Aug 14, 2023
1 parent 92b79c8 commit 2000815
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ class MessageMapper @Inject constructor(
when (val status = message.status) {
Message.Status.Pending -> MessageFlowStatus.Sending
Message.Status.Sent -> MessageFlowStatus.Sent
is Message.Status.Read -> MessageFlowStatus.Read(status.readCount.toInt())
is Message.Status.Read -> MessageFlowStatus.Read(status.readCount)
Message.Status.Failed -> MessageFlowStatus.Failure.Send.Locally(isMessageEdited)
Message.Status.FailedRemotely -> MessageFlowStatus.Failure.Send.Remotely(isMessageEdited, message.conversationId.domain)
Message.Status.Delivered -> MessageFlowStatus.Delivered
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -236,8 +236,9 @@ fun MessageItem(
}
if (isMyMessage) {
MessageStatusIndicator(
message.header.messageStatus.flowStatus,
Modifier.padding(
status = message.header.messageStatus.flowStatus,
isGroupConversation = conversationDetailsData is ConversationDetailsData.Group,
modifier = Modifier.padding(
top = if (message.isTextContentWithoutQuote) dimensions().spacing2x else dimensions().spacing4x,
start = dimensions().spacing8x
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,30 @@
*/
package com.wire.android.ui.home.conversations

import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import com.wire.android.R
import com.wire.android.ui.common.colorsScheme
import com.wire.android.ui.common.spacers.HorizontalSpace
import com.wire.android.ui.home.conversations.model.MessageFlowStatus
import com.wire.android.ui.theme.WireTheme
import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.ui.PreviewMultipleThemes

@Composable
fun MessageStatusIndicator(status: MessageFlowStatus, modifier: Modifier = Modifier) {
fun MessageStatusIndicator(
status: MessageFlowStatus,
isGroupConversation: Boolean = false,
modifier: Modifier = Modifier
) {
when (status) {
MessageFlowStatus.Sending -> Icon(
modifier = modifier,
Expand All @@ -40,22 +49,48 @@ fun MessageStatusIndicator(status: MessageFlowStatus, modifier: Modifier = Modif
contentDescription = stringResource(R.string.content_description_message_sending_status),
)

MessageFlowStatus.Sent -> {
Icon(
modifier = modifier,
painter = painterResource(id = R.drawable.ic_message_sent),
tint = MaterialTheme.wireColorScheme.onTertiaryButtonDisabled,
contentDescription = stringResource(R.string.content_description_message_sending_status),
)
}

MessageFlowStatus.Delivered -> {
Icon(
modifier = modifier,
painter = painterResource(id = R.drawable.ic_message_delivered),
tint = MaterialTheme.wireColorScheme.onTertiaryButtonDisabled,
contentDescription = stringResource(R.string.content_description_message_delivered_status),
)
}

is MessageFlowStatus.Read -> {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
modifier = modifier,
painter = painterResource(id = R.drawable.ic_message_read),
tint = MaterialTheme.wireColorScheme.onTertiaryButtonDisabled,
contentDescription = stringResource(R.string.content_description_message_read_status),
)
if (isGroupConversation) {
HorizontalSpace.x2()
Text(
text = status.count.toString(),
style = MaterialTheme.wireTypography.label03.copy(color = colorsScheme().onTertiaryButtonDisabled)
)
}
}
}

is MessageFlowStatus.Failure -> Icon(
modifier = modifier,
painter = painterResource(id = R.drawable.ic_message_error),
tint = MaterialTheme.wireColorScheme.error,
contentDescription = stringResource(R.string.content_description_message_error_status),
)
// TODO handle read, sent and delivered status
// MessageFlowStatus.Sent -> Icon(
// modifier = modifier,
// painter = painterResource(id = R.drawable.ic_message_delivered),
// tint = MaterialTheme.wireColorScheme.onTertiaryButtonDisabled,
// contentDescription = stringResource(R.string.content_description_message_delivered_status),
// )
// is MessageFlowStatus.Read -> {}
// MessageFlowStatus.Delivered -> TODO()
else -> HorizontalSpace.x16()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,20 @@ data class ConversationInfoViewState(
)

sealed class ConversationDetailsData {
object None : ConversationDetailsData()
data object None : ConversationDetailsData()
data class OneOne(
val otherUserId: UserId,
val otherUserName: String?,
val connectionState: ConnectionState,
val isBlocked: Boolean,
val isDeleted: Boolean
) :
ConversationDetailsData()
) : ConversationDetailsData()

data class Group(val conversationId: QualifiedID) : ConversationDetailsData()
}

sealed class ConversationAvatar {
object None : ConversationAvatar()
data object None : ConversationAvatar()
data class OneOne(val avatarAsset: ImageAsset.UserAvatarAsset?, val status: UserAvailabilityStatus) : ConversationAvatar()
data class Group(val conversationId: QualifiedID) : ConversationAvatar()
}
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ sealed class MessageFlowStatus {

object Delivered : MessageFlowStatus()

data class Read(val count: Int) : MessageFlowStatus()
data class Read(val count: Long) : MessageFlowStatus()
}

@Stable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ private fun EnabledMessageComposer(
onSearchMentionQueryChanged: (String) -> Unit,
onClearMentionSearchResult: () -> Unit,
tempWritableVideoUri: Uri?,
tempWritableImageUri: Uri?,
tempWritableImageUri: Uri?
) {
with(messageComposerStateHolder) {
Column {
Expand All @@ -241,8 +241,6 @@ private fun EnabledMessageComposer(
ActiveMessageComposer(
messageComposerStateHolder = messageComposerStateHolder,
snackbarHostState = snackbarHostState,
tempWritableVideoUri = tempWritableVideoUri,
tempWritableImageUri = tempWritableImageUri,
messageListContent = messageListContent,
onTransitionToInActive = messageComposerStateHolder::toInActive,
onSendButtonClicked = onSendButtonClicked,
Expand All @@ -251,7 +249,9 @@ private fun EnabledMessageComposer(
onChangeSelfDeletionClicked = onChangeSelfDeletionClicked,
onSearchMentionQueryChanged = onSearchMentionQueryChanged,
onClearMentionSearchResult = onClearMentionSearchResult,
onPingOptionClicked = onPingOptionClicked
onPingOptionClicked = onPingOptionClicked,
tempWritableVideoUri = tempWritableVideoUri,
tempWritableImageUri = tempWritableImageUri
)
}

Expand Down
27 changes: 0 additions & 27 deletions app/src/test/kotlin/com/wire/android/framework/TestMessage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,11 @@

package com.wire.android.framework

import com.wire.android.mapper.AssetMessageContentMetadata
import com.wire.android.model.UserAvatarData
import com.wire.android.ui.home.conversations.model.ExpirationStatus
import com.wire.android.ui.home.conversations.model.MessageBody
import com.wire.android.ui.home.conversations.model.MessageFlowStatus
import com.wire.android.ui.home.conversations.model.MessageFooter
import com.wire.android.ui.home.conversations.model.MessageHeader
import com.wire.android.ui.home.conversations.model.MessageSource
import com.wire.android.ui.home.conversations.model.MessageStatus
import com.wire.android.ui.home.conversations.model.MessageTime
import com.wire.android.ui.home.conversations.model.UIMessage
import com.wire.android.ui.home.conversations.model.UIMessageContent.TextMessage
import com.wire.android.ui.home.conversationslist.model.Membership
import com.wire.android.util.ui.UIText
import com.wire.kalium.logic.data.conversation.ClientId
Expand All @@ -42,7 +35,6 @@ import com.wire.kalium.logic.data.message.MessageContent
import com.wire.kalium.logic.data.message.MessageEncryptionAlgorithm
import com.wire.kalium.logic.data.message.MessagePreview
import com.wire.kalium.logic.data.message.MessagePreviewContent
import com.wire.kalium.logic.data.user.UserAvailabilityStatus
import com.wire.kalium.logic.data.user.UserId

object TestMessage {
Expand Down Expand Up @@ -154,17 +146,6 @@ object TestMessage {
status = Message.Status.Sent,
expirationData = null
)
val IMAGE_ASSET_MESSAGE_DATA_TEST = AssetMessageContentMetadata(
AssetContent(
100L,
"dummy_data.tiff",
"image/tiff",
AssetContent.AssetMetadata.Image(50, 50),
AssetContent.RemoteData(ByteArray(16), ByteArray(16), "asset-id", "token", "domain.com", MessageEncryptionAlgorithm.AES_CBC),
Message.UploadStatus.NOT_UPLOADED,
Message.DownloadStatus.NOT_DOWNLOADED
)
)
val UI_MESSAGE_HEADER = MessageHeader(
username = UIText.DynamicString("username"),
membership = Membership.Guest,
Expand All @@ -179,14 +160,6 @@ object TestMessage {
isSenderDeleted = false,
isSenderUnavailable = false
)
val UI_TEXT_MESSAGE = UIMessage.Regular(
userAvatarData = UserAvatarData(asset = null, availabilityStatus = UserAvailabilityStatus.NONE),
source = MessageSource.OtherUser,
header = UI_MESSAGE_HEADER,
messageContent = TextMessage(MessageBody(UIText.DynamicString("Some Text Message"))),
messageFooter = MessageFooter(UI_MESSAGE_HEADER.messageId)
)

val MISSED_CALL_MESSAGE = Message.System(
id = "messageID",
content = MessageContent.MissedCall,
Expand Down
28 changes: 26 additions & 2 deletions app/src/test/kotlin/com/wire/android/mapper/MessageMapperTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,30 @@ class MessageMapperTest {
)
}

@Test
fun givenMessageHasReadStatus_whenMappingToUiMessage_theCorrectValueShouldBeReturned() = runTest {
// given
val (arrangement, mapper) = Arrangement().arrange()

val userId1 = UserId("user-id1", "user-domain")
val userId2 = UserId("user-id2", "user-domain")
val member1 = TestUser.MEMBER_SELF.copy(TestUser.SELF_USER.copy(id = userId1))
val member2 = TestUser.MEMBER_OTHER.copy(TestUser.OTHER_USER.copy(id = userId2))
val members = listOf(member1.user, member2.user)

val message = arrangement.testMessage(
status = Message.Status.Read(10)
)

// when
val result = mapper.toUIMessage(members, message)?.header?.messageStatus?.flowStatus

// then
assert(result != null)
assert(result!! is MessageFlowStatus.Read)
assert((result as MessageFlowStatus.Read).count == 10L)
}

private fun checkMessageData(
uiMessage: UIMessage?,
time: String?,
Expand Down Expand Up @@ -226,11 +250,11 @@ class MessageMapperTest {
fun arrange() = this to messageMapper

fun testMessage(
senderUserId: UserId,
senderUserId: UserId = UserId("someValue", "someDomain"),
status: Message.Status = Message.Status.Sent,
visibility: Message.Visibility = Message.Visibility.VISIBLE,
editStatus: Message.EditStatus = Message.EditStatus.NotEdited,
date: String
date: String = "2016-09-18T17:34:02.666Z"
): Message.Regular = TestMessage.TEXT_MESSAGE.copy(
senderUserId = senderUserId,
status = status,
Expand Down

0 comments on commit 2000815

Please sign in to comment.