diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferNavHost.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferNavHost.kt index 1929e0861..8a25375cb 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferNavHost.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferNavHost.kt @@ -53,7 +53,7 @@ fun NewTransferNavHost(navController: NavHostController, closeActivity: () -> Un navController.navigate(UploadSuccessDestination(args.transferType, transferUrl)) }, navigateToUploadError = { navController.navigate(UploadErrorDestination) }, - closeActivity = closeActivity, + navigateBackToImportFiles = { navController.popBackStack(route = ImportFilesDestination, inclusive = false) }, ) } composable { diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt index addfb860f..86cd5e1ad 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/importfiles/ImportFilesScreen.kt @@ -155,8 +155,11 @@ private fun HandleSendActionResult( LaunchedEffect(sendStatus()) { when (val actionResult = sendStatus()) { is SendStatus.Success -> { - navigateToUploadProgress(transferType(), actionResult.totalSize) + // If the user cancels the transfer while in UploadProgress, we're gonna popBackStack to ImportFiles. + // If we don't reset the ImportFiles state machine, we'll automatically navigate-back to UploadProgress again. + // So, before leaving ImportFiles to go to UploadProgress, we need to reset the ImportFiles state machine. resetSendActionResult() + navigateToUploadProgress(transferType(), actionResult.totalSize) } is SendStatus.Refused -> { snackbarHostState.showSnackbar(context.getString(R.string.errorAppIntegrity)) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt index 5c6a292db..69ad7570d 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt @@ -49,7 +49,7 @@ fun UploadProgressScreen( totalSizeInBytes: Long, navigateToUploadSuccess: (String) -> Unit, navigateToUploadError: () -> Unit, - closeActivity: () -> Unit, + navigateBackToImportFiles: () -> Unit, uploadProgressViewModel: UploadProgressViewModel = hiltViewModel(), ) { val uiState by uploadProgressViewModel.transferProgressUiState.collectAsStateWithLifecycle() @@ -66,7 +66,7 @@ fun UploadProgressScreen( uploadProgressViewModel.trackUploadProgress() } - HandleProgressState({ uiState }, navigateToUploadSuccess, navigateToUploadError) + HandleProgressState({ uiState }, navigateToUploadSuccess, navigateToUploadError, navigateBackToImportFiles) UploadProgressScreen( progressState = { uiState }, @@ -74,10 +74,7 @@ fun UploadProgressScreen( totalSizeInBytes = totalSizeInBytes, showBottomSheet = GetSetCallbacks(get = { showBottomSheet }, set = { showBottomSheet = it }), adScreenType = adScreenType, - onCancel = { - uploadProgressViewModel.cancelUpload() - closeActivity() - } + onCancel = { uploadProgressViewModel.cancelUpload() } ) } @@ -86,12 +83,14 @@ private fun HandleProgressState( uiState: () -> UploadProgressUiState, navigateToUploadSuccess: (String) -> Unit, navigateToUploadError: () -> Unit, + navigateBackToImportFiles: () -> Unit, ) { val currentUiState = uiState() LaunchedEffect(uiState()) { when (currentUiState) { is UploadProgressUiState.Success -> navigateToUploadSuccess(currentUiState.transferUrl) is UploadProgressUiState.Error -> navigateToUploadError() + is UploadProgressUiState.Cancel -> navigateBackToImportFiles() else -> Unit } } @@ -129,7 +128,15 @@ private fun UploadProgressScreen( Spacer(Modifier.height(Margin.Huge)) } - if (showBottomSheet.get()) CancelUploadBottomSheet(onCancel = onCancel, closeButtonSheet = { showBottomSheet.set(false) }) + if (showBottomSheet.get()) { + CancelUploadBottomSheet( + onCancel = { + onCancel() + showBottomSheet.set(false) + }, + closeButtonSheet = { showBottomSheet.set(false) }, + ) + } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt b/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt index db0085152..81444e5b2 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt @@ -124,7 +124,8 @@ class UploadWorker @AssistedInject constructor( return@mapLatest when (workInfo.state) { State.RUNNING -> UploadProgressUiState.Progress(workInfo.progress).also { lastUploadedSize = it.uploadedSize } State.SUCCEEDED -> UploadProgressUiState.Success.create(workInfo.outputData, sharedApiUrlCreator) - State.FAILED, State.CANCELLED -> UploadProgressUiState.Error(lastUploadedSize) + State.FAILED -> UploadProgressUiState.Error(lastUploadedSize) + State.CANCELLED -> UploadProgressUiState.Cancel() else -> UploadProgressUiState.Default(lastUploadedSize) } ?: UploadProgressUiState.Error(lastUploadedSize) }.filterNotNull() @@ -138,7 +139,7 @@ class UploadWorker @AssistedInject constructor( sealed class UploadProgressUiState(open val uploadedSize: Long) { @Immutable - data class Default(override val uploadedSize: Long = 0) : UploadProgressUiState(uploadedSize) + data class Default(override val uploadedSize: Long = 0L) : UploadProgressUiState(uploadedSize) @Immutable data class Progress(override val uploadedSize: Long) : UploadProgressUiState(uploadedSize) { @@ -159,7 +160,10 @@ class UploadWorker @AssistedInject constructor( } @Immutable - data class Error(override val uploadedSize: Long = 0) : UploadProgressUiState(uploadedSize) + data class Error(override val uploadedSize: Long = 0L) : UploadProgressUiState(uploadedSize) + + @Immutable + data class Cancel(override val uploadedSize: Long = 0L) : UploadProgressUiState(uploadedSize) } companion object {