@@ -21,6 +21,7 @@ import androidx.lifecycle.ViewModel
2121import androidx.lifecycle.ViewModelProvider
2222import androidx.lifecycle.asLiveData
2323import androidx.lifecycle.viewModelScope
24+ import com.google.android.play.core.appupdate.AppUpdateInfo
2425import com.google.android.play.core.appupdate.AppUpdateManager
2526import com.google.android.play.core.ktx.AppUpdateResult
2627import com.google.android.play.core.ktx.clientVersionStalenessDays
@@ -34,20 +35,32 @@ import kotlinx.coroutines.channels.BroadcastChannel
3435import kotlinx.coroutines.channels.Channel
3536import kotlinx.coroutines.flow.asFlow
3637import kotlinx.coroutines.flow.catch
38+ import kotlinx.coroutines.flow.onEach
3739import kotlinx.coroutines.launch
3840
3941/* *
4042 * ViewModel for InAppUpdates.
4143 */
4244@OptIn(ExperimentalCoroutinesApi ::class , FlowPreview ::class )
4345class UpdateViewModel @Keep constructor(manager : AppUpdateManager ) : ViewModel() {
44- val updateStatus = manager.requestUpdateFlow().catch {
45- _events .send(Event .ToastEvent (" Update info not available" ))
46- }.asLiveData()
46+ val updateStatus = manager.requestUpdateFlow()
47+ .catch {
48+ _events .send(Event .ToastEvent (" Update info not available" ))
49+ }
50+ .asLiveData()
4751
4852 private val _events = BroadcastChannel <Event >(Channel .BUFFERED )
4953 val events = _events .asFlow()
5054
55+ fun shouldLaunchImmediateUpdate (updateInfo : AppUpdateInfo ): Boolean {
56+ with (updateInfo) {
57+ return isImmediateUpdateAllowed
58+ &&
59+ (clientVersionStalenessDays ? : 0 > 30
60+ || updatePriority > 4 )
61+ }
62+ }
63+
5164 fun invokeUpdate () {
5265 when (val updateResult = updateStatus.value) {
5366 AppUpdateResult .NotAvailable -> viewModelScope.launch {
@@ -56,20 +69,20 @@ class UpdateViewModel @Keep constructor(manager: AppUpdateManager) : ViewModel()
5669 is AppUpdateResult .Available -> {
5770 with (updateResult.updateInfo) {
5871 Log .d(TAG , " Update priority: $updatePriority " )
59- if (isImmediateUpdateAllowed
60- &&
61- (clientVersionStalenessDays ? : 0 > 7
62- || updatePriority > 4 )
63- ) {
64- viewModelScope.launch {
65- _events .send(Event .StartUpdateEvent (updateResult.updateInfo, true ))
72+ when {
73+ shouldLaunchImmediateUpdate(this ) -> {
74+ viewModelScope.launch {
75+ _events .send(Event .StartUpdateEvent (updateResult.updateInfo, true ))
76+ }
77+ }
78+ isFlexibleUpdateAllowed -> {
79+ viewModelScope.launch {
80+ _events .send(Event .StartUpdateEvent (updateResult.updateInfo, false ))
81+ }
6682 }
67- } else if (isFlexibleUpdateAllowed) {
68- viewModelScope.launch {
69- _events .send(Event .StartUpdateEvent (updateResult.updateInfo, false ))
83+ else -> {
84+ throw IllegalStateException (" Not implemented: Handling for $this " )
7085 }
71- } else {
72- throw IllegalStateException (" Not implemented: Handling for $this " )
7386 }
7487 }
7588 }
0 commit comments