From f78ec5cc90e6232531e1322f9161111289eb35a9 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 4 Jul 2023 20:55:01 -0400 Subject: [PATCH] Performance updates --- .../service/NostrSingleEventDataSource.kt | 14 +++++++------ .../amethyst/ui/actions/NewPostView.kt | 3 +-- .../amethyst/ui/components/RichTextViewer.kt | 20 +++++++++++-------- .../amethyst/ui/screen/CardFeedViewModel.kt | 4 +--- .../amethyst/ui/screen/FeedViewModel.kt | 2 +- 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt index 11dcf4584..33d7f4ac7 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt @@ -122,6 +122,8 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { } val singleEventChannel = requestNewChannel { time, relayUrl -> + checkNotInMainThread() + eventsToWatch.forEach { val eose = it.lastReactionsDownloadTime[relayUrl] if (eose == null) { @@ -159,16 +161,16 @@ object NostrSingleEventDataSource : NostrDataSource("SingleEventFeed") { } } - fun addAddress(aTag: Note) { - if (!addressesToWatch.contains(aTag)) { - addressesToWatch = addressesToWatch.plus(aTag) + fun addAddress(addressableNote: Note) { + if (!addressesToWatch.contains(addressableNote)) { + addressesToWatch = addressesToWatch.plus(addressableNote) invalidateFilters() } } - fun removeAddress(aTag: Note) { - if (addressesToWatch.contains(aTag)) { - addressesToWatch = addressesToWatch.minus(aTag) + fun removeAddress(addressableNote: Note) { + if (addressesToWatch.contains(addressableNote)) { + addressesToWatch = addressesToWatch.minus(addressableNote) invalidateFilters() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt index 2d9329e7b..aadb5413e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt @@ -89,8 +89,7 @@ import kotlinx.coroutines.withContext @OptIn(ExperimentalComposeUiApi::class) @Composable fun NewPostView(onClose: () -> Unit, baseReplyTo: Note? = null, quote: Note? = null, accountViewModel: AccountViewModel, nav: (String) -> Unit) { - val accountState by accountViewModel.accountLiveData.observeAsState() - val account = remember(accountState) { accountState?.account } ?: return + val account = remember(accountViewModel) { accountViewModel.account } val postViewModel: NewPostViewModel = viewModel() diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index c68702030..a1b02d928 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -112,7 +112,7 @@ fun RichTextViewer( ) { Column(modifier = modifier) { if (remember(content) { isMarkdown(content) }) { - RenderContentAsMarkdown(content, backgroundColor, tags, nav) + RenderContentAsMarkdown(content, tags, nav) } else { RenderRegular(content, tags, canPreview, backgroundColor, accountViewModel, nav) } @@ -292,7 +292,7 @@ fun RenderCustomEmoji(word: String, state: RichTextViewerState) { } @Composable -private fun RenderContentAsMarkdown(content: String, backgroundColor: MutableState, tags: ImmutableListOfLists?, nav: (String) -> Unit) { +private fun RenderContentAsMarkdown(content: String, tags: ImmutableListOfLists?, nav: (String) -> Unit) { val uri = LocalUriHandler.current val onClick = remember { { link: String -> @@ -391,10 +391,12 @@ private fun ObserveNIP19Event( @Composable fun ObserveNote(note: Note, onRefresh: () -> Unit) { - val noteState by note.live().metadata.observeAsState() + val loadedNoteId by note.live().metadata.map { + it.note.event?.id() + }.distinctUntilChanged().observeAsState(note.event?.id()) - LaunchedEffect(key1 = noteState) { - if (noteState?.note?.event != null) { + LaunchedEffect(key1 = loadedNoteId) { + if (loadedNoteId != null) { launch(Dispatchers.IO) { onRefresh() } @@ -428,10 +430,12 @@ private fun ObserveNIP19User( @Composable private fun ObserveUser(user: User, onRefresh: () -> Unit) { - val userState by user.live().metadata.observeAsState() + val loadedUserMetaId by user.live().metadata.map { + it.user.info?.latestMetadata?.id + }.distinctUntilChanged().observeAsState(user.info?.latestMetadata?.id) - LaunchedEffect(key1 = userState) { - if (userState?.user?.info != null) { + LaunchedEffect(key1 = loadedUserMetaId) { + if (loadedUserMetaId != null) { launch(Dispatchers.IO) { onRefresh() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt index af2be714e..46d26fc80 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt @@ -235,9 +235,7 @@ open class CardFeedViewModel(val localFilter: FeedFilter) : ViewModel() { val thisAccount = (localFilter as? NotificationFeedFilter)?.account val lastNotesCopy = if (thisAccount == lastAccount) lastNotes else null - if (lastNotesCopy != null && localFilter is AdditiveFeedFilter && oldNotesState is CardFeedState.Loaded) { - lastFeedKey = localFilter.feedKey() - + if (lastNotesCopy != null && localFilter is AdditiveFeedFilter && oldNotesState is CardFeedState.Loaded && lastFeedKey == localFilter.feedKey()) { val filteredNewList = localFilter.applyFilter(newItems) if (filteredNewList.isEmpty()) return diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt index 26ad34684..1d8e013ca 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt @@ -233,7 +233,7 @@ abstract class FeedViewModel(val localFilter: FeedFilter) : ViewModel(), I fun refreshFromOldState(newItems: Set) { val oldNotesState = _feedContent.value - if (localFilter is AdditiveFeedFilter && lastFeedKey != localFilter.feedKey()) { + if (localFilter is AdditiveFeedFilter && lastFeedKey == localFilter.feedKey()) { if (oldNotesState is FeedState.Loaded) { val newList = localFilter.updateListWith(oldNotesState.feed.value, newItems.toSet()).toImmutableList() if (!equalImmutableLists(newList, oldNotesState.feed.value)) {