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.
This commit is contained in:
Purefin Dev
2026-05-21 19:38:15 +00:00
parent 1274ab25f9
commit 645e28ab30
3 changed files with 66 additions and 19 deletions

View File

@@ -9,6 +9,7 @@ import hu.bbara.purefin.core.data.NetworkMonitor
import hu.bbara.purefin.core.data.UserSessionRepository import hu.bbara.purefin.core.data.UserSessionRepository
import hu.bbara.purefin.core.download.MediaDownloadController import hu.bbara.purefin.core.download.MediaDownloadController
import hu.bbara.purefin.core.jellyfin.JellyfinMediaMetadataUpdater 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.EpisodeUiModel
import hu.bbara.purefin.core.model.LibraryUiModel import hu.bbara.purefin.core.model.LibraryUiModel
import hu.bbara.purefin.core.model.MediaUiModel import hu.bbara.purefin.core.model.MediaUiModel
@@ -41,6 +42,7 @@ class AppViewModel @Inject constructor(
private val jellyfinMediaMetadataUpdater: JellyfinMediaMetadataUpdater, private val jellyfinMediaMetadataUpdater: JellyfinMediaMetadataUpdater,
private val navigationManager: NavigationManager, private val navigationManager: NavigationManager,
private val mediaDownloadManager: MediaDownloadController, private val mediaDownloadManager: MediaDownloadController,
private val settingsRepository: SettingsRepository,
networkMonitor: NetworkMonitor, networkMonitor: NetworkMonitor,
) : ViewModel() { ) : ViewModel() {
@@ -147,26 +149,31 @@ class AppViewModel @Inject constructor(
homeRepository.latestLibraryContent, homeRepository.latestLibraryContent,
localMediaRepository.movies, localMediaRepository.movies,
localMediaRepository.series, localMediaRepository.series,
localMediaRepository.episodes localMediaRepository.episodes,
) { libraryMap, moviesMap, seriesMap, episodesMap -> settingsRepository.settings,
libraryMap.mapValues { (_, items) -> ) { libraryMap, moviesMap, seriesMap, episodesMap, settings ->
items.mapNotNull { media -> libraryMap
when (media) { .filter { (libraryId, _) ->
is Media.MovieMedia -> moviesMap[media.movieId]?.let { settings.booleanSettings["home_library_visible_$libraryId"] ?: true
MovieUiModel(movie = it) }
.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 { }.distinctBy { it.id }
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 }
}
}.stateIn( }.stateIn(
scope = viewModelScope, scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000), started = SharingStarted.WhileSubscribed(5_000),

View File

@@ -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<List<SettingGroup>> = 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
)
)
}
}

View File

@@ -5,6 +5,7 @@ import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet 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.settings.LogoutSettingsProvider
import hu.bbara.purefin.core.feature.update.AppUpdateController import hu.bbara.purefin.core.feature.update.AppUpdateController
@@ -16,6 +17,10 @@ abstract class SettingsGroupProviderModule {
@IntoSet @IntoSet
abstract fun bindAppUpdateSettingsProvider(impl: AppUpdateController): SettingsGroupProvider abstract fun bindAppUpdateSettingsProvider(impl: AppUpdateController): SettingsGroupProvider
@Binds
@IntoSet
abstract fun bindHomeLibrarySettingsProvider(impl: HomeLibrarySettingsProvider): SettingsGroupProvider
@Binds @Binds
@IntoSet @IntoSet
abstract fun bindLogoutSettingsProvider(impl: LogoutSettingsProvider): SettingsGroupProvider abstract fun bindLogoutSettingsProvider(impl: LogoutSettingsProvider): SettingsGroupProvider