Skip to content
Snippets Groups Projects
Commit b1e5cddd authored by Geoffrey Métais's avatar Geoffrey Métais
Browse files

Delete VideosModel.kt

Paged model is used instead
parent 851aa7f3
No related branches found
No related tags found
No related merge requests found
......@@ -39,6 +39,7 @@ import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.Medialibrary
import org.videolan.medialibrary.media.DummyItem
......@@ -55,7 +56,6 @@ import org.videolan.vlc.repository.BrowserFavRepository
import org.videolan.vlc.repository.DirectoryRepository
import org.videolan.vlc.util.*
import org.videolan.vlc.viewmodels.HistoryModel
import org.videolan.vlc.viewmodels.VideosModel
private const val NUM_ITEMS_PREVIEW = 5
private const val TAG = "VLC/MainTvFragment"
......@@ -65,7 +65,6 @@ private const val TAG = "VLC/MainTvFragment"
class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnItemViewClickedListener, View.OnClickListener, Observer<MutableList<MediaWrapper>> {
private var backgroundManager: BackgroundManager? = null
private lateinit var videoModel: VideosModel
private lateinit var historyModel: HistoryModel
private lateinit var rowsAdapter: ArrayObjectAdapter
......@@ -153,11 +152,6 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
rowsAdapter.add(miscRow)
adapter = rowsAdapter
videoModel = VideosModel.get(requireContext(), this, Medialibrary.SORT_INSERTIONDATE, -1, desc = true, group = null)
videoModel.dataset.observe(this, Observer {
updateVideos(it)
(requireActivity() as MainTvActivity).hideLoading()
})
ExternalMonitor.connected.observe(this, Observer { updateActor.offer(Browsers) })
ExternalMonitor.storageUnplugged.observe(this, Observer { updateActor.offer(Browsers) })
ExternalMonitor.storagePlugged.observe(this, Observer { updateActor.offer(Browsers) })
......@@ -165,11 +159,6 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
onItemViewSelectedListener = this
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val browsePath = activity?.intent?.getStringExtra(EXTRA_PATH) ?: return
}
fun updateAudioCategories(current: DummyItem? = null) {
val list = mutableListOf<MediaLibraryItem>(
DummyItem(CATEGORY_ARTISTS, getString(R.string.artists), ""),
......@@ -177,7 +166,7 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
DummyItem(CATEGORY_GENRES, getString(R.string.genres), ""),
DummyItem(CATEGORY_SONGS, getString(R.string.tracks), "")
)
if (current !== null) list.add(0, current)
current?.let { list.add(0, it) }
categoriesAdapter.setItems(list.toList(), diffCallback)
}
......@@ -185,10 +174,10 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
super.onStart()
if (restart) {
if (this::historyModel.isInitialized) historyModel.refresh()
videoModel.refresh()
} else restart = true
if (selectedItem is MediaWrapper) TvUtil.updateBackground(backgroundManager, selectedItem)
setHistoryModel()
updateVideos()
}
override fun onStop() {
......@@ -265,7 +254,6 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
}
else -> {
val model = if (row?.id == HEADER_HISTORY && this::historyModel.isInitialized) historyModel
else if (row?.id == HEADER_VIDEO && this::videoModel.isInitialized) videoModel
else null
TvUtil.openMedia(activity, item, model)
}
......@@ -315,14 +303,14 @@ class MainTvFragment : BrowseSupportFragment(), OnItemViewSelectedListener, OnIt
}
}
private fun updateVideos(videos: List<MediaWrapper>?) {
videos?.let {
//TODO Move in a ViewModel
private fun updateVideos() = coroutineScope.launch {
context?.getFromMl {
getPagedVideos(Medialibrary.SORT_INSERTIONDATE, true, NUM_ITEMS_PREVIEW, 0)
}?.let {
val list = mutableListOf<Any>()
list.add(DummyItem(HEADER_VIDEO, getString(R.string.videos_all), resources.getQuantityString(R.plurals.videos_quantity, it.size, it.size)))
if (!it.isEmpty()) for ((index, video) in it.withIndex()) {
if (index == NUM_ITEMS_PREVIEW) break
list.add(video)
}
list.addAll(it)
videoAdapter.setItems(list, diffCallback)
}
}
......
......@@ -143,9 +143,11 @@ object TvUtil {
activity.startActivity(intent)
}
else -> {
val list = (model!!.dataset.value as List<MediaWrapper>).filter { it.type != MediaWrapper.TYPE_DIR }
val position = list.getposition(item)
MediaUtils.openList(activity, list, position)
model?.run {
val list = (dataset.value as List<MediaWrapper>).filter { it.type != MediaWrapper.TYPE_DIR }
val position = list.getposition(item)
MediaUtils.openList(activity, list, position)
} ?: MediaUtils.openMedia(activity, item)
}
}
is DummyItem -> when {
......
/*****************************************************************************
* VideosModel.kt
*****************************************************************************
* Copyright © 2018 VLC authors and VideoLAN
*
* 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.vlc.viewmodels
import android.annotation.TargetApi
import android.content.Context
import android.os.Build
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.isActive
import kotlinx.coroutines.withContext
import org.videolan.libvlc.util.AndroidUtil
import org.videolan.medialibrary.Medialibrary
import org.videolan.medialibrary.media.Folder
import org.videolan.medialibrary.media.MediaWrapper
import org.videolan.vlc.R
import org.videolan.vlc.media.MediaGroup
import org.videolan.vlc.media.getAll
import org.videolan.vlc.util.AndroidDevices
import org.videolan.vlc.util.Settings
import org.videolan.vlc.util.launchChannelUpdate
@ExperimentalCoroutinesApi
open class VideosModel(context: Context, private val group: String?, val folder : Folder?, private val minGroupLen: Int, customSort : Int, customDesc: Boolean?) : MedialibraryModel<MediaWrapper>(context), Medialibrary.MediaCb {
override val sortKey = "${super.sortKey}_$group"
override fun canSortByFileNameName() = true
override fun canSortByDuration() = true
override fun canSortByLastModified() = folder == null
private val thumbObs = Observer<MediaWrapper> { media -> if (!updateActor.isClosedForSend) updateActor.offer(MediaUpdate(listOf(media!!))) }
init {
sort = if (customSort != Medialibrary.SORT_DEFAULT) customSort
else Settings.getInstance(context).getInt(sortKey, Medialibrary.SORT_ALPHA)
desc = customDesc ?: Settings.getInstance(context).getBoolean(sortKey+"_desc", false)
Medialibrary.lastThumb.observeForever(thumbObs)
if (medialibrary.isStarted) {
medialibrary.addMediaCb(this)
refresh()
}
}
override fun onMediaAdded() {
refresh()
}
override fun onMediaModified() {
refresh()
}
@TargetApi(Build.VERSION_CODES.O)
override fun onMedialibraryIdle() {
super.onMedialibraryIdle()
if (AndroidDevices.isAndroidTv && AndroidUtil.isOOrLater) context.launchChannelUpdate()
}
override fun onMediaDeleted() {
refresh()
}
override suspend fun updateList() {
if (!isActive) return
dataset.value = withContext(Dispatchers.IO) {
if (!isActive) return@withContext mutableListOf<MediaWrapper>()
val list = medialibrary.getVideos(sort, desc)
val displayList = mutableListOf<MediaWrapper>()
when {
folder != null -> displayList.addAll(folder.getAll(Folder.TYPE_FOLDER_VIDEO, sort, desc))
group !== null -> {
val loGroup = group.toLowerCase()
for (item in list) {
val title = item.title.toLowerCase().let { if (it.startsWith("the")) it.substring(4) else it }
if (title.startsWith(loGroup)) displayList.add(item)
}
}
minGroupLen > 0 -> MediaGroup.group(list, minGroupLen, sort == Medialibrary.SORT_FILENAME).mapTo(displayList) {
if (it.size() > 1) { it.description = context.resources.getQuantityString(R.plurals.videos_quantity, it.size(), it.size()) }
it.media
}
else -> displayList.addAll(list)
}
displayList
}
}
override fun onMedialibraryReady() {
super.onMedialibraryReady()
medialibrary.addMediaCb(this)
}
override fun onCleared() {
medialibrary.removeMediaCb(this)
Medialibrary.lastThumb.removeObserver(thumbObs)
super.onCleared()
}
class Factory(
private val context: Context,
val group: String?,
private val folder : Folder?,
private val minGroupLen : Int,
private val sort : Int,
private val desc : Boolean?
): ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val length = if (minGroupLen == 0) Integer.valueOf(Settings.getInstance(context).getString("video_min_group_length", "6")!!) else minGroupLen
@Suppress("UNCHECKED_CAST")
return VideosModel(context.applicationContext, group, folder, length, sort, desc) as T
}
}
companion object {
fun get(
context: Context,
fragment: Fragment,
sort : Int = Medialibrary.SORT_DEFAULT,
minGroupLen : Int = 0,
desc : Boolean? = null,
group: String? = null,
folder: Folder? = null
) : VideosModel {
return ViewModelProviders.of(fragment, Factory(context, group, folder, minGroupLen, sort, desc)).get(VideosModel::class.java)
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment