Skip to content

Commit

Permalink
fix: self-deleting asset message timer [WPB-1807]
Browse files Browse the repository at this point in the history
  • Loading branch information
saleniuk committed Sep 24, 2024
1 parent 456653a commit e916225
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 114 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ import androidx.lifecycle.repeatOnLifecycle
import com.wire.android.R
import com.wire.android.ui.home.conversations.model.ExpirationStatus
import com.wire.android.ui.home.conversations.model.UIMessage
import com.wire.android.ui.home.conversations.model.UIMessageContent
import com.wire.kalium.logic.data.asset.AssetTransferStatus
import com.wire.kalium.logic.data.asset.isSaved
import com.wire.kalium.logic.data.message.Message
import kotlinx.coroutines.delay
import kotlinx.datetime.Clock
Expand Down Expand Up @@ -250,62 +247,9 @@ class SelfDeletionTimerHelper(private val stringResourceProvider: StringResource
}

@Composable
fun startDeletionTimer(
message: UIMessage,
assetTransferStatus: AssetTransferStatus?,
onStartMessageSelfDeletion: (UIMessage) -> Unit
) {
if (assetTransferStatus != null) {
when (message.messageContent) {
is UIMessageContent.AssetMessage -> startAssetDeletion(
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
transferStatus = assetTransferStatus
)

is UIMessageContent.AudioAssetMessage -> startAssetDeletion(
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
transferStatus = assetTransferStatus
)

is UIMessageContent.ImageMessage -> startAssetDeletion(
onSelfDeletingMessageRead = { onStartMessageSelfDeletion(message) },
transferStatus = assetTransferStatus
)

else -> startRegularDeletion(message = message, onStartMessageSelfDeletion = onStartMessageSelfDeletion)
}
} else {
startRegularDeletion(message = message, onStartMessageSelfDeletion = onStartMessageSelfDeletion)
}
}

@Composable
private fun startAssetDeletion(onSelfDeletingMessageRead: () -> Unit, transferStatus: AssetTransferStatus) {
LaunchedEffect(transferStatus) {
if (transferStatus.isSaved()) {
onSelfDeletingMessageRead()
}
}
LaunchedEffect(key1 = timeLeft, key2 = transferStatus) {
if (transferStatus.isSaved()) {
if (timeLeft != ZERO) {
delay(updateInterval())
recalculateTimeLeft()
}
}
}
val lifecycleOwner = LocalLifecycleOwner.current
LaunchedEffect(lifecycleOwner) {
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
recalculateTimeLeft()
}
}
}

