secant-android-wallet/ui-lib/src/main/java/co/electriccoin/zcash/ui/screen/update/viewmodel/UpdateViewModel.kt

83 lines
2.9 KiB
Kotlin

package co.electriccoin.zcash.ui.screen.update.viewmodel
import android.app.Activity
import android.app.Application
import androidx.activity.ComponentActivity
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import cash.z.ecc.android.sdk.ext.onFirst
import co.electriccoin.zcash.ui.screen.update.AppUpdateChecker
import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo
import co.electriccoin.zcash.ui.screen.update.model.UpdateState
import com.google.android.play.core.appupdate.AppUpdateInfo
import com.google.android.play.core.install.model.ActivityResult
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
class UpdateViewModel(
application: Application,
updateInfo: UpdateInfo,
private val appUpdateChecker: AppUpdateChecker
) : AndroidViewModel(application) {
val updateInfo: MutableStateFlow<UpdateInfo> = MutableStateFlow(updateInfo)
fun checkForAppUpdate() {
viewModelScope.launch {
appUpdateChecker.newCheckForUpdateAvailabilityFlow(
getApplication()
).onFirst { newInfo ->
updateInfo.value = newInfo
}
}
}
fun goForUpdate(
activity: ComponentActivity,
appUpdateInfo: AppUpdateInfo
) {
if (updateInfo.value.state == UpdateState.Running) {
return
}
updateInfo.value = updateInfo.value.copy(state = UpdateState.Running)
viewModelScope.launch {
appUpdateChecker.newStartUpdateFlow(
activity,
appUpdateInfo
).onFirst { resultCode ->
val state = when (resultCode) {
Activity.RESULT_OK -> UpdateState.Done
Activity.RESULT_CANCELED -> UpdateState.Canceled
ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> UpdateState.Failed
else -> UpdateState.Prepared
}
updateInfo.value = updateInfo.value.copy(state = state)
}
}
}
fun remindLater() {
// for mvp we just return user back to the previous screen
updateInfo.value = updateInfo.value.copy(state = UpdateState.Canceled)
}
@Suppress("UNCHECKED_CAST")
class UpdateViewModelFactory(
private val application: Application,
private val updateInfo: UpdateInfo,
private val appUpdateChecker: AppUpdateChecker
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return if (modelClass.isAssignableFrom(UpdateViewModel::class.java)) {
UpdateViewModel(application, updateInfo, appUpdateChecker) as T
} else {
throw IllegalArgumentException("ViewModel Not Found.")
}
}
}
}