From 645e28ab30862fa25170ca2d24144ae95ad839f4 Mon Sep 17 00:00:00 2001 From: Purefin Dev Date: Thu, 21 May 2026 19:38:15 +0000 Subject: [PATCH] feat(settings): add per-library visibility toggles for home screen Add a Home Screen Libraries setting group with per-library toggles to control which libraries appear on the home screen. Libraries toggled off are hidden from both phone and TV home screens but remain accessible via the Libraries tab and navigation drawer. --- .../core/feature/browse/home/AppViewModel.kt | 45 +++++++++++-------- .../settings/HomeLibrarySettingsProvider.kt | 35 +++++++++++++++ .../settings/SettingsGroupProviderModule.kt | 5 +++ 3 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 core/src/main/java/hu/bbara/purefin/core/feature/settings/HomeLibrarySettingsProvider.kt diff --git a/core/src/main/java/hu/bbara/purefin/core/feature/browse/home/AppViewModel.kt b/core/src/main/java/hu/bbara/purefin/core/feature/browse/home/AppViewModel.kt index 94d198f6..e73761e0 100644 --- a/core/src/main/java/hu/bbara/purefin/core/feature/browse/home/AppViewModel.kt +++ b/core/src/main/java/hu/bbara/purefin/core/feature/browse/home/AppViewModel.kt @@ -9,6 +9,7 @@ import hu.bbara.purefin.core.data.NetworkMonitor import hu.bbara.purefin.core.data.UserSessionRepository import hu.bbara.purefin.core.download.MediaDownloadController import hu.bbara.purefin.core.jellyfin.JellyfinMediaMetadataUpdater +import hu.bbara.purefin.core.settings.SettingsRepository import hu.bbara.purefin.core.model.EpisodeUiModel import hu.bbara.purefin.core.model.LibraryUiModel import hu.bbara.purefin.core.model.MediaUiModel @@ -41,6 +42,7 @@ class AppViewModel @Inject constructor( private val jellyfinMediaMetadataUpdater: JellyfinMediaMetadataUpdater, private val navigationManager: NavigationManager, private val mediaDownloadManager: MediaDownloadController, + private val settingsRepository: SettingsRepository, networkMonitor: NetworkMonitor, ) : ViewModel() { @@ -147,26 +149,31 @@ class AppViewModel @Inject constructor( homeRepository.latestLibraryContent, localMediaRepository.movies, localMediaRepository.series, - localMediaRepository.episodes - ) { libraryMap, moviesMap, seriesMap, episodesMap -> - libraryMap.mapValues { (_, items) -> - items.mapNotNull { media -> - when (media) { - is Media.MovieMedia -> moviesMap[media.movieId]?.let { - MovieUiModel(movie = it) + localMediaRepository.episodes, + settingsRepository.settings, + ) { libraryMap, moviesMap, seriesMap, episodesMap, settings -> + libraryMap + .filter { (libraryId, _) -> + settings.booleanSettings["home_library_visible_$libraryId"] ?: true + } + .mapValues { (_, items) -> + items.mapNotNull { media -> + when (media) { + is Media.MovieMedia -> moviesMap[media.movieId]?.let { + MovieUiModel(movie = it) + } + is Media.EpisodeMedia -> episodesMap[media.episodeId]?.let { + EpisodeUiModel(episode = it) + } + is Media.SeriesMedia -> seriesMap[media.seriesId]?.let { + SeriesUiModel(series = it) + } + is Media.SeasonMedia -> seriesMap[media.seriesId]?.let { + SeriesUiModel(series = it) + } } - is Media.EpisodeMedia -> episodesMap[media.episodeId]?.let { - EpisodeUiModel(episode = it) - } - is Media.SeriesMedia -> seriesMap[media.seriesId]?.let { - SeriesUiModel(series = it) - } - is Media.SeasonMedia -> seriesMap[media.seriesId]?.let { - SeriesUiModel(series = it) - } - } - }.distinctBy { it.id } - } + }.distinctBy { it.id } + } }.stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), diff --git a/core/src/main/java/hu/bbara/purefin/core/feature/settings/HomeLibrarySettingsProvider.kt b/core/src/main/java/hu/bbara/purefin/core/feature/settings/HomeLibrarySettingsProvider.kt new file mode 100644 index 00000000..abaf738e --- /dev/null +++ b/core/src/main/java/hu/bbara/purefin/core/feature/settings/HomeLibrarySettingsProvider.kt @@ -0,0 +1,35 @@ +package hu.bbara.purefin.core.feature.settings + +import hu.bbara.purefin.core.data.HomeRepository +import hu.bbara.purefin.core.settings.BooleanSetting +import hu.bbara.purefin.core.settings.SettingGroup +import hu.bbara.purefin.core.settings.SettingsGroupProvider +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class HomeLibrarySettingsProvider @Inject constructor( + private val homeRepository: HomeRepository, +) : SettingsGroupProvider { + + override val settingGroups: Flow> = homeRepository.libraries.map { libraries -> + if (libraries.isEmpty()) return@map emptyList() + + val options = libraries.map { library -> + BooleanSetting( + key = "home_library_visible_${library.id}", + title = library.name, + defaultValue = true + ) + } + + listOf( + SettingGroup( + title = "Home Screen Libraries", + options = options + ) + ) + } +} diff --git a/core/src/main/java/hu/bbara/purefin/core/settings/SettingsGroupProviderModule.kt b/core/src/main/java/hu/bbara/purefin/core/settings/SettingsGroupProviderModule.kt index 75a7078f..475f7492 100644 --- a/core/src/main/java/hu/bbara/purefin/core/settings/SettingsGroupProviderModule.kt +++ b/core/src/main/java/hu/bbara/purefin/core/settings/SettingsGroupProviderModule.kt @@ -5,6 +5,7 @@ import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import dagger.multibindings.IntoSet +import hu.bbara.purefin.core.feature.settings.HomeLibrarySettingsProvider import hu.bbara.purefin.core.feature.settings.LogoutSettingsProvider import hu.bbara.purefin.core.feature.update.AppUpdateController @@ -16,6 +17,10 @@ abstract class SettingsGroupProviderModule { @IntoSet abstract fun bindAppUpdateSettingsProvider(impl: AppUpdateController): SettingsGroupProvider + @Binds + @IntoSet + abstract fun bindHomeLibrarySettingsProvider(impl: HomeLibrarySettingsProvider): SettingsGroupProvider + @Binds @IntoSet abstract fun bindLogoutSettingsProvider(impl: LogoutSettingsProvider): SettingsGroupProvider