@Composable
private fun startRegularDeletion(message: UIMessage, onStartMessageSelfDeletion: (UIMessage) -> Unit) {
fun StartDeletionTimer(message: UIMessage, onSelfDeletingMessageRead: (UIMessage) -> Unit) {
LaunchedEffect(Unit) {
onStartMessageSelfDeletion(message)
onSelfDeletingMessageRead(message)
}
LaunchedEffect(timeLeft) {
if (timeLeft != ZERO) {
Expand All @@ -322,7 +266,7 @@ class SelfDeletionTimerHelper(private val stringResourceProvider: StringResource
}
}

object NotExpirable : SelfDeletionTimerState()
data object NotExpirable : SelfDeletionTimerState()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,7 @@ import kotlinx.collections.immutable.PersistentMap
fun MessageContainerItem(
message: UIMessage,
conversationDetailsData: ConversationDetailsData,
searchQuery: String = "",
showAuthor: Boolean = true,
useSmallBottomPadding: Boolean = false,
audioMessagesState: PersistentMap<String, AudioState>,
assetStatus: AssetTransferStatus? = null,
onLongClicked: (UIMessage.Regular) -> Unit,
swipableMessageConfiguration: SwipableMessageConfiguration,
onAssetMessageClicked: (String) -> Unit,
Expand All @@ -67,6 +63,11 @@ fun MessageContainerItem(
onReactionClicked: (String, String) -> Unit,
onResetSessionClicked: (senderUserId: UserId, clientId: String?) -> Unit,
onSelfDeletingMessageRead: (UIMessage) -> Unit,
modifier: Modifier = Modifier,
searchQuery: String = "",
showAuthor: Boolean = true,
useSmallBottomPadding: Boolean = false,
assetStatus: AssetTransferStatus? = null,
onFailedMessageRetryClicked: (String, ConversationId) -> Unit = { _, _ -> },
onFailedMessageCancelClicked: (String) -> Unit = {},
onLinkClick: (String) -> Unit = {},
Expand All @@ -77,22 +78,21 @@ fun MessageContainerItem(
shouldDisplayFooter: Boolean = true,
onReplyClickable: Clickable? = null,
isSelectedMessage: Boolean = false,
isInteractionAvailable: Boolean = true,
isInteractionAvailable: Boolean = true
) {
val selfDeletionTimerState = rememberSelfDeletionTimer(message.header.messageStatus.expirationStatus)
if (
selfDeletionTimerState is SelfDeletionTimerHelper.SelfDeletionTimerState.Expirable &&
!message.isPending &&
!message.sendingFailed
) {
selfDeletionTimerState.startDeletionTimer(
selfDeletionTimerState.StartDeletionTimer(
message = message,
assetTransferStatus = assetStatus,
onStartMessageSelfDeletion = onSelfDeletingMessageRead
onSelfDeletingMessageRead = onSelfDeletingMessageRead
)
}
Row(
Modifier
modifier
.customizeMessageBackground(
defaultBackgroundColor,
message.sendingFailed,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ import com.wire.android.ui.theme.wireColorScheme
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.launchGeoIntent
import com.wire.kalium.logic.data.asset.AssetTransferStatus
import com.wire.kalium.logic.data.asset.isSaved
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.user.UserId
import kotlinx.collections.immutable.PersistentMap
Expand All @@ -127,6 +126,7 @@ fun RegularMessageItem(
onOpenProfile: (String) -> Unit,
onReactionClicked: (String, String) -> Unit,
onResetSessionClicked: (senderUserId: UserId, clientId: String?) -> Unit,
modifier: Modifier = Modifier,
searchQuery: String = "",
showAuthor: Boolean = true,
assetStatus: AssetTransferStatus? = null,
Expand All @@ -145,7 +145,8 @@ fun RegularMessageItem(
@Composable
fun messageContent() {
MessageItemTemplate(
showAuthor,
modifier = modifier,
showAuthor = showAuthor,
useSmallBottomPadding = useSmallBottomPadding,
fullAvatarOuterPadding = dimensions().avatarClickablePadding + dimensions().avatarStatusBorderSize,
leading = {
Expand All @@ -165,7 +166,7 @@ fun RegularMessageItem(
Spacer(modifier = Modifier.height(dimensions().spacing4x))
}
if (selfDeletionTimerState is SelfDeletionTimerHelper.SelfDeletionTimerState.Expirable) {
MessageExpireLabel(messageContent, assetStatus, selfDeletionTimerState.timeLeftFormatted)
MessageExpireLabel(messageContent, selfDeletionTimerState.timeLeftFormatted)

// if the message is marked as deleted and is [SelfDeletionTimer.SelfDeletionTimerState.Expirable]
// the deletion responsibility belongs to the receiver, therefore we need to wait for the receiver
Expand Down Expand Up @@ -445,7 +446,11 @@ private fun UIMessage.Regular.MessageContentAndStatus(
}

@Composable
fun EphemeralMessageExpiredLabel(isSelfMessage: Boolean, conversationDetailsData: ConversationDetailsData) {
fun EphemeralMessageExpiredLabel(
isSelfMessage: Boolean,
conversationDetailsData: ConversationDetailsData,
modifier: Modifier = Modifier,
) {

val stringResource = if (!isSelfMessage) {
stringResource(id = R.string.label_information_waiting_for_deleation_when_self_not_sender)
Expand All @@ -461,56 +466,21 @@ fun EphemeralMessageExpiredLabel(isSelfMessage: Boolean, conversationDetailsData
}

Text(
modifier = modifier,
text = stringResource,
style = typography().body05
)
}

@Composable
fun MessageExpireLabel(messageContent: UIMessageContent?, assetTransferStatus: AssetTransferStatus?, timeLeft: String) {
fun MessageExpireLabel(messageContent: UIMessageContent?, timeLeft: String) {
when (messageContent) {
is UIMessageContent.Location,
is UIMessageContent.TextMessage -> {
StatusBox(statusText = stringResource(R.string.self_deleting_message_time_left, timeLeft))
}

is UIMessageContent.AssetMessage -> {
StatusBox(
statusText = if (assetTransferStatus.isSaved()) {
stringResource(
R.string.self_deleting_message_time_left,
timeLeft
)
} else {
stringResource(R.string.self_deleting_message_label, timeLeft)
}
)
}

is UIMessageContent.AudioAssetMessage -> {
StatusBox(
statusText = if (assetTransferStatus.isSaved()) {
stringResource(
R.string.self_deleting_message_time_left,
timeLeft
)
} else {
stringResource(R.string.self_deleting_message_label, timeLeft)
}
)
}

is UIMessageContent.TextMessage,
is UIMessageContent.AssetMessage,
is UIMessageContent.AudioAssetMessage,
is UIMessageContent.ImageMessage -> {
StatusBox(
statusText = if (assetTransferStatus.isSaved()) {
stringResource(
R.string.self_deleting_message_time_left,
timeLeft
)
} else {
stringResource(R.string.self_deleting_message_label, timeLeft)
}
)
StatusBox(statusText = stringResource(R.string.self_deleting_message_time_left, timeLeft))
}

is UIMessageContent.Deleted -> {
Expand Down

0 comments on commit e916225

Please sign in to comment.