17
17
package com.google.samples.apps.iosched.ui.info
18
18
19
19
import android.net.wifi.WifiConfiguration
20
- import androidx.lifecycle.LiveData
21
- import androidx.lifecycle.MutableLiveData
22
20
import androidx.lifecycle.ViewModel
23
- import androidx.lifecycle.liveData
21
+ import androidx.lifecycle.viewModelScope
24
22
import com.google.samples.apps.iosched.R
25
23
import com.google.samples.apps.iosched.model.ConferenceWifiInfo
26
24
import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions
27
25
import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper
28
26
import com.google.samples.apps.iosched.shared.domain.logistics.LoadWifiInfoUseCase
29
- import com.google.samples.apps.iosched.shared.result.Event
30
27
import com.google.samples.apps.iosched.shared.result.data
31
- import com.google.samples.apps.iosched.shared.util.map
28
+ import com.google.samples.apps.iosched.shared.util.tryOffer
32
29
import com.google.samples.apps.iosched.ui.SnackbarMessage
30
+ import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager
31
+ import com.google.samples.apps.iosched.util.WhileViewSubscribed
33
32
import com.google.samples.apps.iosched.util.wifi.WifiInstaller
34
33
import dagger.hilt.android.lifecycle.HiltViewModel
34
+ import kotlinx.coroutines.channels.Channel
35
+ import kotlinx.coroutines.flow.SharingStarted
36
+ import kotlinx.coroutines.flow.StateFlow
37
+ import kotlinx.coroutines.flow.flow
38
+ import kotlinx.coroutines.flow.map
39
+ import kotlinx.coroutines.flow.receiveAsFlow
40
+ import kotlinx.coroutines.flow.stateIn
35
41
import javax.inject.Inject
36
42
37
43
@HiltViewModel
38
44
class EventInfoViewModel @Inject constructor(
39
45
loadWifiInfoUseCase : LoadWifiInfoUseCase ,
40
46
private val wifiInstaller : WifiInstaller ,
41
- private val analyticsHelper : AnalyticsHelper
47
+ private val analyticsHelper : AnalyticsHelper ,
48
+ private val snackbarMessageManager : SnackbarMessageManager
42
49
) : ViewModel() {
43
50
44
51
companion object {
45
52
private const val ASSISTANT_APP_URL =
46
53
" https://assistant.google.com/services/invoke/uid/0000009fca77b068"
47
54
}
48
55
49
- private val _wifiConfig = liveData { emit(loadWifiInfoUseCase(Unit )) }
50
- val wifiConfig: LiveData <ConferenceWifiInfo ?> = _wifiConfig .map { it.data }
51
- val showWifi: LiveData <Boolean > = wifiConfig.map {
52
- it?.ssid?.isNotBlank() == true && it.password.isNotBlank()
53
- }
56
+ val wifiConfig: StateFlow <ConferenceWifiInfo ?> = flow {
57
+ emit(loadWifiInfoUseCase(Unit ).data)
58
+ }.stateIn(viewModelScope, SharingStarted .Lazily , null )
54
59
55
- private val _snackbarMessage = MutableLiveData < Event < SnackbarMessage >>()
56
- val snackBarMessage : LiveData < Event < SnackbarMessage >>
57
- get() = _snackbarMessage
60
+ val showWifi : StateFlow < Boolean > = wifiConfig.map {
61
+ it?.ssid?.isNotBlank() == true && it.password.isNotBlank()
62
+ }.stateIn(viewModelScope, WhileViewSubscribed , false )
58
63
59
- private val _openUrlEvent = MutableLiveData <Event <String >>()
60
- val openUrlEvent: LiveData <Event <String >>
61
- get() = _openUrlEvent
64
+ private val _navigationActions = Channel <EventInfoNavigationAction >(Channel .CONFLATED )
65
+ val navigationActions = _navigationActions .receiveAsFlow()
62
66
63
67
fun onWifiConnect () {
64
68
val config = wifiConfig.value ? : return
@@ -76,12 +80,16 @@ class EventInfoViewModel @Inject constructor(
76
80
)
77
81
}
78
82
79
- _snackbarMessage .postValue( Event ( snackbarMessage) )
83
+ snackbarMessageManager.addMessage( snackbarMessage)
80
84
analyticsHelper.logUiEvent(" Events" , AnalyticsActions .WIFI_CONNECT )
81
85
}
82
86
83
87
fun onClickAssistantApp () {
84
- _openUrlEvent .value = Event ( ASSISTANT_APP_URL )
88
+ _navigationActions .tryOffer( EventInfoNavigationAction . OpenUrl ( ASSISTANT_APP_URL ) )
85
89
analyticsHelper.logUiEvent(" Assistant App" , AnalyticsActions .CLICK )
86
90
}
87
91
}
92
+
93
+ sealed class EventInfoNavigationAction {
94
+ data class OpenUrl (val url : String ) : EventInfoNavigationAction()
95
+ }
0 commit comments