From af8e51c5a38cba2ed6d2a0d52452a62a0f244e2c Mon Sep 17 00:00:00 2001 From: Diamond <33725716+DiamondMiner88@users.noreply.github.com> Date: Sat, 5 Nov 2022 11:30:35 -0700 Subject: [PATCH] fix: cancel install job on viewmodel clear --- .../manager/ui/screen/InstallScreen.kt | 4 +- .../manager/ui/viewmodel/InstallViewModel.kt | 51 +++++++++---------- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt b/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt index cecab1f..523d157 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/screen/InstallScreen.kt @@ -50,10 +50,10 @@ fun InstallerScreen( onBackClick: () -> Unit, viewModel: InstallViewModel = getViewModel(parameters = { parametersOf(installData) }) ) { - val navigateMain by viewModel.returnToHome.collectAsState(initial = false) - if (navigateMain) onBackClick() + if (viewModel.returnToHome) onBackClick() var expandedGroup by mutableStateOf(null) + LaunchedEffect(viewModel.currentStep) { expandedGroup = viewModel.currentStep?.group } diff --git a/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt b/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt index 0c256cc..4c1933a 100644 --- a/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt +++ b/app/src/main/kotlin/com/aliucord/manager/ui/viewmodel/InstallViewModel.kt @@ -14,7 +14,6 @@ import com.aliucord.manager.domain.manager.PreferencesManager import com.aliucord.manager.domain.repository.AliucordMavenRepository import com.aliucord.manager.domain.repository.GithubRepository import com.aliucord.manager.installer.util.* -import com.aliucord.manager.network.utils.fold import com.aliucord.manager.network.utils.getOrThrow import com.aliucord.manager.ui.component.installer.InstallStatus import com.aliucord.manager.ui.component.installer.InstallStepData @@ -23,9 +22,6 @@ import com.aliucord.manager.ui.screen.InstallData import com.aliucord.manager.util.* import com.github.diamondminer88.zip.* import kotlinx.coroutines.* -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.asSharedFlow -import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.atomic.AtomicBoolean @@ -41,11 +37,9 @@ class InstallViewModel( private val installData: InstallData ) : ViewModel() { private val externalCacheDir = application.externalCacheDir!! - private val installationRunning = AtomicBoolean(false) - private val _returnToHome = MutableSharedFlow() - val returnToHome = _returnToHome.asSharedFlow() + var returnToHome by mutableStateOf(false) var stacktrace by mutableStateOf("") private set @@ -83,29 +77,34 @@ class InstallViewModel( application.saveFile(name, "$debugInfo\n\n$stacktrace") } - init { - viewModelScope.launch(Dispatchers.Main) { - if (installationRunning.getAndSet(true)) { - return@launch - } + private val installJob = viewModelScope.launch(Dispatchers.Main) { + if (installationRunning.getAndSet(true)) { + return@launch + } - withContext(Dispatchers.IO) { - try { - when (installData.discordType) { - DiscordType.REACT_NATIVE -> installReactNative() - DiscordType.KOTLIN -> installKotlin() - } - delay(5000) - _returnToHome.emit(true) - } catch (t: Throwable) { - Log.e( - BuildConfig.TAG, - "$debugInfo\n\n${Log.getStackTraceString(t)}" - ) + withContext(Dispatchers.IO) { + try { + when (installData.discordType) { + DiscordType.REACT_NATIVE -> installReactNative() + DiscordType.KOTLIN -> installKotlin() } - installationRunning.set(false) + delay(20000) + returnToHome = true + } catch (t: Throwable) { + Log.e( + BuildConfig.TAG, + "$debugInfo\n\n${Log.getStackTraceString(t)}" + ) } + + installationRunning.set(false) + } + } + + override fun onCleared() { + if (installationRunning.getAndSet(false)) { + installJob.cancel("ViewModel cleared") } }