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

Commit a11efc4

Browse files
committed
Migrates collections to repeatOnLifecycle and fixes use of lifecycleOwners
Change-Id: I5baeaf265bfb5de1f1311e36108c96b676943523
1 parent 7b338e9 commit a11efc4

File tree

16 files changed

+187
-157
lines changed

16 files changed

+187
-157
lines changed

mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class AgendaFragment : MainNavigationFragment() {
6666
super.onViewCreated(view, savedInstanceState)
6767

6868
binding.viewModel = viewModel
69-
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, this@AgendaFragment)
69+
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)
7070
}
7171
}
7272

mobile/src/main/java/com/google/samples/apps/iosched/ui/codelabs/CodelabsFragment.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import android.view.ViewGroup
2424
import androidx.core.view.updatePadding
2525
import androidx.fragment.app.activityViewModels
2626
import androidx.fragment.app.viewModels
27-
import kotlinx.coroutines.flow.collect
28-
import androidx.lifecycle.lifecycleScope
2927
import androidx.navigation.fragment.findNavController
3028
import androidx.recyclerview.widget.RecyclerView.RecycledViewPool
3129
import com.google.samples.apps.iosched.databinding.FragmentCodelabsBinding
@@ -37,8 +35,10 @@ import com.google.samples.apps.iosched.ui.MainActivityViewModel
3735
import com.google.samples.apps.iosched.ui.MainNavigationFragment
3836
import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem
3937
import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
38+
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
4039
import com.google.samples.apps.iosched.util.openWebsiteUri
4140
import dagger.hilt.android.AndroidEntryPoint
41+
import kotlinx.coroutines.flow.collect
4242
import javax.inject.Inject
4343
import javax.inject.Named
4444

@@ -80,7 +80,7 @@ class CodelabsFragment : MainNavigationFragment(), CodelabsActionsHandler {
8080

8181
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
8282
super.onViewCreated(view, savedInstanceState)
83-
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, this)
83+
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)
8484

