Browse Source

Compose TV: cleanup obsolete code

merge-requests/2332/head
Nicolas Pomepuy 9 months ago
parent
commit
ae44d5acfd
  1. 48
      application/television/src/main/java/org/videolan/television/ui/compose/composable/components/VLCTabs.kt
  2. 2
      application/television/src/main/java/org/videolan/television/ui/compose/composable/items/AudioItem.kt
  3. 5
      application/television/src/main/java/org/videolan/television/ui/compose/composable/items/VideoItem.kt
  4. 7
      application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/AudioList.kt
  5. 1
      application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/BrowseList.kt
  6. 1
      application/television/src/main/java/org/videolan/television/ui/compose/composable/screens/MainScreen.kt
  7. 111
      application/television/src/main/java/org/videolan/television/viewmodel/BrowserViewModel.kt

48
application/television/src/main/java/org/videolan/television/ui/compose/composable/components/VLCTabs.kt

@ -1,48 +0,0 @@
/*
* ************************************************************************
* VLCTabs.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.ui.compose.composable.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import org.videolan.television.ui.compose.theme.White
import org.videolan.television.ui.compose.theme.WhiteTransparent50
@Composable
fun RoundedRectangleIndicator(hasFocus: Boolean, modifier: Modifier) {
Box(modifier
.padding(0.dp)
.fillMaxSize()
.clip(RoundedCornerShape(50))
.background(if (hasFocus) White else WhiteTransparent50))
}

2
application/television/src/main/java/org/videolan/television/ui/compose/composable/items/AudioItem.kt

@ -232,8 +232,6 @@ fun AudioItemList(item: MediaLibraryItem, modifier: Modifier = Modifier, spannab
.onFocusChanged {
focused.value = it.isFocused
}
// .border(vlcBorder(focused.value))
// .padding(vertical = if (focused.value) 8.dp else 0.dp)
.background(color = if (focused.value) WhiteTransparent10 else WhiteTransparent05, shape = MaterialTheme.shapes.medium)
.combinedClickable(
onClick = {

5
application/television/src/main/java/org/videolan/television/ui/compose/composable/items/VideoItem.kt

@ -234,11 +234,6 @@ fun MediaLibraryItem.getVideoDescription(context: Context, inList: Boolean) = wh
is MediaWrapper -> {
if (length > 0) {
val resolution = generateResolutionClass(width, height)
// val lastTime = displayTime
// if (lastTime > 0) {
// max = (length / 1000).toInt()
// progress = (lastTime / 1000).toInt()
// }
if (inList && resolution !== null) {
"${Tools.millisToString(length)}$resolution"
} else Tools.millisToString(length)

7
application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/AudioList.kt

@ -173,7 +173,6 @@ fun MediaList(entry: AudioListEntry) {
InvalidationComposable { invalidate ->
val context = LocalContext.current
val viewModel: MedialibraryViewModel
val provider: MedialibraryProvider<out MediaLibraryItem>
when(entry) {
@ -190,8 +189,7 @@ fun MediaList(entry: AudioListEntry) {
factory = PlaylistsViewModel.Factory,
extras = extras,
)
provider = (playlistsViewModel as PlaylistsViewModel).provider
viewModel = playlistsViewModel
provider = playlistsViewModel.provider
}
else -> {
val extras = MutableCreationExtras().apply {
@ -201,8 +199,7 @@ fun MediaList(entry: AudioListEntry) {
factory = AudioBrowserViewModel.Factory,
extras = extras,
)
provider = (audioBrowserViewModel as AudioBrowserViewModel).getProvider(entry)
viewModel = audioBrowserViewModel
provider = audioBrowserViewModel.getProvider(entry)
}
}

1
application/television/src/main/java/org/videolan/television/ui/compose/composable/lists/BrowseList.kt

@ -40,7 +40,6 @@ import androidx.lifecycle.viewmodel.MutableCreationExtras
import androidx.lifecycle.viewmodel.compose.viewModel
import org.videolan.television.R
import org.videolan.television.ui.compose.composable.components.ContentLine
import org.videolan.television.viewmodel.BrowserViewModel
import org.videolan.vlc.viewmodels.browser.BrowserFavoritesModel
import org.videolan.vlc.viewmodels.browser.BrowserModel
import org.videolan.vlc.viewmodels.browser.NetworkModel

1
application/television/src/main/java/org/videolan/television/ui/compose/composable/screens/MainScreen.kt

@ -192,7 +192,6 @@ fun Tabs(modifier: Modifier = Modifier, viewModel: MainActivityViewModel = viewM
Box(
Modifier
.fillMaxSize()
// .border(2.dp, if (hasFocus) MaterialTheme.colorScheme.secondary else MaterialTheme.colorScheme.secondary.copy(alpha = 0.5f), RoundedCornerShape(50))
.background(if (hasFocus) White else WhiteTransparent50, RoundedCornerShape(50))
)
},

111
application/television/src/main/java/org/videolan/television/viewmodel/BrowserViewModel.kt

@ -1,111 +0,0 @@
/*
* ************************************************************************
* BrowserViewModel.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 androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.DummyItem
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.AndroidDevices
import org.videolan.resources.HEADER_NETWORK
import org.videolan.resources.HEADER_SERVER
import org.videolan.resources.HEADER_STREAM
import org.videolan.television.ui.FAVORITE_FLAG
import org.videolan.tools.NetworkMonitor
import org.videolan.vlc.ExternalMonitor
import org.videolan.vlc.mediadb.models.BrowserFav
import org.videolan.vlc.repository.BrowserFavRepository
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.vlc.util.convertFavorites
import org.videolan.vlc.util.scanAllowed
class BrowserViewModel(app: Application) : TvMediaViewModel(app) {
private var updatedFavoriteList: List<MediaWrapper> = listOf()
val favoritesList: LiveData<List<MediaLibraryItem>> = MutableLiveData()
private val showInternalStorage = AndroidDevices.showInternalStorage()
private val networkMonitor = NetworkMonitor.getInstance(getContext())
val browsers: LiveData<List<MediaLibraryItem>> = MutableLiveData()
private val updateActor = viewModelScope.actor<Unit>(capacity = Channel.CONFLATED) {
for (action in channel) updateBrowsers()
}
private val browserFavRepository = BrowserFavRepository.getInstance(getContext())
private val favorites: LiveData<List<BrowserFav>> = browserFavRepository.getFavDao().asLiveData(viewModelScope.coroutineContext)
@OptIn(ExperimentalCoroutinesApi::class)
private val favObserver = Observer<List<BrowserFav>> { list ->
updatedFavoriteList = convertFavorites(list)
if (!updateActor.isClosedForSend) updateActor.trySend(Unit)
}
val favoritesLoading = MutableLiveData(false)
val browsersLoading = MutableLiveData(false)
init {
networkMonitor.connectionFlow.onEach { updateActor.trySend(Unit) }.launchIn(viewModelScope)
ExternalMonitor.storageEvents.onEach { updateActor.trySend(Unit) }.launchIn(viewModelScope)
updateActor.trySend(Unit)
favorites.observeForever(favObserver)
}
override fun onCleared() {
super.onCleared()
favorites.removeObserver(favObserver)
}
private suspend fun updateBrowsers() {
val favList = mutableListOf<MediaLibraryItem>()
updatedFavoriteList.forEach {
it.description = it.uri.scheme
it.addFlags(FAVORITE_FLAG)
favList.add(it)
}
(favoritesList as MutableLiveData).value = favList
val list = mutableListOf<MediaLibraryItem>()
val directories = DirectoryRepository.getInstance(getContext()).getMediaDirectoriesList(getContext()).toMutableList()
if (!showInternalStorage && directories.isNotEmpty()) directories.removeAt(0)
directories.forEach { if (it.location.scanAllowed()) list.add(it) }
if (networkMonitor.isLan) {
list.add(DummyItem(HEADER_NETWORK, getContext().getString(org.videolan.vlc.R.string.network_browsing), null))
list.add(DummyItem(HEADER_STREAM, getContext().getString(org.videolan.vlc.R.string.streams), null))
list.add(DummyItem(HEADER_SERVER, getContext().getString(org.videolan.vlc.R.string.server_add_title), null))
}
(browsers as MutableLiveData).value = list
delay(500L)
}
}
Loading…
Cancel
Save