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

104 lines
3.0 KiB
Kotlin

package co.electriccoin.zcash.ui.screen.update
import android.content.Context
import androidx.activity.ComponentActivity
import androidx.activity.viewModels
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import co.electriccoin.zcash.ui.MainActivity
import co.electriccoin.zcash.ui.R
import co.electriccoin.zcash.ui.screen.update.model.UpdateInfo
import co.electriccoin.zcash.ui.screen.update.model.UpdateState
import co.electriccoin.zcash.ui.screen.update.util.PlayStoreUtil
import co.electriccoin.zcash.ui.screen.update.view.Update
import co.electriccoin.zcash.ui.screen.update.viewmodel.UpdateViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@Composable
internal fun MainActivity.WrapUpdate(
updateInfo: UpdateInfo
) {
WrapUpdate(
activity = this,
inputUpdateInfo = updateInfo
)
}
@Composable
internal fun WrapUpdate(
activity: ComponentActivity,
inputUpdateInfo: UpdateInfo
) {
val viewModel by activity.viewModels<UpdateViewModel> {
UpdateViewModel.UpdateViewModelFactory(
activity.application,
inputUpdateInfo,
AppUpdateCheckerImp.new()
)
}
val snackbarHostState = remember { SnackbarHostState() }
val scope = rememberCoroutineScope()
val updateInfo = viewModel.updateInfo.collectAsState().value
when (updateInfo.state) {
UpdateState.Done, UpdateState.Canceled -> {
// just return as we are already in Home compose
return
}
UpdateState.Failed -> {
// we need to refresh AppUpdateInfo object, as it can be used only once
viewModel.checkForAppUpdate()
}
UpdateState.Prepared, UpdateState.Running -> {
// valid stages
}
}
Update(
snackbarHostState,
updateInfo,
onDownload = {
// in this state of the update we have the AppUpdateInfo filled
requireNotNull(updateInfo.appUpdateInfo)
viewModel.goForUpdate(
activity,
updateInfo.appUpdateInfo
)
},
onLater = {
viewModel.remindLater()
},
onReference = {
openPlayStoreAppPage(
activity.applicationContext,
snackbarHostState,
scope
)
}
)
}
fun openPlayStoreAppPage(
context: Context,
snackbarHostState: SnackbarHostState,
scope: CoroutineScope
) {
val storeIntent = PlayStoreUtil.newActivityIntent(context)
runCatching {
context.startActivity(storeIntent)
}.onFailure {
scope.launch {
snackbarHostState.showSnackbar(
message = context.getString(R.string.update_unable_to_open_play_store)
)
}
}
}