Browse Source

Fix BrowserFavRepository functions

Make it suspend functions for consistency
3.3.x
Geoffrey Métais 6 years ago
committed by Nicolas Pomepuy
parent
commit
df48c5ccf7
  1. 18
      application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt
  2. 22
      application/television/src/main/java/org/videolan/television/ui/browser/FileBrowserTvFragment.kt
  3. 12
      application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt
  4. 9
      application/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt
  5. 14
      application/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt
  6. 4
      application/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt
  7. 11
      application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt

18
application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt

@ -303,18 +303,20 @@ class MediaItemDetailsFragment : DetailsSupportFragment(), CoroutineScope by Mai
ID_FAVORITE_ADD -> { ID_FAVORITE_ADD -> {
val uri = Uri.parse(viewModel.mediaItemDetails.location) val uri = Uri.parse(viewModel.mediaItemDetails.location)
val local = "file" == uri.scheme val local = "file" == uri.scheme
if (local) lifecycleScope.launch {
browserFavRepository.addLocalFavItem(uri, viewModel.mediaItemDetails.title if (local)
?: "", viewModel.mediaItemDetails.artworkUrl) browserFavRepository.addLocalFavItem(uri, viewModel.mediaItemDetails.title
else ?: "", viewModel.mediaItemDetails.artworkUrl)
browserFavRepository.addNetworkFavItem(uri, viewModel.mediaItemDetails.title else
?: "", viewModel.mediaItemDetails.artworkUrl) browserFavRepository.addNetworkFavItem(uri, viewModel.mediaItemDetails.title
?: "", viewModel.mediaItemDetails.artworkUrl)
}
actionsAdapter.set(ID_FAVORITE, actionDelete) actionsAdapter.set(ID_FAVORITE, actionDelete)
rowsAdapter.notifyArrayItemRangeChanged(0, rowsAdapter.size()) rowsAdapter.notifyArrayItemRangeChanged(0, rowsAdapter.size())
Toast.makeText(activity, R.string.favorite_added, Toast.LENGTH_SHORT).show() Toast.makeText(activity, R.string.favorite_added, Toast.LENGTH_SHORT).show()
} }
ID_FAVORITE_DELETE -> { ID_FAVORITE_DELETE -> {
browserFavRepository.deleteBrowserFav(Uri.parse(viewModel.mediaItemDetails.location)) lifecycleScope.launch { browserFavRepository.deleteBrowserFav(Uri.parse(viewModel.mediaItemDetails.location)) }
actionsAdapter.set(ID_FAVORITE, actionAdd) actionsAdapter.set(ID_FAVORITE, actionAdd)
rowsAdapter.notifyArrayItemRangeChanged(0, rowsAdapter.size()) rowsAdapter.notifyArrayItemRangeChanged(0, rowsAdapter.size())
Toast.makeText(activity, R.string.favorite_removed, Toast.LENGTH_SHORT).show() Toast.makeText(activity, R.string.favorite_removed, Toast.LENGTH_SHORT).show()
@ -342,7 +344,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment(), CoroutineScope by Mai
val cover = if (viewModel.media.type == MediaWrapper.TYPE_AUDIO || viewModel.media.type == MediaWrapper.TYPE_VIDEO) val cover = if (viewModel.media.type == MediaWrapper.TYPE_AUDIO || viewModel.media.type == MediaWrapper.TYPE_VIDEO)
withContext(Dispatchers.IO) { AudioUtil.readCoverBitmap(viewModel.mediaItemDetails.artworkUrl, 512) } withContext(Dispatchers.IO) { AudioUtil.readCoverBitmap(viewModel.mediaItemDetails.artworkUrl, 512) }
else null else null
val browserFavExists = withContext(Dispatchers.IO) { browserFavRepository.browserFavExists(Uri.parse(viewModel.mediaItemDetails.location)) } val browserFavExists = browserFavRepository.browserFavExists(Uri.parse(viewModel.mediaItemDetails.location))
val isDir = viewModel.media.type == MediaWrapper.TYPE_DIR val isDir = viewModel.media.type == MediaWrapper.TYPE_DIR
val canSave = isDir && withContext(Dispatchers.IO) { FileUtils.canSave(viewModel.media) } val canSave = isDir && withContext(Dispatchers.IO) { FileUtils.canSave(viewModel.media) }
if (activity.isFinishing) return@launchWhenStarted if (activity.isFinishing) return@launchWhenStarted

22
application/television/src/main/java/org/videolan/television/ui/browser/FileBrowserTvFragment.kt

@ -196,9 +196,7 @@ class FileBrowserTvFragment : BaseBrowserTvFragment<MediaLibraryItem>(), PathAda
animationDelegate.setVisibility(binding.favoriteButton, if (isRootLevel) View.GONE else View.VISIBLE) animationDelegate.setVisibility(binding.favoriteButton, if (isRootLevel) View.GONE else View.VISIBLE)
animationDelegate.setVisibility(binding.imageButtonFavorite, View.VISIBLE) animationDelegate.setVisibility(binding.imageButtonFavorite, View.VISIBLE)
animationDelegate.setVisibility(binding.favoriteDescription, View.VISIBLE) animationDelegate.setVisibility(binding.favoriteDescription, View.VISIBLE)
favExists = withContext(Dispatchers.IO) { favExists = (item as? MediaWrapper)?.let { browserFavRepository.browserFavExists(it.uri) } ?: false
(item as? MediaWrapper)?.let { browserFavRepository.browserFavExists(it.uri) } ?: false
}
binding.favoriteButton.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv) binding.favoriteButton.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv)
binding.imageButtonFavorite.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv) binding.imageButtonFavorite.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv)
} }
@ -251,15 +249,13 @@ class FileBrowserTvFragment : BaseBrowserTvFragment<MediaLibraryItem>(), PathAda
private val favoriteClickListener: (View) -> Unit = { private val favoriteClickListener: (View) -> Unit = {
lifecycleScope.launch { lifecycleScope.launch {
withContext(Dispatchers.IO) { val mw = (item as MediaWrapper)
val mw = (item as MediaWrapper) when {
when { browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri)
browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri) mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL)
mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL) else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
}
favExists = !favExists
} }
favExists = !favExists
if (!isRootLevel) binding.favoriteButton.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv) if (!isRootLevel) binding.favoriteButton.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv)
binding.imageButtonFavorite.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv) binding.imageButtonFavorite.setImageResource(if (favExists) R.drawable.ic_menu_fav_tv else R.drawable.ic_menu_not_fav_tv)
} }
@ -285,8 +281,8 @@ class FileBrowserTvFragment : BaseBrowserTvFragment<MediaLibraryItem>(), PathAda
when(dialog) { when(dialog) {
is Dialog.LoginDialog -> goBack() is Dialog.LoginDialog -> goBack()
is Dialog.ErrorMessage -> { is Dialog.ErrorMessage -> {
view?.let { Snackbar.make(it, "${dialog.title}: ${dialog.text}", Snackbar.LENGTH_LONG).show() } view?.let { Snackbar.make(it, "${dialog.title}: ${dialog.text}", Snackbar.LENGTH_LONG).show() }
goBack() goBack()
} }
} }
} }

