From e4129276a1596bd75d99c24dbbdbbec926f1cf8a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 22 Feb 2023 18:10:29 -0500 Subject: [PATCH] Fixing the Relay view in Profile --- .../amethyst/model/LocalCache.kt | 8 +++--- .../com/vitorpamplona/amethyst/model/User.kt | 2 +- .../amethyst/ui/note/NoteCompose.kt | 2 +- .../amethyst/ui/screen/RelayFeedView.kt | 26 ++++++++++++------- .../ui/screen/loggedIn/ProfileScreen.kt | 25 +++++++++++++++--- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 9fcea33d8..9f5a08906 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -149,7 +149,7 @@ object LocalCache { val author = getOrCreateUser(event.pubKey.toHexKey()) if (relay != null) { - author.addRelay(relay, event.createdAt) + author.addRelayBeingUsed(relay, event.createdAt) note.addRelay(relay) } @@ -207,7 +207,7 @@ object LocalCache { fun consume(event: ContactListEvent) { val user = getOrCreateUser(event.pubKey.toHexKey()) - if (event.createdAt > user.updatedFollowsAt && event.follows.size > 0) { + if (event.createdAt > user.updatedFollowsAt && event.follows.isNotEmpty()) { // Saves relay list only if it's a user that is currently been seen user.latestContactList = event @@ -255,7 +255,7 @@ object LocalCache { val author = getOrCreateUser(event.pubKey.toHexKey()) if (relay != null) { - author.addRelay(relay, event.createdAt) + author.addRelayBeingUsed(relay, event.createdAt) note.addRelay(relay) } @@ -440,7 +440,7 @@ object LocalCache { val author = getOrCreateUser(event.pubKey.toHexKey()) if (relay != null) { - author.addRelay(relay, event.createdAt) + author.addRelayBeingUsed(relay, event.createdAt) note.addRelay(relay) } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index 309a3a3b5..9573056ed 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -202,7 +202,7 @@ class User(val pubkeyHex: String) { } } - fun addRelay(relay: Relay, eventTime: Long) { + fun addRelayBeingUsed(relay: Relay, eventTime: Long) { val here = relaysBeingUsed[relay.url] if (here == null) { relaysBeingUsed = relaysBeingUsed + Pair(relay.url, RelayInfo(relay.url, eventTime, 1)) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 556beb80a..bb5e833a6 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -527,7 +527,7 @@ fun NoteDropDownMenu(note: Note, popupExpanded: Boolean, onDismiss: () -> Unit, DropdownMenuItem(onClick = { accountViewModel.broadcast(note); onDismiss() }) { Text("Broadcast") } - if (note.author != accountViewModel.accountLiveData.value?.account?.userProfile) { + if (note.author != accountViewModel.accountLiveData.value?.account?.userProfile()) { Divider() DropdownMenuItem(onClick = { note.author?.let { diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt index 86dbc46eb..974766c15 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayFeedView.kt @@ -26,14 +26,17 @@ import com.vitorpamplona.amethyst.service.NostrHomeDataSource import com.vitorpamplona.amethyst.ui.actions.NewRelayListView import com.vitorpamplona.amethyst.ui.note.RelayCompose import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import java.util.concurrent.atomic.AtomicBoolean import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class RelayFeedViewModel: ViewModel() { val order = compareByDescending { it.lastEvent }.thenByDescending { it.counter }.thenBy { it.url } @@ -79,21 +82,24 @@ class RelayFeedViewModel: ViewModel() { currentUser = null } - override fun onCleared() { - currentUser?.let { unsubscribeTo(it) } - } + var handlerWaiting = AtomicBoolean() - var handlerWaiting = false @Synchronized - fun invalidateData() { - if (handlerWaiting) return + private fun invalidateData() { + if (handlerWaiting.getAndSet(true)) return - handlerWaiting = true + handlerWaiting.set(true) val scope = CoroutineScope(Job() + Dispatchers.Default) scope.launch { - delay(100) - refresh() - handlerWaiting = false + try { + delay(50) + refresh() + } finally { + withContext(NonCancellable) { + handlerWaiting.set(false) + } + } + handlerWaiting.set(false) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 55d1419de..34948dcb1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -198,8 +198,7 @@ fun ProfileScreen(userId: String?, accountViewModel: AccountViewModel, navContro }, { val userState by baseUser.live().relays.observeAsState() - val userRelaysBeingUsed = - userState?.user?.relaysBeingUsed?.size ?: "--" + val userRelaysBeingUsed = userState?.user?.relaysBeingUsed?.size ?: "--" val userStateRelayInfo by baseUser.live().relayInfo.observeAsState() val userRelays = userStateRelayInfo?.user?.relays?.size ?: "--" @@ -567,8 +566,26 @@ fun TabReports(user: User, accountViewModel: AccountViewModel, navController: Na fun TabRelays(user: User, accountViewModel: AccountViewModel, navController: NavController) { val feedViewModel: RelayFeedViewModel = viewModel() - LaunchedEffect(key1 = user) { - feedViewModel.subscribeTo(user) + val lifeCycleOwner = LocalLifecycleOwner.current + + DisposableEffect(user) { + val observer = LifecycleEventObserver { source, event -> + if (event == Lifecycle.Event.ON_RESUME) { + println("Profile Relay Start") + feedViewModel.subscribeTo(user) + } + if (event == Lifecycle.Event.ON_PAUSE) { + println("Profile Relay Stop") + feedViewModel.unsubscribeTo(user) + } + } + + lifeCycleOwner.lifecycle.addObserver(observer) + onDispose { + lifeCycleOwner.lifecycle.removeObserver(observer) + println("Profile Relay Dispose") + feedViewModel.unsubscribeTo(user) + } } Column(Modifier.fillMaxHeight()) {