Skip to content
This repository was archived by the owner on Jan 5, 2023. It is now read-only.

Commit 507726f

Browse files
author
Manuel Vivo
committed
Migrate EventInfo to flows
Fixes: b/186633011 Change-Id: I85966e91eca7cfae1be0f07bc7b71fe03c1d1569
1 parent 443da8b commit 507726f

File tree

2 files changed

+42
-30
lines changed

2 files changed

+42
-30
lines changed

mobile/src/main/java/com/google/samples/apps/iosched/ui/info/EventFragment.kt

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,18 @@ import androidx.core.view.updatePaddingRelative
2929
import androidx.databinding.BindingAdapter
3030
import androidx.fragment.app.Fragment
3131
import androidx.fragment.app.viewModels
32-
import androidx.lifecycle.Observer
3332
import com.google.samples.apps.iosched.R
3433
import com.google.samples.apps.iosched.databinding.FragmentInfoEventBinding
3534
import com.google.samples.apps.iosched.model.ConferenceWifiInfo
3635
import com.google.samples.apps.iosched.shared.di.AssistantAppEnabledFlag
3736
import com.google.samples.apps.iosched.shared.util.TimeUtils
3837
import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager
39-
import com.google.samples.apps.iosched.ui.setUpSnackbar
38+
import com.google.samples.apps.iosched.ui.setupSnackbarManager
4039
import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
40+
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
4141
import com.google.samples.apps.iosched.widget.FadingSnackbar
4242
import dagger.hilt.android.AndroidEntryPoint
43+
import kotlinx.coroutines.flow.collect
4344
import javax.inject.Inject
4445

4546
@AndroidEntryPoint
@@ -73,20 +74,23 @@ class EventFragment : Fragment() {
7374
}
7475

7576
val snackbarLayout = requireActivity().findViewById<FadingSnackbar>(R.id.snackbar)
76-
setUpSnackbar(eventInfoViewModel.snackBarMessage, snackbarLayout, snackbarMessageManager)
77+
setupSnackbarManager(snackbarMessageManager, snackbarLayout) { }
7778

7879
return binding.root
7980
}
8081

81-
override fun onActivityCreated(savedInstanceState: Bundle?) {
82-
super.onActivityCreated(savedInstanceState)
83-
eventInfoViewModel.openUrlEvent.observe(
84-
viewLifecycleOwner,
85-
Observer {
86-
val url = it?.getContentIfNotHandled() ?: return@Observer
87-
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
82+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
83+
super.onViewCreated(view, savedInstanceState)
84+
85+
launchAndRepeatWithViewLifecycle {
86+
eventInfoViewModel.navigationActions.collect { event ->
87+
when (event) {
88+
is EventInfoNavigationAction.OpenUrl -> {
89+
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(event.url)))
90+
}
91+
}
8892
}
89-
)
93+
}
9094
}
9195
}
9296

mobile/src/main/java/com/google/samples/apps/iosched/ui/info/EventInfoViewModel.kt

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,48 +17,52 @@
1717
package com.google.samples.apps.iosched.ui.info
1818

1919
import android.net.wifi.WifiConfiguration
20-
import androidx.lifecycle.LiveData
21-
import androidx.lifecycle.MutableLiveData
2220
import androidx.lifecycle.ViewModel
23-
import androidx.lifecycle.liveData
21+
import androidx.lifecycle.viewModelScope
2422
import com.google.samples.apps.iosched.R
2523
import com.google.samples.apps.iosched.model.ConferenceWifiInfo
2624
import com.google.samples.apps.iosched.shared.analytics.AnalyticsActions
2725
import com.google.samples.apps.iosched.shared.analytics.AnalyticsHelper
2826
import com.google.samples.apps.iosched.shared.domain.logistics.LoadWifiInfoUseCase
29-
import com.google.samples.apps.iosched.shared.result.Event
3027
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
3229
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
3332
import com.google.samples.apps.iosched.util.wifi.WifiInstaller
3433
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
3541
import javax.inject.Inject
3642

3743
@HiltViewModel
3844
class EventInfoViewModel @Inject constructor(
3945
loadWifiInfoUseCase: LoadWifiInfoUseCase,
4046
private val wifiInstaller: WifiInstaller,
41-
private val analyticsHelper: AnalyticsHelper
47+
private val analyticsHelper: AnalyticsHelper,
48+
private val snackbarMessageManager: SnackbarMessageManager
4249
) : ViewModel() {
4350

4451
companion object {
4552
private const val ASSISTANT_APP_URL =
4653
"https://assistant.google.com/services/invoke/uid/0000009fca77b068"
4754
}
4855

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)
5459

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)
5863

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()
6266

6367
fun onWifiConnect() {
6468
val config = wifiConfig.value ?: return
@@ -76,12 +80,16 @@ class EventInfoViewModel @Inject constructor(
7680
)
7781
}
7882

79-
_snackbarMessage.postValue(Event(snackbarMessage))
83+
snackbarMessageManager.addMessage(snackbarMessage)
8084
analyticsHelper.logUiEvent("Events", AnalyticsActions.WIFI_CONNECT)
8185
}
8286

8387
fun onClickAssistantApp() {
84-
_openUrlEvent.value = Event(ASSISTANT_APP_URL)
88+
_navigationActions.tryOffer(EventInfoNavigationAction.OpenUrl(ASSISTANT_APP_URL))
8589
analyticsHelper.logUiEvent("Assistant App", AnalyticsActions.CLICK)
8690
}
8791
}
92+
93+
sealed class EventInfoNavigationAction {
94+
data class OpenUrl(val url: String) : EventInfoNavigationAction()
95+
}

0 commit comments

Comments
 (0)