12
application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt

@ -457,12 +457,10 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
private fun toggleFavorite() = lifecycleScope.launch { private fun toggleFavorite() = lifecycleScope.launch {
val mw = currentMedia ?: return@launch val mw = currentMedia ?: return@launch
withContext(Dispatchers.IO) { when {
when { browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri)
browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri) mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL)
mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL) else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
}
} }
activity?.invalidateOptionsMenu() activity?.invalidateOptionsMenu()
} }
@ -507,7 +505,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
val isFileBrowser = this@BaseBrowserFragment is FileBrowserFragment && item.uri.scheme == "file" val isFileBrowser = this@BaseBrowserFragment is FileBrowserFragment && item.uri.scheme == "file"
val isNetworkBrowser = this@BaseBrowserFragment is NetworkBrowserFragment val isNetworkBrowser = this@BaseBrowserFragment is NetworkBrowserFragment
if (isFileBrowser || isNetworkBrowser) { if (isFileBrowser || isNetworkBrowser) {
val favExists = withContext(Dispatchers.IO) { browserFavRepository.browserFavExists(mw.uri) } val favExists = browserFavRepository.browserFavExists(mw.uri)
flags = if (favExists) { flags = if (favExists) {
if (isNetworkBrowser) flags or CTX_FAV_EDIT or CTX_FAV_REMOVE if (isNetworkBrowser) flags or CTX_FAV_EDIT or CTX_FAV_REMOVE
else flags or CTX_FAV_REMOVE else flags or CTX_FAV_REMOVE

9
application/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt

@ -31,14 +31,11 @@ import android.view.MenuInflater
import android.view.View import android.view.View
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.consumeAsFlow import kotlinx.coroutines.flow.consumeAsFlow
import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.MLServiceLocator import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.media.MediaWrapper import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem import org.videolan.medialibrary.media.MediaLibraryItem
@ -137,7 +134,7 @@ open class FileBrowserFragment : BaseBrowserFragment() {
override fun onCtxAction(position: Int, option: Int) { override fun onCtxAction(position: Int, option: Int) {
val mw = this.adapter.getItem(position) as MediaWrapper? val mw = this.adapter.getItem(position) as MediaWrapper?
when (option) { when (option) {
CTX_FAV_ADD -> browserFavRepository.addLocalFavItem(mw!!.uri, mw.title, mw.artworkURL) CTX_FAV_ADD -> lifecycleScope.launch { browserFavRepository.addLocalFavItem(mw!!.uri, mw.title, mw.artworkURL) }
else -> super.onCtxAction(position, option) else -> super.onCtxAction(position, option)
} }
} }
@ -159,7 +156,7 @@ open class FileBrowserFragment : BaseBrowserFragment() {
val isScanned = withContext(Dispatchers.IO) { MedialibraryUtils.isScanned(it) } val isScanned = withContext(Dispatchers.IO) { MedialibraryUtils.isScanned(it) }
menu.findItem(R.id.ml_menu_scan)?.isVisible = !isRootDirectory && it.startsWith("file") && !isScanned menu.findItem(R.id.ml_menu_scan)?.isVisible = !isRootDirectory && it.startsWith("file") && !isScanned
} }
val isFavorite = mrl != null && withContext(Dispatchers.IO) { browserFavRepository.browserFavExists(Uri.parse(mrl)) } val isFavorite = mrl != null && browserFavRepository.browserFavExists(Uri.parse(mrl))
item.setIcon(if (isFavorite) item.setIcon(if (isFavorite)
R.drawable.ic_menu_bookmark_w R.drawable.ic_menu_bookmark_w
else else

14
application/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt

@ -32,10 +32,7 @@ import androidx.lifecycle.ViewModelProviders
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.withContext
import org.videolan.libvlc.Dialog import org.videolan.libvlc.Dialog
import org.videolan.medialibrary.interfaces.media.MediaWrapper import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.CTX_FAV_ADD import org.videolan.resources.CTX_FAV_ADD
@ -85,11 +82,8 @@ class NetworkBrowserFragment : BaseBrowserFragment(), IDialogManager {
val item = menu.findItem(R.id.ml_menu_save) val item = menu.findItem(R.id.ml_menu_save)
item.isVisible = !isRootDirectory item.isVisible = !isRootDirectory
lifecycleScope.launchWhenStarted { lifecycleScope.launchWhenStarted {
val isFavorite = mrl != null && withContext(Dispatchers.IO) { browserFavRepository.browserFavExists(Uri.parse(mrl)) } val isFavorite = mrl != null && browserFavRepository.browserFavExists(Uri.parse(mrl))
item.setIcon(if (isFavorite) item.setIcon(if (isFavorite) R.drawable.ic_menu_bookmark_w else R.drawable.ic_menu_bookmark_outline_w)
R.drawable.ic_menu_bookmark_w
else
R.drawable.ic_menu_bookmark_outline_w)
item.setTitle(if (isFavorite) R.string.favorites_remove else R.string.favorites_add) item.setTitle(if (isFavorite) R.string.favorites_remove else R.string.favorites_add)
} }
} }
@ -126,7 +120,7 @@ class NetworkBrowserFragment : BaseBrowserFragment(), IDialogManager {
override fun onCtxAction(position: Int, option: Int) { override fun onCtxAction(position: Int, option: Int) {
val mw = this.adapter.getItem(position) as MediaWrapper val mw = this.adapter.getItem(position) as MediaWrapper
when (option) { when (option) {
CTX_FAV_ADD -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL) CTX_FAV_ADD -> lifecycleScope.launch { browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL) }
CTX_FAV_EDIT -> showAddServerDialog(mw) CTX_FAV_EDIT -> showAddServerDialog(mw)
else -> super.onCtxAction(position, option) else -> super.onCtxAction(position, option)
} }

4
application/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt

@ -125,9 +125,10 @@ class NetworkServerDialog : DialogFragment(), AdapterView.OnItemSelectedListener
else else
editServername.text.toString() editServername.text.toString()
val uri = Uri.parse(url.text.toString()) val uri = Uri.parse(url.text.toString())
AppScope.launch(Dispatchers.IO) { AppScope.launch {
if (::networkUri.isInitialized) browserFavRepository.deleteBrowserFav(networkUri) if (::networkUri.isInitialized) browserFavRepository.deleteBrowserFav(networkUri)
browserFavRepository.addNetworkFavItem(uri, name, null) browserFavRepository.addNetworkFavItem(uri, name, null)
dismiss()
} }
} }
@ -229,7 +230,6 @@ class NetworkServerDialog : DialogFragment(), AdapterView.OnItemSelectedListener
when (v.id) { when (v.id) {
R.id.server_save -> { R.id.server_save -> {
saveServer() saveServer()
dismiss()
} }
R.id.server_cancel -> dismiss() R.id.server_cancel -> dismiss()
} }

11
application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt

@ -27,6 +27,7 @@ import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.asLiveData import androidx.lifecycle.asLiveData
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.interfaces.media.MediaWrapper import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.AppContextProvider import org.videolan.resources.AppContextProvider
import org.videolan.resources.TYPE_LOCAL_FAV import org.videolan.resources.TYPE_LOCAL_FAV
@ -42,7 +43,7 @@ import org.videolan.vlc.util.convertFavorites
import java.util.* import java.util.*
class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedObject() { class BrowserFavRepository(private val browserFavDao: BrowserFavDao) {
private val networkMonitor = NetworkMonitor.getInstance(AppContextProvider.appContext) private val networkMonitor = NetworkMonitor.getInstance(AppContextProvider.appContext)
@ -52,11 +53,11 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedO
val localFavorites by lazy { browserFavDao.getAllLocalFavs() } val localFavorites by lazy { browserFavDao.getAllLocalFavs() }
fun addNetworkFavItem(uri: Uri, title: String, iconUrl: String?) = launch { suspend fun addNetworkFavItem(uri: Uri, title: String, iconUrl: String?) = withContext(Dispatchers.IO) {
browserFavDao.insert(BrowserFav(uri, TYPE_NETWORK_FAV, title, iconUrl)) browserFavDao.insert(BrowserFav(uri, TYPE_NETWORK_FAV, title, iconUrl))
} }
fun addLocalFavItem(uri: Uri, title: String, iconUrl: String? = null) = launch { suspend fun addLocalFavItem(uri: Uri, title: String, iconUrl: String? = null) = withContext(Dispatchers.IO) {
browserFavDao.insert(BrowserFav(uri, TYPE_LOCAL_FAV, title, iconUrl)) browserFavDao.insert(BrowserFav(uri, TYPE_LOCAL_FAV, title, iconUrl))
} }
@ -71,9 +72,9 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedO
} }
@WorkerThread @WorkerThread
fun browserFavExists(uri: Uri): Boolean = browserFavDao.get(uri).isNotEmpty() suspend fun browserFavExists(uri: Uri): Boolean = withContext(Dispatchers.IO) { browserFavDao.get(uri).isNotEmpty() }
fun deleteBrowserFav(uri: Uri) = launch { browserFavDao.delete(uri) } suspend fun deleteBrowserFav(uri: Uri) = withContext(Dispatchers.IO) { browserFavDao.delete(uri) }
private fun List<MediaWrapper>.filterNetworkFavs() : List<MediaWrapper> { private fun List<MediaWrapper>.filterNetworkFavs() : List<MediaWrapper> {
return when { return when {

Loading…
Cancel
Save