Turns out the lifecycle owner changes quite a bit and thus it's a requirement to make it the key of a Disposable Effect.

This commit is contained in:
Vitor Pamplona
2023-09-22 13:24:37 -04:00
parent a0308bd3a1
commit d5220324c4
21 changed files with 95 additions and 46 deletions
@@ -194,7 +194,7 @@ private fun RenderSearch(
} }
} }
DisposableEffect(Unit) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Join Start") println("Join Start")
@@ -614,7 +614,7 @@ fun ZoomableImageDialog(
) { ) {
val view = LocalView.current val view = LocalView.current
DisposableEffect(key1 = Unit) { DisposableEffect(key1 = view) {
if (Build.VERSION.SDK_INT >= 30) { if (Build.VERSION.SDK_INT >= 30) {
view.windowInsetsController?.hide( view.windowInsetsController?.hide(
android.view.WindowInsets.Type.systemBars() android.view.WindowInsets.Type.systemBars()
@@ -284,7 +284,7 @@ fun AppNavigation(
actionableNextPage = null actionableNextPage = null
} }
DisposableEffect(navController) { DisposableEffect(activity) {
val consumer = Consumer<Intent> { intent -> val consumer = Consumer<Intent> { intent ->
val uri = intent?.data?.toString() val uri = intent?.data?.toString()
val newPage = uriToRoute(uri) val newPage = uriToRoute(uri)
@@ -4,7 +4,6 @@ import android.util.Log
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import com.google.zxing.client.android.Intents import com.google.zxing.client.android.Intents
import com.journeyapps.barcodescanner.ScanContract import com.journeyapps.barcodescanner.ScanContract
@@ -40,8 +39,6 @@ fun NIP19QrCodeScanner(onScan: (String?) -> Unit) {
@Composable @Composable
fun SimpleQrCodeScanner(onScan: (String?) -> Unit) { fun SimpleQrCodeScanner(onScan: (String?) -> Unit) {
val lifecycleOwner = LocalLifecycleOwner.current
val qrLauncher = val qrLauncher =
rememberLauncherForActivityResult(ScanContract()) { rememberLauncherForActivityResult(ScanContract()) {
if (it.contents != null) { if (it.contents != null) {
@@ -59,7 +56,7 @@ fun SimpleQrCodeScanner(onScan: (String?) -> Unit) {
addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN) addExtra(Intents.Scan.SCAN_TYPE, Intents.Scan.MIXED_SCAN)
} }
DisposableEffect(lifecycleOwner) { DisposableEffect(Unit) {
qrLauncher.launch(scanOptions) qrLauncher.launch(scanOptions)
onDispose { } onDispose { }
} }
@@ -70,16 +70,20 @@ class RelayFeedViewModel : ViewModel() {
} }
fun subscribeTo(user: User) { fun subscribeTo(user: User) {
currentUser = user if (currentUser != user) {
user.live().relays.observeForever(listener) currentUser = user
user.live().relayInfo.observeForever(listener) user.live().relays.observeForever(listener)
invalidateData() user.live().relayInfo.observeForever(listener)
invalidateData()
}
} }
fun unsubscribeTo(user: User) { fun unsubscribeTo(user: User) {
user.live().relays.removeObserver(listener) if (currentUser == user) {
user.live().relayInfo.removeObserver(listener) user.live().relays.removeObserver(listener)
currentUser = null user.live().relayInfo.removeObserver(listener)
currentUser = null
}
} }
private val bundler = BundledUpdate(250, Dispatchers.IO) private val bundler = BundledUpdate(250, Dispatchers.IO)
@@ -47,7 +47,7 @@ fun rememberForeverLazyListState(
savedOffset.roundToInt() savedOffset.roundToInt()
) )
} }
DisposableEffect(Unit) { DisposableEffect(scrollState) {
onDispose { onDispose {
val lastIndex = scrollState.firstVisibleItemIndex val lastIndex = scrollState.firstVisibleItemIndex
val lastOffset = scrollState.firstVisibleItemScrollOffset val lastOffset = scrollState.firstVisibleItemScrollOffset
@@ -196,9 +196,6 @@ fun ChannelScreen(
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
NostrChannelDataSource.start()
feedViewModel.invalidateData(true)
launch(Dispatchers.IO) { launch(Dispatchers.IO) {
newPostModel.imageUploadingError.collect { error -> newPostModel.imageUploadingError.collect { error ->
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
@@ -209,6 +206,17 @@ fun ChannelScreen(
} }
DisposableEffect(accountViewModel) { DisposableEffect(accountViewModel) {
NostrChannelDataSource.loadMessagesBetween(accountViewModel.account, channel)
NostrChannelDataSource.start()
feedViewModel.invalidateData(true)
onDispose {
NostrChannelDataSource.clear()
NostrChannelDataSource.stop()
}
}
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Channel Start") println("Channel Start")
@@ -67,7 +67,7 @@ fun ChatroomListScreen(
WatchAccountForListScreen(knownFeedViewModel, newFeedViewModel, accountViewModel) WatchAccountForListScreen(knownFeedViewModel, newFeedViewModel, accountViewModel)
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
NostrChatroomListDataSource.start() NostrChatroomListDataSource.start()
@@ -234,9 +234,6 @@ fun ChatroomScreen(
LaunchedEffect(room, accountViewModel) { LaunchedEffect(room, accountViewModel) {
launch(Dispatchers.IO) { launch(Dispatchers.IO) {
NostrChatroomDataSource.start()
feedViewModel.invalidateData()
newPostModel.imageUploadingError.collect { error -> newPostModel.imageUploadingError.collect { error ->
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
Toast.makeText(context, error, Toast.LENGTH_SHORT).show() Toast.makeText(context, error, Toast.LENGTH_SHORT).show()
@@ -246,6 +243,16 @@ fun ChatroomScreen(
} }
DisposableEffect(room, accountViewModel) { DisposableEffect(room, accountViewModel) {
NostrChatroomDataSource.loadMessagesBetween(accountViewModel.account, room)
NostrChatroomDataSource.start()
feedViewModel.invalidateData()
onDispose {
NostrChatroomDataSource.stop()
}
}
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Private Message Start") println("Private Message Start")
@@ -56,7 +56,7 @@ fun CommunityScreen(note: AddressableNote, feedViewModel: NostrCommunityFeedView
feedViewModel.invalidateData() feedViewModel.invalidateData()
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Community Start") println("Community Start")
@@ -88,7 +88,7 @@ fun DiscoverScreen(
accountViewModel = accountViewModel accountViewModel = accountViewModel
) )
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Discovery Start") println("Discovery Start")
@@ -65,12 +65,16 @@ fun GeoHashScreen(tag: String, feedViewModel: NostrGeoHashFeedViewModel, account
NostrGeohashDataSource.loadHashtag(tag) NostrGeohashDataSource.loadHashtag(tag)
LaunchedEffect(tag) { DisposableEffect(tag) {
NostrGeohashDataSource.start() NostrGeohashDataSource.start()
feedViewModel.invalidateData() feedViewModel.invalidateData()
onDispose {
NostrGeohashDataSource.loadHashtag(null)
NostrGeohashDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Hashtag Start") println("Hashtag Start")
@@ -88,8 +92,6 @@ fun GeoHashScreen(tag: String, feedViewModel: NostrGeoHashFeedViewModel, account
lifeCycleOwner.lifecycle.addObserver(observer) lifeCycleOwner.lifecycle.addObserver(observer)
onDispose { onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer) lifeCycleOwner.lifecycle.removeObserver(observer)
NostrGeohashDataSource.loadHashtag(null)
NostrGeohashDataSource.stop()
} }
} }
@@ -12,7 +12,6 @@ import androidx.compose.material.Divider
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
@@ -61,12 +60,17 @@ fun HashtagScreen(tag: String, feedViewModel: NostrHashtagFeedViewModel, account
NostrHashtagDataSource.loadHashtag(tag) NostrHashtagDataSource.loadHashtag(tag)
LaunchedEffect(tag) { DisposableEffect(tag) {
NostrHashtagDataSource.start() NostrHashtagDataSource.start()
feedViewModel.invalidateData() feedViewModel.invalidateData()
onDispose {
NostrHashtagDataSource.loadHashtag(null)
NostrHashtagDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Hashtag Start") println("Hashtag Start")
@@ -84,8 +88,6 @@ fun HashtagScreen(tag: String, feedViewModel: NostrHashtagFeedViewModel, account
lifeCycleOwner.lifecycle.addObserver(observer) lifeCycleOwner.lifecycle.addObserver(observer)
onDispose { onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer) lifeCycleOwner.lifecycle.removeObserver(observer)
NostrHashtagDataSource.loadHashtag(null)
NostrHashtagDataSource.stop()
} }
} }
@@ -61,7 +61,7 @@ fun HiddenUsersScreen(
) { ) {
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Hidden Users Start") println("Hidden Users Start")
@@ -63,7 +63,7 @@ fun HomeScreen(
} }
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
NostrHomeDataSource.invalidateFilters() NostrHomeDataSource.invalidateFilters()
@@ -16,6 +16,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.statusBarsPadding import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State import androidx.compose.runtime.State
@@ -33,7 +34,10 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavBackStackEntry import androidx.navigation.NavBackStackEntry
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
@@ -323,6 +327,20 @@ fun WatchNavStateToUpdateBarVisibility(navState: State<NavBackStackEntry?>, bott
LaunchedEffect(key1 = navState.value) { LaunchedEffect(key1 = navState.value) {
bottomBarOffsetHeightPx.value = 0f bottomBarOffsetHeightPx.value = 0f
} }
val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) {
bottomBarOffsetHeightPx.value = 0f
}
}
lifeCycleOwner.lifecycle.addObserver(observer)
onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer)
}
}
} }
@Composable @Composable
@@ -75,7 +75,7 @@ fun NotificationScreen(
CheckifItNeedsToRequestNotificationPermission() CheckifItNeedsToRequestNotificationPermission()
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
NostrAccountDataSource.invalidateFilters() NostrAccountDataSource.invalidateFilters()
@@ -238,11 +238,15 @@ fun ProfileScreen(
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
LaunchedEffect(Unit) { DisposableEffect(accountViewModel) {
NostrUserProfileDataSource.start() NostrUserProfileDataSource.start()
onDispose {
NostrUserProfileDataSource.loadUserProfile(null)
NostrUserProfileDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Profidle Start") println("Profidle Start")
@@ -259,9 +263,6 @@ fun ProfileScreen(
lifeCycleOwner.lifecycle.addObserver(observer) lifeCycleOwner.lifecycle.addObserver(observer)
onDispose { onDispose {
lifeCycleOwner.lifecycle.removeObserver(observer) lifeCycleOwner.lifecycle.removeObserver(observer)
println("Profile Dispose")
NostrUserProfileDataSource.loadUserProfile(null)
NostrUserProfileDataSource.stop()
} }
} }
@@ -1567,6 +1568,13 @@ fun TabRelays(user: User, accountViewModel: AccountViewModel, nav: (String) -> U
val lifeCycleOwner = LocalLifecycleOwner.current val lifeCycleOwner = LocalLifecycleOwner.current
DisposableEffect(user) { DisposableEffect(user) {
feedViewModel.subscribeTo(user)
onDispose {
feedViewModel.unsubscribeTo(user)
}
}
DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Profile Relay Start") println("Profile Relay Start")
@@ -104,7 +104,7 @@ fun SearchScreen(
WatchAccountForSearchScreen(accountViewModel) WatchAccountForSearchScreen(accountViewModel)
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Search Start") println("Search Start")
@@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.platform.LocalLifecycleOwner
@@ -28,11 +27,15 @@ fun ThreadScreen(noteId: String?, accountViewModel: AccountViewModel, nav: (Stri
NostrThreadDataSource.loadThread(noteId) NostrThreadDataSource.loadThread(noteId)
LaunchedEffect(noteId) { DisposableEffect(noteId) {
feedViewModel.invalidateData(true) feedViewModel.invalidateData(true)
onDispose {
NostrThreadDataSource.loadThread(null)
NostrThreadDataSource.stop()
}
} }
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Thread Start") println("Thread Start")
@@ -89,7 +89,7 @@ fun VideoScreen(
WatchAccountForVideoScreen(videoFeedView = videoFeedView, accountViewModel = accountViewModel) WatchAccountForVideoScreen(videoFeedView = videoFeedView, accountViewModel = accountViewModel)
DisposableEffect(accountViewModel) { DisposableEffect(lifeCycleOwner) {
val observer = LifecycleEventObserver { _, event -> val observer = LifecycleEventObserver { _, event ->
if (event == Lifecycle.Event.ON_RESUME) { if (event == Lifecycle.Event.ON_RESUME) {
println("Video Start") println("Video Start")