8585
codelabsAdapter = CodelabsAdapter(
8686
this,
@@ -95,7 +95,7 @@ class CodelabsFragment : MainNavigationFragment(), CodelabsActionsHandler {
9595
v.updatePadding(bottom = padding.bottom + insets.systemWindowInsetBottom)
9696
}
9797

98-
lifecycleScope.launchWhenStarted {
98+
launchAndRepeatWithViewLifecycle {
9999
codelabsViewModel.codelabs.collect {
100100
codelabsAdapter.submitList(it)
101101
}

mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/AnnouncementsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class AnnouncementsFragment : MainNavigationFragment() {
6666
super.onViewCreated(view, savedInstanceState)
6767
analyticsHelper.sendScreenView("Announcements", requireActivity())
6868

69-
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, this)
69+
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)
7070

7171
binding.root.doOnApplyWindowInsets { _, insets, _ ->
7272
binding.statusBar.run {

mobile/src/main/java/com/google/samples/apps/iosched/ui/feed/FeedFragment.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import androidx.core.view.isVisible
2525
import androidx.core.view.updatePaddingRelative
2626
import androidx.fragment.app.activityViewModels
2727
import androidx.fragment.app.viewModels
28-
import androidx.lifecycle.lifecycleScope
2928
import androidx.navigation.fragment.findNavController
3029
import androidx.recyclerview.widget.RecyclerView
3130
import com.google.common.collect.ImmutableMap
@@ -44,6 +43,7 @@ import com.google.samples.apps.iosched.ui.messages.setupSnackbarManager
4443
import com.google.samples.apps.iosched.ui.signin.SignInDialogFragment
4544
import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem
4645
import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
46+
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
4747
import com.google.samples.apps.iosched.util.openWebsiteUrl
4848
import dagger.hilt.android.AndroidEntryPoint
4949
import kotlinx.coroutines.flow.collect
@@ -99,7 +99,7 @@ class FeedFragment : MainNavigationFragment() {
9999
super.onViewCreated(view, savedInstanceState)
100100
analyticsHelper.sendScreenView("Home", requireActivity())
101101

102-
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, this)
102+
binding.toolbar.setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)
103103

104104
binding.root.doOnApplyWindowInsets { _, insets, _ ->
105105
binding.statusBar.run {
@@ -131,14 +131,14 @@ class FeedFragment : MainNavigationFragment() {
131131
setupSnackbarManager(snackbarMessageManager, binding.snackbar)
132132

133133
// Observe feed
134-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
134+
launchAndRepeatWithViewLifecycle {
135135
model.feed.collect {
136136
showFeedItems(binding.recyclerView, it)
137137
}
138138
}
139139

140140
// Observe navigation events
141-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
141+
launchAndRepeatWithViewLifecycle {
142142
model.navigationActions.collect { action ->
143143
when (action) {
144144
is NavigateAction -> findNavController().navigate(action.directions)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class InfoFragment : MainNavigationFragment() {
6262
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
6363
super.onViewCreated(view, savedInstanceState)
6464
binding.run {
65-
toolbar.setupProfileMenuItem(viewModel, this@InfoFragment)
65+
toolbar.setupProfileMenuItem(viewModel, viewLifecycleOwner)
6666

6767
viewpager.offscreenPageLimit = INFO_PAGES.size
6868
viewpager.adapter = InfoAdapter(this@InfoFragment)

mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapFragment.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import androidx.core.widget.NestedScrollView
3636
import androidx.fragment.app.DialogFragment
3737
import androidx.fragment.app.activityViewModels
3838
import androidx.fragment.app.viewModels
39-
import androidx.lifecycle.Lifecycle
4039
import androidx.lifecycle.lifecycleScope
4140
import com.google.android.gms.maps.MapView
4241
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -153,10 +152,10 @@ class MapFragment : MainNavigationFragment() {
153152
fabBaseMarginBottom = binding.mapModeFab.marginBottom
154153

155154
binding.toolbar.run {
156-
setupProfileMenuItem(mainActivityViewModel, this@MapFragment)
155+
setupProfileMenuItem(mainActivityViewModel, viewLifecycleOwner)
157156

158157
menu.findItem(R.id.action_my_location)?.let { item ->
159-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
158+
launchAndRepeatWithViewLifecycle {
160159
viewModel.showMyLocationOption.collect { option ->
161160
item.isVisible = option
162161
}
@@ -229,7 +228,7 @@ class MapFragment : MainNavigationFragment() {
229228
binding.statusBar.requestLayout()
230229

231230
// Update the Map padding so that the copyright, etc is not displayed in nav bar
232-
lifecycleScope.launchWhenCreated {
231+
viewLifecycleOwner.lifecycleScope.launch {
233232
val map = binding.map.awaitMap()
234233
map.setPadding(0, 0, 0, insets.systemWindowInsetBottom)
235234
}
@@ -267,7 +266,7 @@ class MapFragment : MainNavigationFragment() {
267266
}
268267

269268
// Initialize MapView
270-
launchAndRepeatWithViewLifecycle(Lifecycle.State.CREATED) {
269+
viewLifecycleOwner.lifecycleScope.launch {
271270
mapView.awaitMap().apply {
272271
setOnMapClickListener { viewModel.dismissFeatureDetails() }
273272
setOnCameraMoveListener {

mobile/src/main/java/com/google/samples/apps/iosched/ui/map/MapViewModel.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ class MapViewModel @Inject constructor(
100100
mapVariant.collect {
101101
// When the map variant changes, the selected feature might not be present in the
102102
// new variant, so hide the feature detail.
103-
dismissFeatureDetails()
103+
it?.let {
104+
dismissFeatureDetails()
105+
}
104106
}
105107
}
106108
}

mobile/src/main/java/com/google/samples/apps/iosched/ui/messages/SnackbarMessageFragmentExtensions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package com.google.samples.apps.iosched.ui.messages
1919
import androidx.core.text.HtmlCompat
2020
import androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY
2121
import androidx.fragment.app.Fragment
22-
import androidx.lifecycle.lifecycleScope
22+
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
2323
import com.google.samples.apps.iosched.widget.FadingSnackbar
2424
import kotlinx.coroutines.flow.collect
2525

@@ -30,7 +30,7 @@ fun Fragment.setupSnackbarManager(
3030
snackbarMessageManager: SnackbarMessageManager,
3131
fadingSnackbar: FadingSnackbar
3232
) {
33-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
33+
launchAndRepeatWithViewLifecycle {
3434
snackbarMessageManager.currentSnackbar.collect { message ->
3535
if (message == null) { return@collect }
3636
val messageText = HtmlCompat.fromHtml(

mobile/src/main/java/com/google/samples/apps/iosched/ui/schedule/ScheduleFragment.kt

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import androidx.core.view.updatePaddingRelative
2525
import androidx.fragment.app.Fragment
2626
import androidx.fragment.app.activityViewModels
2727
import androidx.fragment.app.viewModels
28-
import androidx.lifecycle.lifecycleScope
2928
import androidx.navigation.fragment.findNavController
3029
import androidx.recyclerview.widget.DefaultItemAnimator
3130
import androidx.recyclerview.widget.LinearLayoutManager
@@ -55,6 +54,7 @@ import com.google.samples.apps.iosched.ui.signin.setupProfileMenuItem
5554
import com.google.samples.apps.iosched.util.clearDecorations
5655
import com.google.samples.apps.iosched.util.doOnApplyWindowInsets
5756
import com.google.samples.apps.iosched.util.executeAfter
57+
import com.google.samples.apps.iosched.util.launchAndRepeatWithViewLifecycle
5858
import com.google.samples.apps.iosched.util.requestApplyInsetsWhenAttached
5959
import com.google.samples.apps.iosched.widget.BubbleDecoration
6060
import com.google.samples.apps.iosched.widget.FadingSnackbar
@@ -189,30 +189,30 @@ class ScheduleFragment : Fragment() {
189189
dayIndicatorRecyclerView.adapter = dayIndicatorAdapter
190190

191191
// Start observing ViewModels
192-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
193-
scheduleViewModel.scheduleUiData.collect { updateScheduleUi(it) }
194-
}
192+
launchAndRepeatWithViewLifecycle {
193+
launch {
194+
scheduleViewModel.scheduleUiData.collect { updateScheduleUi(it) }
195+
}
195196

196-
// During conference, scroll to current event.
197-
198-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
199-
scheduleViewModel.scrollToEvent.collect { scrollEvent ->
200-
if (scrollEvent.targetPosition != -1) {
201-
scheduleRecyclerView.run {
202-
post {
203-
val lm = layoutManager as LinearLayoutManager
204-
if (scrollEvent.smoothScroll) {
205-
scheduleScroller.targetPosition = scrollEvent.targetPosition
206-
lm.startSmoothScroll(scheduleScroller)
207-
} else {
208-
lm.scrollToPositionWithOffset(scrollEvent.targetPosition, 0)
197+
// During conference, scroll to current event.
198+
launch {
199+
scheduleViewModel.scrollToEvent.collect { scrollEvent ->
200+
if (scrollEvent.targetPosition != -1) {
201+
scheduleRecyclerView.run {
202+
post {
203+
val lm = layoutManager as LinearLayoutManager
204+
if (scrollEvent.smoothScroll) {
205+
scheduleScroller.targetPosition = scrollEvent.targetPosition
206+
lm.startSmoothScroll(scheduleScroller)
207+
} else {
208+
lm.scrollToPositionWithOffset(scrollEvent.targetPosition, 0)
209+
}
209210
}
210211
}
211212
}
212213
}
213214
}
214-
}
215-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
215+
216216
launch {
217217
scheduleViewModel.navigationActions.collect {
218218
when (it) {
@@ -222,19 +222,20 @@ class ScheduleFragment : Fragment() {
222222
}
223223
}
224224
}
225+
225226
launch {
226227
scheduleViewModel.signInNavigationActions.collect {
227228
if (it == ShowNotificationPreferencesDialog) {
228229
openNotificationsPreferenceDialog()
229230
}
230231
}
231232
}
232-
}
233233

234-
// Show an error message
235-
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
236-
scheduleViewModel.errorMessage.collect { errorMsg ->
237-
Toast.makeText(context, errorMsg, Toast.LENGTH_LONG).show()
234+
// Show an error message
235+
launch {
236+
scheduleViewModel.errorMessage.collect { errorMsg ->
237+
Toast.makeText(context, errorMsg, Toast.LENGTH_LONG).show()
238+
}
238239
}
239240
}
240241

0 commit comments

Comments
 (0)