diff --git a/application/television/src/main/java/org/videolan/television/ui/compose/composable/components/MediaListSidePanel.kt b/application/television/src/main/java/org/videolan/television/ui/compose/composable/components/MediaListSidePanel.kt index 0d34b8b4e..48a5aa05e 100644 --- a/application/television/src/main/java/org/videolan/television/ui/compose/composable/components/MediaListSidePanel.kt +++ b/application/television/src/main/java/org/videolan/television/ui/compose/composable/components/MediaListSidePanel.kt @@ -59,15 +59,12 @@ import androidx.compose.ui.graphics.shadow.Shadow import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel import kotlinx.coroutines.launch import org.videolan.television.R -import org.videolan.television.viewmodel.MediaListModelEntry -import org.videolan.television.viewmodel.MediaListsViewModel import org.videolan.vlc.viewmodels.mobile.VideoGroupingType @Composable -fun MediaListSidePanel(inCard: Boolean, listState: ScrollableState, grouping: VideoGroupingType? = null, viewModel: MediaListsViewModel = viewModel(), listener: (MediaListSidePanelListenerKey, Any) -> Unit = { _, _ -> }) { +fun MediaListSidePanel(inCard: Boolean, listState: ScrollableState, grouping: VideoGroupingType? = null, listener: (MediaListSidePanelListenerKey, Any) -> Unit = { _, _ -> }) { val coroutineScope = rememberCoroutineScope() val focusRequester = remember { FocusRequester() } Column( diff --git a/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/PlaylistsList.kt b/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/PlaylistsList.kt index cc536d41a..b270f5d8a 100644 --- a/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/PlaylistsList.kt +++ b/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/PlaylistsList.kt @@ -25,23 +25,11 @@ package org.videolan.television.ui.compose.composable.lists import androidx.compose.foundation.focusGroup -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.focus.focusProperties -import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import org.videolan.television.ui.compose.composable.components.VlcLoader -import org.videolan.television.ui.compose.composable.items.AudioItem -import org.videolan.television.viewmodel.MediaListModelEntry -import org.videolan.television.viewmodel.MediaListsViewModel @Composable fun PlaylistsList(onFocusExit: () -> Unit, onFocusEnter: () -> Unit) { diff --git a/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/VideoList.kt b/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/VideoList.kt index 3f898a1e4..2932cbe7a 100644 --- a/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/VideoList.kt +++ b/application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/VideoList.kt @@ -45,8 +45,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.key -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -77,7 +75,6 @@ import org.videolan.television.ui.compose.composable.items.VideoItemList import org.videolan.television.ui.compose.theme.White import org.videolan.television.ui.compose.theme.WhiteTransparent50 import org.videolan.television.viewmodel.MainActivityViewModel -import org.videolan.television.viewmodel.MediaListModelEntry import org.videolan.tools.KEY_GROUP_VIDEOS import org.videolan.tools.KEY_VIDEOS_CARDS import org.videolan.tools.KEY_VIDEO_TAB diff --git a/application/television/src/main/java/org/videolan/television/viewmodel/MediaListsViewModel.kt b/application/television/src/main/java/org/videolan/television/viewmodel/MediaListsViewModel.kt deleted file mode 100644 index 54c6afcd9..000000000 --- a/application/television/src/main/java/org/videolan/television/viewmodel/MediaListsViewModel.kt +++ /dev/null @@ -1,142 +0,0 @@ -/* - * ************************************************************************ - * MediaListsViewModel.kt - * ************************************************************************* - * Copyright © 2025 VLC authors and VideoLAN - * Author: Nicolas POMEPUY - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. - * ************************************************************************** - * - * - */ - -package org.videolan.television.viewmodel - -import android.app.Application -import android.content.Context -import androidx.core.content.edit -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch -import org.videolan.medialibrary.interfaces.Medialibrary -import org.videolan.medialibrary.interfaces.media.Folder -import org.videolan.medialibrary.interfaces.media.Playlist -import org.videolan.medialibrary.interfaces.media.VideoGroup -import org.videolan.medialibrary.media.MediaLibraryItem -import org.videolan.resources.GROUP_VIDEOS_NAME -import org.videolan.resources.MEDIALIBRARY_PAGE_SIZE -import org.videolan.resources.util.getFromMl -import org.videolan.tools.KEY_GROUP_VIDEOS -import org.videolan.tools.Settings -import org.videolan.vlc.providers.medialibrary.sanitizeGroups -import org.videolan.vlc.util.Permissions -import org.videolan.vlc.viewmodels.CallBackDelegate -import org.videolan.vlc.viewmodels.ICallBackHandler - -private const val TAG = "VLC/MediaListsViewModel" - -class MediaListsViewModel(app: Application) : TvMediaViewModel(app), ICallBackHandler by CallBackDelegate() { - - val lists = List(MediaListModelEntry.entries.size) { MutableLiveData>()} - val loadingStates = List(MediaListModelEntry.entries.size) { MutableLiveData(false)} - var videoGrouping = MutableLiveData(Settings.getInstance(getContext()).getString(KEY_GROUP_VIDEOS, GROUP_VIDEOS_NAME)) - - - init { - @Suppress("LeakingThis") - viewModelScope.registerCallBacks { refresh() } - - } - - fun load(entry: MediaListModelEntry, page: Int) = viewModelScope.launch { - setLoading(entry.getLoadingState(this@MediaListsViewModel), true) - if (!Permissions.canReadStorage(getContext())) { - showPermissionItem(entry.getMediaList(this@MediaListsViewModel)) - return@launch - } - getContext().getFromMl { - entry.getQuery(this, page) - }.let { newList -> - entry.getMediaList(this@MediaListsViewModel).value = mutableListOf().apply { - entry.getMediaList(this@MediaListsViewModel).value?.let { oldList -> - addAll(oldList) - } - addAll(if (entry == MediaListModelEntry.VIDEO_GROUP) (newList as Array).sanitizeGroups() else newList) - }.distinctBy { it.id } - } - setLoading(entry.getLoadingState(this@MediaListsViewModel), false) - } - - - fun refresh() { - MediaListModelEntry.entries.forEach { - it.currentPage = 0 - lists[it.ordinal].value = emptyList() - load(it, 0) - } - } - - fun loadMore(entry: MediaListModelEntry) { - entry.currentPage++ - entry.updateMediaList(this, entry.currentPage) - } - - fun changeDisplayInCard(entry: MediaListModelEntry) { - Settings.getInstance(getContext()).edit { putBoolean(entry.inCardsKey, !entry.displayInCard(getContext())) } - load(entry, 0) - entry.currentPage = 0 - } - - fun setVideoGrouping(grouping: String) { - Settings.getInstance(getContext()).edit { putString(KEY_GROUP_VIDEOS, grouping) } - videoGrouping.postValue(grouping) - } -} - -enum class MediaListModelEntry(var currentPage:Int = -1, val inCardsKey: String, val defaultInCard: Boolean) { - VIDEO(inCardsKey = "video_display_in_cards", defaultInCard = true), - VIDEO_GROUP(inCardsKey = "video_display_in_cards", defaultInCard = true), - VIDEO_FOLDER(inCardsKey = "video_display_in_cards", defaultInCard = true), - ARTISTS(inCardsKey = "display_mode_audio_browser_artists", defaultInCard = true), - ALBUMS(inCardsKey = "display_mode_audio_browser_albums", defaultInCard = true), - TRACKS(inCardsKey = "display_mode_audio_browser_track", defaultInCard = false), - GENRES(inCardsKey = "display_mode_audio_browser_genres", defaultInCard = false), - AUDIO_PLAYLISTS(inCardsKey = "display_mode_playlists_AudioOnly", defaultInCard = true), - VIDEO_PLAYLISTS(inCardsKey = "display_mode_playlists_Video", defaultInCard = true), - ALL_PLAYLISTS(inCardsKey = "display_mode_playlists_All", defaultInCard = false); - - fun updateMediaList(viewModel: MediaListsViewModel, page: Int) = viewModel.load(this, page) - - fun getMediaList(viewModel: MediaListsViewModel) = viewModel.lists[ordinal] - - fun getLoadingState(viewModel: MediaListsViewModel) = viewModel.loadingStates[ordinal] - - fun getQuery(medialibrary: Medialibrary, page: Int) = when (this) { - VIDEO -> medialibrary.getPagedVideos(Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - VIDEO_GROUP -> medialibrary.getVideoGroups(Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - VIDEO_FOLDER -> medialibrary.getFolders(Folder.TYPE_FOLDER_VIDEO,Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - ARTISTS -> medialibrary.getPagedArtists(true, Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - ALBUMS -> medialibrary.getPagedAlbums(Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - TRACKS -> medialibrary.getPagedAudio(Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - GENRES -> medialibrary.getPagedGenres(Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - AUDIO_PLAYLISTS -> medialibrary.getPagedPlaylists(Playlist.Type.Audio, Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - VIDEO_PLAYLISTS -> medialibrary.getPagedPlaylists(Playlist.Type.VideoOnly, Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - ALL_PLAYLISTS -> medialibrary.getPagedPlaylists(Playlist.Type.All, Medialibrary.SORT_INSERTIONDATE, true, true, false, MEDIALIBRARY_PAGE_SIZE, page* MEDIALIBRARY_PAGE_SIZE) - } - - fun displayInCard(context: Context): Boolean { - return Settings.getInstance(context).getBoolean(inCardsKey, defaultInCard) - } -} \ No newline at end of file