Skip to content

Commit

Permalink
feat: When cancelling the uploading transfer, we're going back to Imp…
Browse files Browse the repository at this point in the history
…ortFiles instead of closing Activity (#257)
  • Loading branch information
KevinBoulongne authored Dec 20, 2024
2 parents 77dbccd + 37e8fc2 commit e5c5633
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<UploadSuccessDestination> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,14 @@ private fun HandleSendActionResult(
val errorMessage = stringResource(R.string.errorUnknown)
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(errorMessage)
resetSendActionResult()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ fun UploadProgressScreen(
totalSizeInBytes: Long,
navigateToUploadSuccess: (String) -> Unit,
navigateToUploadError: () -> Unit,
closeActivity: () -> Unit,
navigateBackToImportFiles: () -> Unit,
uploadProgressViewModel: UploadProgressViewModel = hiltViewModel<UploadProgressViewModel>(),
) {
val uiState by uploadProgressViewModel.transferProgressUiState.collectAsStateWithLifecycle()
Expand All @@ -66,18 +66,15 @@ fun UploadProgressScreen(
uploadProgressViewModel.trackUploadProgress()
}

HandleProgressState({ uiState }, navigateToUploadSuccess, navigateToUploadError)
HandleProgressState({ uiState }, navigateToUploadSuccess, navigateToUploadError, navigateBackToImportFiles)

UploadProgressScreen(
progressState = { uiState },
isNetworkAvailable = { isNetworkAvailable },
totalSizeInBytes = totalSizeInBytes,
showBottomSheet = GetSetCallbacks(get = { showBottomSheet }, set = { showBottomSheet = it }),
adScreenType = adScreenType,
onCancel = {
uploadProgressViewModel.cancelUpload()
closeActivity()
}
onCancel = { uploadProgressViewModel.cancelUpload() }
)
}

Expand All @@ -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
}
}
Expand Down Expand Up @@ -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) },
)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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) {
Expand All @@ -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 {
Expand Down

0 comments on commit e5c5633

Please sign in to comment.