Skip to content

Commit

Permalink
feat: add timer to all message types (#1920)
Browse files Browse the repository at this point in the history
  • Loading branch information
MohamadJaara committed Jul 13, 2023
1 parent ff56182 commit 93669ba
Show file tree
Hide file tree
Showing 13 changed files with 163 additions and 83 deletions.
4 changes: 2 additions & 2 deletions app/src/main/kotlin/com/wire/android/mapper/MessageMapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ class MessageMapper @Inject constructor(
}
}

private fun provideExpirationData(message: Message.Standalone): ExpirationStatus {
val expirationData = (message as? Message.Regular)?.expirationData
private fun provideExpirationData(message: Message): ExpirationStatus {
val expirationData = message.expirationData
return if (expirationData == null) {
ExpirationStatus.NotExpirable
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ private fun ConversationScreen(
composerMessages: SharedFlow<SnackBarMessage>,
conversationMessages: SharedFlow<SnackBarMessage>,
conversationMessagesViewModel: ConversationMessagesViewModel,
onSelfDeletingMessageRead: (UIMessage.Regular) -> Unit,
onSelfDeletingMessageRead: (UIMessage) -> Unit,
onNewSelfDeletingMessagesStatus: (SelfDeletionTimer) -> Unit,
tempWritableImageUri: Uri?,
tempWritableVideoUri: Uri?,
Expand Down Expand Up @@ -451,7 +451,7 @@ private fun ConversationScreenContent(
onOpenProfile: (String) -> Unit,
onUpdateConversationReadDate: (String) -> Unit,
onShowEditingOptions: (UIMessage.Regular) -> Unit,
onSelfDeletingMessageRead: (UIMessage.Regular) -> Unit,
onSelfDeletingMessageRead: (UIMessage) -> Unit,
conversationDetailsData: ConversationDetailsData,
onFailedMessageRetryClicked: (String) -> Unit,
onFailedMessageCancelClicked: (String) -> Unit,
Expand Down Expand Up @@ -564,7 +564,7 @@ fun MessageList(
onReactionClicked: (String, String) -> Unit,
onResetSessionClicked: (senderUserId: UserId, clientId: String?) -> Unit,
onShowEditingOption: (UIMessage.Regular) -> Unit,
onSelfDeletingMessageRead: (UIMessage.Regular) -> Unit,
onSelfDeletingMessageRead: (UIMessage) -> Unit,
conversationDetailsData: ConversationDetailsData,
onFailedMessageRetryClicked: (String) -> Unit,
onFailedMessageCancelClicked: (String) -> Unit
Expand Down Expand Up @@ -630,7 +630,8 @@ fun MessageList(
is UIMessage.System -> SystemMessageItem(
message = message,
onFailedMessageCancelClicked = onFailedMessageCancelClicked,
onFailedMessageRetryClicked = onFailedMessageRetryClicked
onFailedMessageRetryClicked = onFailedMessageRetryClicked,
onSelfDeletingMessageRead = onSelfDeletingMessageRead
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ class MessageComposerViewModel @Inject constructor(
}
}

fun startSelfDeletion(uiMessage: UIMessage.Regular) {
fun startSelfDeletion(uiMessage: UIMessage) {
enqueueMessageSelfDeletion(conversationId, uiMessage.header.messageId)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,45 +257,41 @@ class SelfDeletionTimerHelper(private val context: Context) {

@Composable
fun startDeletionTimer(
message: UIMessage.Regular,
message: UIMessage,
expirableTimer: SelfDeletionTimerHelper.SelfDeletionTimerState.Expirable,
onStartMessageSelfDeletion: (UIMessage.Regular) -> Unit
onStartMessageSelfDeletion: (UIMessage) -> Unit
) {
message.messageContent?.let {
when (val messageContent = message.messageContent) {
is UIMessageContent.AssetMessage -> startAssetDeletion(
expirableTimer = expirableTimer,
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
downloadStatus = messageContent.downloadStatus
)
when (val messageContent = message.messageContent) {
is UIMessageContent.AssetMessage -> startAssetDeletion(
expirableTimer = expirableTimer,
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
downloadStatus = messageContent.downloadStatus
)

is UIMessageContent.AudioAssetMessage -> startAssetDeletion(
expirableTimer = expirableTimer,
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
downloadStatus = messageContent.downloadStatus
)
is UIMessageContent.AudioAssetMessage -> startAssetDeletion(
expirableTimer = expirableTimer,
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
downloadStatus = messageContent.downloadStatus
)

is UIMessageContent.ImageMessage -> startAssetDeletion(
expirableTimer = expirableTimer,
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
downloadStatus = messageContent.downloadStatus
)
is UIMessageContent.ImageMessage -> startAssetDeletion(
expirableTimer = expirableTimer,
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
downloadStatus = messageContent.downloadStatus
)

is UIMessageContent.TextMessage -> {
LaunchedEffect(Unit) {
onStartMessageSelfDeletion(message)
}
LaunchedEffect(expirableTimer.timeLeft) {
with(expirableTimer) {
if (timeLeft != ZERO) {
delay(updateInterval())
decreaseTimeLeft(updateInterval())
}
else -> {
LaunchedEffect(Unit) {
onStartMessageSelfDeletion(message)
}
LaunchedEffect(expirableTimer.timeLeft) {
with(expirableTimer) {
if (timeLeft != ZERO) {
delay(updateInterval())
decreaseTimeLeft(updateInterval())
}
}
}

else -> {}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ fun MessageItem(
onOpenProfile: (String) -> Unit,
onReactionClicked: (String, String) -> Unit,
onResetSessionClicked: (senderUserId: UserId, clientId: String?) -> Unit,
onSelfDeletingMessageRead: (UIMessage.Regular) -> Unit,
onSelfDeletingMessageRead: (UIMessage) -> Unit,
onFailedMessageRetryClicked: (String) -> Unit = {},
onFailedMessageCancelClicked: (String) -> Unit = {}
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,21 @@ import com.wire.android.util.ui.toUIText
fun SystemMessageItem(
message: UIMessage.System,
onFailedMessageRetryClicked: (String) -> Unit = {},
onFailedMessageCancelClicked: (String) -> Unit = {}
onFailedMessageCancelClicked: (String) -> Unit = {},
onSelfDeletingMessageRead: (UIMessage) -> Unit = {}
) {
val selfDeletionTimerState = rememberSelfDeletionTimer(message.header.messageStatus.expirationStatus)
if (
selfDeletionTimerState is SelfDeletionTimerHelper.SelfDeletionTimerState.Expirable &&
!message.isPending &&
!message.sendingFailed
) {
startDeletionTimer(
message = message,
expirableTimer = selfDeletionTimerState,
onStartMessageSelfDeletion = onSelfDeletingMessageRead
)
}
val fullAvatarOuterPadding = dimensions().userAvatarClickablePadding + dimensions().userAvatarStatusBorderSize
Row(
Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import coil.request.ImageResult
import com.wire.android.model.ImageAsset
import com.wire.android.model.ImageAsset.UserAvatarAsset
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.MessageEditStatus
import com.wire.android.ui.home.conversations.model.MessageFlowStatus
Expand Down Expand Up @@ -62,7 +63,10 @@ val mockHeader = MessageHeader(
membership = Membership.Guest,
isLegalHold = true,
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(flowStatus = MessageFlowStatus.Sent),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "",
connectionState = ConnectionState.ACCEPTED,
isSenderDeleted = false,
Expand Down Expand Up @@ -117,7 +121,10 @@ fun mockAssetMessage(uploadStatus: Message.UploadStatus = Message.UploadStatus.U
membership = Membership.Guest,
isLegalHold = true,
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(flowStatus = MessageFlowStatus.Sent),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "",
connectionState = ConnectionState.ACCEPTED,
isSenderDeleted = false,
Expand Down Expand Up @@ -148,7 +155,10 @@ fun mockedImg(
@Suppress("MagicNumber")
fun mockedImageUIMessage(
uploadStatus: Message.UploadStatus = Message.UploadStatus.UPLOADED,
messageStatus: MessageStatus = MessageStatus(flowStatus = MessageFlowStatus.Sent),
messageStatus: MessageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
expirationStatus = ExpirationStatus.NotExpirable
)
) = UIMessage.Regular(
userAvatarData = UserAvatarData(null, UserAvailabilityStatus.AVAILABLE),
header = MessageHeader(
Expand Down Expand Up @@ -176,7 +186,10 @@ fun getMockedMessages(): List<UIMessage> = listOf(
membership = Membership.Guest,
isLegalHold = true,
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(flowStatus = MessageFlowStatus.Sent),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "1",
connectionState = ConnectionState.ACCEPTED,
isSenderDeleted = false,
Expand All @@ -202,7 +215,10 @@ fun getMockedMessages(): List<UIMessage> = listOf(
membership = Membership.Guest,
isLegalHold = true,
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(flowStatus = MessageFlowStatus.Delivered, isDeleted = true),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Delivered, isDeleted = true,
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "2",
connectionState = ConnectionState.ACCEPTED,
isSenderDeleted = false,
Expand All @@ -221,7 +237,8 @@ fun getMockedMessages(): List<UIMessage> = listOf(
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm")
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm"),
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "3",
connectionState = ConnectionState.ACCEPTED,
Expand All @@ -241,7 +258,8 @@ fun getMockedMessages(): List<UIMessage> = listOf(
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm")
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm"),
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "4",
connectionState = ConnectionState.ACCEPTED,
Expand All @@ -259,7 +277,11 @@ fun getMockedMessages(): List<UIMessage> = listOf(
membership = Membership.External,
isLegalHold = false,
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(flowStatus = MessageFlowStatus.Delivered, isDeleted = true),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Delivered,
isDeleted = true,
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "5",
connectionState = ConnectionState.ACCEPTED,
isSenderDeleted = false,
Expand Down Expand Up @@ -287,7 +309,8 @@ fun getMockedMessages(): List<UIMessage> = listOf(
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm")
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm"),
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "6",
connectionState = ConnectionState.ACCEPTED,
Expand All @@ -307,7 +330,8 @@ fun getMockedMessages(): List<UIMessage> = listOf(
messageTime = MessageTime("12.23pm"),
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Sent,
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm")
editStatus = MessageEditStatus.Edited("May 31, 2022 12.24pm"),
expirationStatus = ExpirationStatus.NotExpirable
),
messageId = "7",
connectionState = ConnectionState.ACCEPTED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,8 @@ fun PreviewDeletedMessage() {
it.copy(
header = it.header.copy(
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Delivered, isDeleted = true
flowStatus = MessageFlowStatus.Delivered, isDeleted = true,
expirationStatus = ExpirationStatus.NotExpirable
)
)
)
Expand Down Expand Up @@ -178,7 +179,8 @@ fun PreviewFailedSendMessage() {
it.copy(
header = it.header.copy(
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Failure.Send.Locally(false)
flowStatus = MessageFlowStatus.Failure.Send.Locally(false),
expirationStatus = ExpirationStatus.NotExpirable
)
),
messageFooter = mockFooter.copy(reactions = emptyMap(), ownReactions = emptySet())
Expand Down Expand Up @@ -208,7 +210,8 @@ fun PreviewFailedDecryptionMessage() {
it.copy(
header = it.header.copy(
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Failure.Decryption(false)
flowStatus = MessageFlowStatus.Failure.Decryption(false),
expirationStatus = ExpirationStatus.NotExpirable
)
),
messageFooter = mockFooter.copy(reactions = emptyMap(), ownReactions = emptySet())
Expand Down Expand Up @@ -367,7 +370,10 @@ fun PreviewImageMessageFailedUpload() {
MessageItem(
message = mockedImageUIMessage(
uploadStatus = Message.UploadStatus.FAILED_UPLOAD,
messageStatus = MessageStatus(flowStatus = MessageFlowStatus.Failure.Send.Locally(false))
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Failure.Send.Locally(false),
expirationStatus = ExpirationStatus.NotExpirable
)
),
audioMessagesState = emptyMap(),
onLongClicked = {},
Expand Down Expand Up @@ -494,7 +500,10 @@ fun PreviewAggregatedMessagesWithErrorMessage() {
MessageItem(
message = mockMessageWithText.copy(
header = mockHeader.copy(
messageStatus = MessageStatus(flowStatus = MessageFlowStatus.Failure.Send.Locally(false))
messageStatus = MessageStatus(
flowStatus = MessageFlowStatus.Failure.Send.Locally(false),
expirationStatus = ExpirationStatus.NotExpirable
)
)
),
showAuthor = false,
Expand Down
Loading

0 comments on commit 93669ba

Please sign in to comment.