@@ -24,7 +24,7 @@ import android.widget.Toast
24
24
import androidx.core.view.updatePaddingRelative
25
25
import androidx.fragment.app.activityViewModels
26
26
import androidx.fragment.app.viewModels
27
- import androidx.lifecycle.Observer
27
+ import androidx.lifecycle.lifecycleScope
28
28
import androidx.navigation.fragment.findNavController
29
29
import androidx.recyclerview.widget.DefaultItemAnimator
30
30
import androidx.recyclerview.widget.LinearLayoutManager
@@ -47,8 +47,12 @@ import com.google.samples.apps.iosched.ui.messages.SnackbarMessageManager
47
47
import com.google.samples.apps.iosched.ui.prefs.SnackbarPreferenceViewModel
48
48
import com.google.samples.apps.iosched.ui.schedule.ScheduleFragmentDirections.Companion.toSearch
49
49
import com.google.samples.apps.iosched.ui.schedule.ScheduleFragmentDirections.Companion.toSessionDetail
50
+ import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.NavigateToSession
51
+ import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.NavigateToSignInDialogAction
52
+ import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.NavigateToSignOutDialogAction
53
+ import com.google.samples.apps.iosched.ui.schedule.ScheduleNavigationAction.ShowScheduleUiHints
50
54
import com.google.samples.apps.iosched.ui.sessioncommon.SessionsAdapter
51
- import com.google.samples.apps.iosched.ui.setUpSnackbar
55
+ import com.google.samples.apps.iosched.ui.setupSnackbarManager
52
56
import com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment
53
57
import com.google.samples.apps.iosched.ui.signin.NotificationsPreferenceDialogFragment.Companion.DIALOG_NOTIFICATIONS_PREFERENCE
54
58
import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment
@@ -62,6 +66,7 @@ import com.google.samples.apps.iosched.widget.BubbleDecoration
62
66
import com.google.samples.apps.iosched.widget.FadingSnackbar
63
67
import com.google.samples.apps.iosched.widget.JumpSmoothScroller
64
68
import dagger.hilt.android.AndroidEntryPoint
69
+ import kotlinx.coroutines.flow.collect
65
70
import javax.inject.Inject
66
71
import javax.inject.Named
67
72
@@ -115,7 +120,7 @@ class ScheduleFragment : MainNavigationFragment() {
115
120
inflater : LayoutInflater ,
116
121
container : ViewGroup ? ,
117
122
savedInstanceState : Bundle ?
118
- ): View ? {
123
+ ): View {
119
124
binding = FragmentScheduleBinding .inflate(inflater, container, false ).apply {
120
125
lifecycleOwner = viewLifecycleOwner
121
126
viewModel = scheduleViewModel
@@ -146,8 +151,8 @@ class ScheduleFragment : MainNavigationFragment() {
146
151
}
147
152
148
153
// Snackbar configuration
149
- setUpSnackbar (
150
- scheduleViewModel.snackBarMessage , snackbar, snackbarMessageManager ,
154
+ setupSnackbarManager (
155
+ snackbarMessageManager , snackbar,
151
156
actionClickListener = {
152
157
snackbarPrefsViewModel.onStopClicked()
153
158
}
@@ -193,18 +198,14 @@ class ScheduleFragment : MainNavigationFragment() {
193
198
dayIndicatorRecyclerView.adapter = dayIndicatorAdapter
194
199
195
200
// Start observing ViewModels
196
- scheduleViewModel.scheduleUiData.observe(
197
- viewLifecycleOwner,
198
- Observer {
199
- it ? : return @Observer
200
- updateScheduleUi(it)
201
- }
202
- )
201
+ viewLifecycleOwner.lifecycleScope.launchWhenStarted {
202
+ scheduleViewModel.scheduleUiData.collect { updateScheduleUi(it) }
203
+ }
203
204
204
205
// During conference, scroll to current event.
205
- scheduleViewModel.scrollToEvent.observe(
206
- viewLifecycleOwner,
207
- EventObserver { scrollEvent ->
206
+
207
+ viewLifecycleOwner.lifecycleScope.launchWhenStarted {
208
+ scheduleViewModel.scrollToEvent.collect { scrollEvent ->
208
209
if (scrollEvent.targetPosition != - 1 ) {
209
210
scheduleRecyclerView.run {
210
211
post {
@@ -219,36 +220,19 @@ class ScheduleFragment : MainNavigationFragment() {
219
220
}
220
221
}
221
222
}
222
- )
223
-
224
- scheduleViewModel.navigateToSessionAction.observe(
225
- viewLifecycleOwner,
226
- EventObserver { sessionId ->
227
- openSessionDetail(sessionId)
228
- }
229
- )
230
-
231
- scheduleViewModel.navigateToSignInDialogAction.observe(
232
- viewLifecycleOwner,
233
- EventObserver {
234
- openSignInDialog()
235
- }
236
- )
237
-
238
- scheduleViewModel.navigateToSignOutDialogAction.observe(
239
- viewLifecycleOwner,
240
- EventObserver {
241
- openSignOutDialog()
242
- }
243
- )
244
- scheduleViewModel.scheduleUiHintsShown.observe(
245
- viewLifecycleOwner,
246
- EventObserver {
247
- if (! it) {
248
- openScheduleUiHintsDialog()
223
+ }
224
+ viewLifecycleOwner.lifecycleScope.launchWhenStarted {
225
+ scheduleViewModel.navigationActions.collect {
226
+ when (it) {
227
+ is NavigateToSession -> openSessionDetail(it.sessionId)
228
+ is NavigateToSignInDialogAction -> openSignInDialog()
229
+ is NavigateToSignOutDialogAction -> openSignOutDialog()
230
+ is ShowScheduleUiHints -> openScheduleUiHintsDialog()
249
231
}
250
232
}
251
- )
233
+ }
234
+
235
+ // TODO: Migrate to StateFlow
252
236
scheduleViewModel.shouldShowNotificationsPrefAction.observe(
253
237
viewLifecycleOwner,
254
238
EventObserver {
@@ -259,13 +243,11 @@ class ScheduleFragment : MainNavigationFragment() {
259
243
)
260
244
261
245
// Show an error message
262
- scheduleViewModel.errorMessage.observe(
263
- viewLifecycleOwner,
264
- EventObserver { errorMsg ->
265
- // TODO: Change once there's a way to show errors to the user
266
- Toast .makeText(this .context, errorMsg, Toast .LENGTH_LONG ).show()
246
+ viewLifecycleOwner.lifecycleScope.launchWhenStarted {
247
+ scheduleViewModel.errorMessage.collect { errorMsg ->
248
+ Toast .makeText(context, errorMsg, Toast .LENGTH_LONG ).show()
267
249
}
268
- )
250
+ }
269
251
270
252
if (savedInstanceState == null ) {
271
253
// VM outlives the UI, so reset this flag when a new Schedule page is shown
0 commit comments