Skip to content

Commit

Permalink
fix: self-deleting asset message timer [WPB-1807] πŸ’ (#3470)
Browse files Browse the repository at this point in the history
  • Loading branch information
saleniuk authored Sep 26, 2024
1 parent da7c22a commit e49ce58
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 105 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 @@ -65,10 +65,9 @@ fun MessageContainerItem(
!message.isPending &&
!message.sendingFailed
) {
selfDeletionTimerState.startDeletionTimer(
selfDeletionTimerState.StartDeletionTimer(
message = message,
assetTransferStatus = assetStatus,
onStartMessageSelfDeletion = onSelfDeletingMessageRead
onSelfDeletingMessageRead = onSelfDeletingMessageRead
)
}
Row(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,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 kotlin.math.absoluteValue
import kotlin.math.min

Expand Down Expand Up @@ -171,7 +170,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 @@ -466,52 +465,16 @@ fun EphemeralMessageExpiredLabel(
}

@Composable
fun MessageExpireLabel(messageContent: UIMessageContent?, assetTransferStatus: AssetTransferStatus?, timeLeft: String) {
fun MessageExpireLabel(messageContent: UIMessageContent?, timeLeft: String) {
when (messageContent) {
is UIMessageContent.Location,
is UIMessageContent.AssetMessage,
is UIMessageContent.AudioAssetMessage,
is UIMessageContent.ImageMessage,
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.ImageMessage -> {
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.Deleted -> {
val context = LocalContext.current

Expand Down
2 changes: 1 addition & 1 deletion kalium
Submodule kalium updated 38 files
+2 βˆ’2 .github/workflows/gradle-android-instrumented-tests.yml
+2 βˆ’2 .github/workflows/gradle-android-unit-tests.yml
+2 βˆ’2 .github/workflows/gradle-ios-tests.yml
+2 βˆ’2 .github/workflows/gradle-jvm-tests.yml
+11 βˆ’5 cryptography/src/androidMain/kotlin/com/wire/kalium/cryptography/ProteusClientCryptoBoxImpl.kt
+13 βˆ’9 cryptography/src/appleMain/kotlin/com/wire/kalium/cryptography/ProteusClientCoreCryptoImpl.kt
+7 βˆ’2 cryptography/src/commonJvmAndroid/kotlin/com.wire.kalium.cryptography/ProteusClientCoreCryptoImpl.kt
+11 βˆ’1 cryptography/src/commonMain/kotlin/com/wire/kalium/cryptography/ProteusClient.kt
+59 βˆ’23 cryptography/src/commonTest/kotlin/com/wire/kalium/cryptography/ProteusClientTest.kt
+5 βˆ’4 cryptography/src/jsMain/kotlin/com/wire/kalium/cryptography/ProteusClientCryptoBoxImpl.kt
+9 βˆ’9 cryptography/src/jvmMain/kotlin/com/wire/kalium/cryptography/ProteusClientCryptoBoxImpl.kt
+1 βˆ’1 data/src/commonMain/kotlin/com/wire/kalium/logic/data/message/AssetContent.kt
+0 βˆ’5 logic/src/androidInstrumentedTest/kotlin/com/wire/kalium/logic/feature/call/CallManagerTest.kt
+0 βˆ’2 logic/src/appleMain/kotlin/com/wire/kalium/logic/feature/call/GlobalCallManager.kt
+1 βˆ’8 logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/CallManagerImpl.kt
+0 βˆ’3 logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/GlobalCallManager.kt
+8 βˆ’8 logic/src/commonJvmAndroid/kotlin/com/wire/kalium/logic/feature/call/scenario/OnCloseCall.kt
+1 βˆ’58 logic/src/commonMain/kotlin/com/wire/kalium/logic/data/call/CallHelper.kt
+0 βˆ’1 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt
+6 βˆ’1 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/asset/ScheduleNewAssetMessageUseCase.kt
+79 βˆ’10 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/asset/ValidateAssetFileTypeUseCase.kt
+0 βˆ’2 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/call/GlobalCallManager.kt
+27 βˆ’27 ...otlin/com/wire/kalium/logic/feature/message/ephemeral/DeleteEphemeralMessageForSelfUserAsReceiverUseCase.kt
+18 βˆ’23 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/EphemeralMessageDeletionHandler.kt
+1 βˆ’0 logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/ephemeral/SelfDeletionEventLogger.kt
+81 βˆ’21 logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/asset/AssetMessageHandler.kt
+34 βˆ’35 logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/NewMessageEventHandler.kt
+55 βˆ’33 logic/src/commonMain/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ProteusMessageUnpacker.kt
+1 βˆ’112 logic/src/commonTest/kotlin/com/wire/kalium/logic/data/call/CallHelperTest.kt
+66 βˆ’25 ...tlin/com/wire/kalium/logic/data/message/ephemeral/DeleteEphemeralMessageForSelfUserAsReceiverUseCaseTest.kt
+15 βˆ’3 logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/asset/ScheduleNewAssetMessageUseCaseTest.kt
+29 βˆ’13 logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/asset/ValidateAssetFileTypeUseCaseTest.kt
+22 βˆ’16 ...rc/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/NewMessageEventHandlerTest.kt
+9 βˆ’5 ...rc/commonTest/kotlin/com/wire/kalium/logic/sync/receiver/conversation/message/ProteusMessageUnpackerTest.kt
+1 βˆ’7 logic/src/jvmTest/kotlin/com/wire/kalium/logic/feature/call/scenario/OnCloseCallTest.kt
+116 βˆ’9 logic/src/jvmTest/kotlin/com/wire/kalium/logic/sync/receiver/asset/AssetMessageHandlerTest.kt
+2 βˆ’4 persistence/src/commonMain/db_user/com/wire/kalium/persistence/Messages.sq
+11 βˆ’2 persistence/src/commonTest/kotlin/com/wire/kalium/persistence/dao/message/MessageDAOTest.kt

0 comments on commit e49ce58

Please sign in to comment.