From ee7eada00eb8aa6710c76a65fb004de226dfddb3 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 28 Apr 2026 20:38:34 -0400 Subject: [PATCH] Fixes top bar filter for Nests --- .../com/vitorpamplona/amethyst/LocalPreferences.kt | 5 +++++ .../java/com/vitorpamplona/amethyst/model/Account.kt | 3 +++ .../vitorpamplona/amethyst/model/AccountSettings.kt | 12 ++++++++++++ .../dal/FollowPackFeedConversationsFeedFilter.kt | 2 +- .../amethyst/ui/screen/loggedIn/nests/NestsScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/nests/NestsTopBar.kt | 4 ++-- .../ui/screen/loggedIn/nests/dal/NestsFeedFilter.kt | 6 +++--- .../loggedIn/nests/datasource/NestsSubAssembler.kt | 4 ++-- 8 files changed, 29 insertions(+), 9 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index efcfad223..ce6324ffc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -105,6 +105,7 @@ private object PrefKeys { const val DEFAULT_SHORTS_FOLLOW_LIST = "defaultShortsFollowList" const val DEFAULT_PUBLIC_CHATS_FOLLOW_LIST = "defaultPublicChatsFollowList" const val DEFAULT_LIVE_STREAMS_FOLLOW_LIST = "defaultLiveStreamsFollowList" + const val DEFAULT_NESTS_FOLLOW_LIST = "defaultNestsFollowList" const val DEFAULT_LONGS_FOLLOW_LIST = "defaultLongsFollowList" const val DEFAULT_ARTICLES_FOLLOW_LIST = "defaultArticlesFollowList" const val DEFAULT_BADGES_FOLLOW_LIST = "defaultBadgesFollowList" @@ -357,6 +358,7 @@ object LocalPreferences { putString(PrefKeys.DEFAULT_SHORTS_FOLLOW_LIST, JsonMapper.toJson(settings.defaultShortsFollowList.value)) putString(PrefKeys.DEFAULT_PUBLIC_CHATS_FOLLOW_LIST, JsonMapper.toJson(settings.defaultPublicChatsFollowList.value)) putString(PrefKeys.DEFAULT_LIVE_STREAMS_FOLLOW_LIST, JsonMapper.toJson(settings.defaultLiveStreamsFollowList.value)) + putString(PrefKeys.DEFAULT_NESTS_FOLLOW_LIST, JsonMapper.toJson(settings.defaultNestsFollowList.value)) putString(PrefKeys.DEFAULT_LONGS_FOLLOW_LIST, JsonMapper.toJson(settings.defaultLongsFollowList.value)) putString(PrefKeys.DEFAULT_ARTICLES_FOLLOW_LIST, JsonMapper.toJson(settings.defaultArticlesFollowList.value)) putString(PrefKeys.DEFAULT_BADGES_FOLLOW_LIST, JsonMapper.toJson(settings.defaultBadgesFollowList.value)) @@ -628,6 +630,7 @@ object LocalPreferences { defaultShortsFollowList = MutableStateFlow(followListPrefs.shorts), defaultPublicChatsFollowList = MutableStateFlow(followListPrefs.publicChats), defaultLiveStreamsFollowList = MutableStateFlow(followListPrefs.liveStreams), + defaultNestsFollowList = MutableStateFlow(followListPrefs.nests), defaultLongsFollowList = MutableStateFlow(followListPrefs.longs), defaultArticlesFollowList = MutableStateFlow(followListPrefs.articles), defaultBadgesFollowList = MutableStateFlow(followListPrefs.badges), @@ -697,6 +700,7 @@ object LocalPreferences { val shorts: TopFilter, val publicChats: TopFilter, val liveStreams: TopFilter, + val nests: TopFilter, val longs: TopFilter, val articles: TopFilter, val badges: TopFilter, @@ -717,6 +721,7 @@ object LocalPreferences { shorts = parseTopFilterOrDefault(getString(PrefKeys.DEFAULT_SHORTS_FOLLOW_LIST, null), TopFilter.Global), publicChats = parseTopFilterOrDefault(getString(PrefKeys.DEFAULT_PUBLIC_CHATS_FOLLOW_LIST, null), TopFilter.Global), liveStreams = parseTopFilterOrDefault(getString(PrefKeys.DEFAULT_LIVE_STREAMS_FOLLOW_LIST, null), TopFilter.Global), + nests = parseTopFilterOrDefault(getString(PrefKeys.DEFAULT_NESTS_FOLLOW_LIST, null), TopFilter.Global), longs = parseTopFilterOrDefault(getString(PrefKeys.DEFAULT_LONGS_FOLLOW_LIST, null), TopFilter.Global), articles = parseTopFilterOrDefault(getString(PrefKeys.DEFAULT_ARTICLES_FOLLOW_LIST, null), TopFilter.AllFollows), badges = parseTopFilterOrDefault(getString(PrefKeys.DEFAULT_BADGES_FOLLOW_LIST, null), TopFilter.Mine), diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index e50e83135..1122d328c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -488,6 +488,9 @@ class Account( val liveLiveStreamsFollowLists: StateFlow = topNavFilterFlow(settings.defaultLiveStreamsFollowList) val liveLiveStreamsFollowListsPerRelay = OutboxLoaderState(liveLiveStreamsFollowLists, cache, scope).flow + val liveNestsFollowLists: StateFlow = topNavFilterFlow(settings.defaultNestsFollowList) + val liveNestsFollowListsPerRelay = OutboxLoaderState(liveNestsFollowLists, cache, scope).flow + val liveLongsFollowLists: StateFlow = topNavFilterFlow(settings.defaultLongsFollowList) val liveLongsFollowListsPerRelay = OutboxLoaderState(liveLongsFollowLists, cache, scope).flow diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt index 8ba8f980c..b6aace912 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSettings.kt @@ -159,6 +159,7 @@ class AccountSettings( val defaultShortsFollowList: MutableStateFlow = MutableStateFlow(TopFilter.Global), val defaultPublicChatsFollowList: MutableStateFlow = MutableStateFlow(TopFilter.Global), val defaultLiveStreamsFollowList: MutableStateFlow = MutableStateFlow(TopFilter.Global), + val defaultNestsFollowList: MutableStateFlow = MutableStateFlow(TopFilter.Global), val defaultLongsFollowList: MutableStateFlow = MutableStateFlow(TopFilter.Global), val defaultArticlesFollowList: MutableStateFlow = MutableStateFlow(TopFilter.AllFollows), val defaultBadgesFollowList: MutableStateFlow = MutableStateFlow(TopFilter.Mine), @@ -527,6 +528,17 @@ class AccountSettings( } } + fun changeDefaultNestsFollowList(name: FeedDefinition) { + changeDefaultNestsFollowList(name.code) + } + + fun changeDefaultNestsFollowList(name: TopFilter) { + if (defaultNestsFollowList.value != name) { + defaultNestsFollowList.tryEmit(name) + saveAccountSettings() + } + } + fun changeDefaultLongsFollowList(name: FeedDefinition) { changeDefaultLongsFollowList(name.code) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/dal/FollowPackFeedConversationsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/dal/FollowPackFeedConversationsFeedFilter.kt index 513a09c79..80505f202 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/dal/FollowPackFeedConversationsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/dal/FollowPackFeedConversationsFeedFilter.kt @@ -46,7 +46,7 @@ class FollowPackFeedConversationsFeedFilter( val followPackNote: AddressableNote, val account: Account, ) : AdditiveFeedFilter() { - override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.settings.defaultHomeFollowList.value + override fun feedKey(): String = account.userProfile().pubkeyHex + "-" + account.settings.defaultFollowPacksFollowList.value override fun showHiddenKey(): Boolean = account.liveHomeFollowLists.value is MutedAuthorsByOutboxTopNavFilter || diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsScreen.kt index f8b4b1dd7..d7933cf68 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsScreen.kt @@ -194,7 +194,7 @@ fun WatchAccountForNestsScreen( nestsFeedState: FeedContentState, accountViewModel: AccountViewModel, ) { - val listState by accountViewModel.account.liveLiveStreamsFollowLists.collectAsStateWithLifecycle() + val listState by accountViewModel.account.liveNestsFollowLists.collectAsStateWithLifecycle() // Use `by` to unwrap the StateFlow's value into the LaunchedEffect // key — without it, the State object is reference-stable across // recompositions and the effect never re-fires when the user diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsTopBar.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsTopBar.kt index df987f1e1..34a4c75c5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsTopBar.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/NestsTopBar.kt @@ -39,14 +39,14 @@ fun NestsTopBar( nav: INav, ) { UserDrawerSearchTopBar(accountViewModel, nav) { - val list by accountViewModel.account.settings.defaultLiveStreamsFollowList + val list by accountViewModel.account.settings.defaultNestsFollowList .collectAsStateWithLifecycle() NestsTopNavFilterBar( followListsModel = accountViewModel.feedStates.feedListOptions, listName = list, accountViewModel = accountViewModel, - onChange = accountViewModel.account.settings::changeDefaultLiveStreamsFollowList, + onChange = accountViewModel.account.settings::changeDefaultNestsFollowList, ) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/dal/NestsFeedFilter.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/dal/NestsFeedFilter.kt index f49fdd98f..fff92ef7e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/dal/NestsFeedFilter.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/dal/NestsFeedFilter.kt @@ -58,7 +58,7 @@ class NestsFeedFilter( override fun limit() = 50 - fun followList(): TopFilter = account.settings.defaultLiveStreamsFollowList.value + fun followList(): TopFilter = account.settings.defaultNestsFollowList.value private fun TopFilter.isMuteList() = this is TopFilter.MuteList @@ -76,7 +76,7 @@ class NestsFeedFilter( override fun applyFilter(newItems: Set): Set = innerApplyFilter(newItems) private fun innerApplyFilter(collection: Collection): Set { - val topFilter = account.liveLiveStreamsFollowLists.value + val topFilter = account.liveNestsFollowLists.value val filterParams = FilterByListParams.create( followLists = topFilter, @@ -198,7 +198,7 @@ class NestsFeedFilter( } override fun sort(items: Set): List { - val topFilter = account.liveLiveStreamsFollowLists.value + val topFilter = account.liveNestsFollowLists.value val topFilterAuthors = when (topFilter) { is AuthorsByOutboxTopNavFilter -> topFilter.authors diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/datasource/NestsSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/datasource/NestsSubAssembler.kt index 47d3b252a..ab2fdcd69 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/datasource/NestsSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/nests/datasource/NestsSubAssembler.kt @@ -56,11 +56,11 @@ class NestsSubAssembler( override fun list(key: NestsQueryState) = key.listName() - fun NestsQueryState.listNameFlow() = account.settings.defaultLiveStreamsFollowList + fun NestsQueryState.listNameFlow() = account.settings.defaultNestsFollowList fun NestsQueryState.listName() = listNameFlow().value - fun NestsQueryState.followsPerRelayFlow() = account.liveLiveStreamsFollowListsPerRelay + fun NestsQueryState.followsPerRelayFlow() = account.liveNestsFollowListsPerRelay fun NestsQueryState.followsPerRelay() = followsPerRelayFlow().value