fix: restore backup JobCancellationException on Activity relaunch
Move restore coroutine from rememberCoroutineScope() to viewModelScope so it survives Activity recreation during config changes.
This commit is contained in:
@@ -169,18 +169,24 @@ fun BackupConfigScreen(
|
|||||||
uri?.let {
|
uri?.let {
|
||||||
showLoadingDialog = true
|
showLoadingDialog = true
|
||||||
loadingText = context.getString(R.string.on_restore)
|
loadingText = context.getString(R.string.on_restore)
|
||||||
|
viewModel.restore(
|
||||||
|
context = context,
|
||||||
|
uri = uri,
|
||||||
|
onSuccess = {
|
||||||
|
showLoadingDialog = false
|
||||||
scope.launch {
|
scope.launch {
|
||||||
try {
|
|
||||||
Restore.restore(context, uri)
|
|
||||||
showLoadingDialog = false
|
|
||||||
snackbarHostState.showSnackbar(context.getString(R.string.restore_success))
|
snackbarHostState.showSnackbar(context.getString(R.string.restore_success))
|
||||||
} catch (e: Exception) {
|
}
|
||||||
|
},
|
||||||
|
onError = { error ->
|
||||||
showLoadingDialog = false
|
showLoadingDialog = false
|
||||||
|
scope.launch {
|
||||||
snackbarHostState.showSnackbar(
|
snackbarHostState.showSnackbar(
|
||||||
context.getString(R.string.restore_fail_with_error, e.localizedMessage)
|
context.getString(R.string.restore_fail_with_error, error)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
package io.legado.app.ui.config.backupConfig
|
package io.legado.app.ui.config.backupConfig
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import io.legado.app.R
|
import io.legado.app.R
|
||||||
import io.legado.app.domain.usecase.WebDavBackupUseCase
|
import io.legado.app.domain.usecase.WebDavBackupUseCase
|
||||||
import io.legado.app.help.storage.Backup
|
import io.legado.app.help.storage.Backup
|
||||||
|
import io.legado.app.help.storage.Restore
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -83,4 +86,19 @@ class BackupConfigViewModel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun restore(context: Context, uri: Uri, onSuccess: () -> Unit, onError: (String) -> Unit) {
|
||||||
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
Restore.restore(context, uri)
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
onError(e.localizedMessage ?: appCtx.getString(R.string.restore_error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user