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 6c04aad2e..cee05be8e 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() }, ) } 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 0001d1354..8960c916b 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 @@ -153,7 +153,14 @@ private fun HandleSendActionResult( LaunchedEffect(getSendActionResult()) { when (val actionResult = getSendActionResult()) { - is SendActionResult.Success -> navigateToUploadProgress(transferType(), actionResult.totalSize) + is SendActionResult.Success -> { + // 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. + // TODO: Maybe merging the 2 screens state machines into 1 could help simplify this ? + resetSendActionResult() + navigateToUploadProgress(transferType(), actionResult.totalSize) + } is SendActionResult.Failure -> { snackbarHostState.showSnackbar(context.getString(R.string.errorUnknown)) resetSendActionResult() 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 855c6236c..ad0710b40 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/workers/UploadWorker.kt @@ -123,7 +123,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() @@ -137,7 +138,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) { @@ -158,7 +159,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 {