From ffd43e448bc1687cd4847f1589f37091748a4e37 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Fri, 15 Nov 2024 12:54:59 +0100 Subject: [PATCH 1/5] filter out drafts that are not same author as current account --- .../amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt index fb55ef542..28016b70b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt @@ -268,7 +268,7 @@ fun RenderThreadFeed( contentPadding = FeedPadding, state = listState, ) { - itemsIndexed(items.list, key = { _, item -> item.idHex }) { index, item -> + itemsIndexed(items.list.filter { !it.isDraft() || (it.author?.pubkeyHex == accountViewModel.account.userProfile().pubkeyHex) }, key = { _, item -> item.idHex }) { index, item -> val level = viewModel.levelFlowForItem(item).collectAsStateWithLifecycle(0) val modifier = From 82164769165a6a647e7f82e286eed77046ce470d Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sat, 16 Nov 2024 08:47:36 +0100 Subject: [PATCH 2/5] cleaner code, fewer warnings --- .../ui/screen/loggedIn/threadview/ThreadFeedView.kt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt index 28016b70b..6fd7de78a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt @@ -274,7 +274,6 @@ fun RenderThreadFeed( val modifier = Modifier .drawReplyLevel( - note = item, level = level, color = MaterialTheme.colorScheme.placeholderText, selected = @@ -322,7 +321,6 @@ fun RenderThreadFeed( // Creates a Zebra pattern where each bar is a reply level. fun Modifier.drawReplyLevel( - note: Note, level: State, color: Color, selected: Color, @@ -662,9 +660,8 @@ private fun FullBleedNoteCompose( } } - val noteEvent = baseNote.event - val zapSplits = remember(noteEvent) { noteEvent?.hasZapSplitSetup() ?: false } - if (zapSplits && noteEvent != null) { + val zapSplits = remember(noteEvent) { noteEvent.hasZapSplitSetup() } + if (zapSplits) { Spacer(modifier = DoubleVertSpacer) Row( modifier = Modifier.padding(horizontal = 12.dp), From f16143bec3dc967202125882f148981c12d3bcf4 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sat, 16 Nov 2024 09:29:45 +0100 Subject: [PATCH 3/5] cleaner code, fewer warnings --- .../loggedIn/threadview/ThreadFeedView.kt | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt index 6fd7de78a..9165b0c75 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt @@ -242,9 +242,9 @@ fun RenderThreadFeed( // In that case, this screen will open with 0-1 items, and the scrollToItem below // will not change the state of the screen (too few items, scroll is not available) // as the app loads the reaming of the thread the position of the reply changes - // and becuase there wasn't a possibility to scroll before and now there is one, + // and because there wasn't a possibility to scroll before and now there is one, // the screen stays at the top. Once the thread has enough replies, the lazy column - // updates with new items correctly. It just needs a few items to start the scrool. + // updates with new items correctly. It just needs a few items to start the scroll. // // This hack allows the list 1 second to fill up with more // records before setting up the position on the feed. @@ -482,14 +482,22 @@ private fun FullBleedNoteCompose( Spacer(modifier = Modifier.height(10.dp)) - if (noteEvent is BadgeDefinitionEvent) { - BadgeDisplay(baseNote = baseNote) - } else if (noteEvent is LongTextNoteEvent) { - RenderLongFormHeaderForThread(noteEvent) - } else if (noteEvent is WikiNoteEvent) { - RenderWikiHeaderForThread(noteEvent, accountViewModel, nav) - } else if (noteEvent is ClassifiedsEvent) { - RenderClassifiedsReaderForThread(noteEvent, baseNote, accountViewModel, nav) + when (noteEvent) { + is BadgeDefinitionEvent -> { + BadgeDisplay(baseNote = baseNote) + } + + is LongTextNoteEvent -> { + RenderLongFormHeaderForThread(noteEvent) + } + + is WikiNoteEvent -> { + RenderWikiHeaderForThread(noteEvent, accountViewModel, nav) + } + + is ClassifiedsEvent -> { + RenderClassifiedsReaderForThread(noteEvent, baseNote, accountViewModel, nav) + } } Row( @@ -510,11 +518,11 @@ private fun FullBleedNoteCompose( nav = nav, ) } else if (noteEvent is VideoEvent) { - VideoDisplay(baseNote, false, true, backgroundColor, false, accountViewModel, nav) + VideoDisplay(baseNote, makeItShort = false, canPreview = true, backgroundColor = backgroundColor, isFiniteHeight = false, accountViewModel = accountViewModel, nav = nav) } else if (noteEvent is FileHeaderEvent) { - FileHeaderDisplay(baseNote, true, false, accountViewModel) + FileHeaderDisplay(baseNote, roundedCorner = true, isFiniteHeight = false, accountViewModel = accountViewModel) } else if (noteEvent is FileStorageHeaderEvent) { - FileStorageHeaderDisplay(baseNote, true, false, accountViewModel) + FileStorageHeaderDisplay(baseNote, roundedCorner = true, isFiniteHeight = false, accountViewModel = accountViewModel) } else if (noteEvent is PeopleListEvent) { DisplayPeopleList(baseNote, backgroundColor, accountViewModel, nav) } else if (noteEvent is AudioTrackEvent) { @@ -561,9 +569,9 @@ private fun FullBleedNoteCompose( } else if (noteEvent is GitRepositoryEvent) { RenderGitRepositoryEvent(baseNote, accountViewModel, nav) } else if (noteEvent is GitPatchEvent) { - RenderGitPatchEvent(baseNote, false, true, quotesLeft = 3, backgroundColor, accountViewModel, nav) + RenderGitPatchEvent(baseNote, makeItShort = false, canPreview = true, quotesLeft = 3, backgroundColor = backgroundColor, accountViewModel = accountViewModel, nav = nav) } else if (noteEvent is GitIssueEvent) { - RenderGitIssueEvent(baseNote, false, true, quotesLeft = 3, backgroundColor, accountViewModel, nav) + RenderGitIssueEvent(baseNote, makeItShort = false, canPreview = true, quotesLeft = 3, backgroundColor = backgroundColor, accountViewModel = accountViewModel, nav = nav) } else if (noteEvent is AppDefinitionEvent) { RenderAppDefinition(baseNote, accountViewModel, nav) } else if (noteEvent is DraftEvent) { @@ -670,7 +678,7 @@ private fun FullBleedNoteCompose( } } - ReactionsRow(baseNote, true, true, editState, accountViewModel, nav) + ReactionsRow(baseNote, showReactionDetail = true, addPadding = true, editState = editState, accountViewModel = accountViewModel, nav = nav) } } @@ -922,14 +930,14 @@ private fun RenderWikiHeaderForThreadPreview() { RenderWikiHeaderForThread(noteEvent = event, accountViewModel = accountViewModel, nav) RenderTextEvent( baseNote!!, - false, - true, + makeItShort = false, + canPreview = true, quotesLeft = 3, unPackReply = false, - backgroundColor, - editState, - accountViewModel, - nav, + backgroundColor = backgroundColor, + editState = editState, + accountViewModel = accountViewModel, + nav = nav, ) } } From 6c3200a9ccc6bf1d757c6d9e12a7b4395df162be Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sat, 16 Nov 2024 10:34:01 +0100 Subject: [PATCH 4/5] cleaner code, change cascading ifs to when --- .../loggedIn/threadview/ThreadFeedView.kt | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt index 9165b0c75..d79a6974b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt @@ -483,21 +483,10 @@ private fun FullBleedNoteCompose( Spacer(modifier = Modifier.height(10.dp)) when (noteEvent) { - is BadgeDefinitionEvent -> { - BadgeDisplay(baseNote = baseNote) - } - - is LongTextNoteEvent -> { - RenderLongFormHeaderForThread(noteEvent) - } - - is WikiNoteEvent -> { - RenderWikiHeaderForThread(noteEvent, accountViewModel, nav) - } - - is ClassifiedsEvent -> { - RenderClassifiedsReaderForThread(noteEvent, baseNote, accountViewModel, nav) - } + is BadgeDefinitionEvent -> BadgeDisplay(baseNote = baseNote) + is LongTextNoteEvent -> RenderLongFormHeaderForThread(noteEvent) + is WikiNoteEvent -> RenderWikiHeaderForThread(noteEvent, accountViewModel, nav) + is ClassifiedsEvent -> RenderClassifiedsReaderForThread(noteEvent, baseNote, accountViewModel, nav) } Row( From 4a590d67a640ed2c34ef18d494bb8054c874f3d3 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sun, 17 Nov 2024 10:48:03 +0100 Subject: [PATCH 5/5] move filtering of "not your drafts" to ThreadFeedFilter --- .../amethyst/ui/dal/ThreadFeedFilter.kt | 14 +++++++++++--- .../screen/loggedIn/threadview/ThreadFeedView.kt | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt index 21374035d..bc80e6fb2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/dal/ThreadFeedFilter.kt @@ -27,11 +27,12 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.ThreadAssembler import com.vitorpamplona.amethyst.model.ThreadLevelCalculator import com.vitorpamplona.quartz.utils.TimeUtils +import kotlinx.collections.immutable.toImmutableSet @Immutable class ThreadFeedFilter( val account: Account, - val noteId: String, + private val noteId: String, ) : FeedFilter() { override fun feedKey(): String = noteId @@ -40,7 +41,14 @@ class ThreadFeedFilter( val followingKeySet = account.liveKind3Follows.value.authors val eventsToWatch = ThreadAssembler().findThreadFor(noteId) ?: return emptyList() - val eventsInHex = eventsToWatch.allNotes.map { it.idHex }.toSet() + // Filter out drafts made by other accounts on device + val filteredEvents = + eventsToWatch.allNotes + .filter { !it.isDraft() || (it.author?.pubkeyHex == account.userProfile().pubkeyHex) } + .toImmutableSet() + val filteredThreadInfo = ThreadAssembler.ThreadInfo(eventsToWatch.root, filteredEvents) + + val eventsInHex = filteredThreadInfo.allNotes.map { it.idHex }.toSet() val now = TimeUtils.now() // Currently orders by date of each event, descending, at each level of the reply stack @@ -57,6 +65,6 @@ class ThreadFeedFilter( ).signature } - return eventsToWatch.allNotes.sortedWith(order) + return filteredThreadInfo.allNotes.sortedWith(order) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt index d79a6974b..da2f81c48 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt @@ -268,7 +268,7 @@ fun RenderThreadFeed( contentPadding = FeedPadding, state = listState, ) { - itemsIndexed(items.list.filter { !it.isDraft() || (it.author?.pubkeyHex == accountViewModel.account.userProfile().pubkeyHex) }, key = { _, item -> item.idHex }) { index, item -> + itemsIndexed(items.list, key = { _, item -> item.idHex }) { index, item -> val level = viewModel.levelFlowForItem(item).collectAsStateWithLifecycle(0) val modifier =