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 -> {
val uri = Uri.parse(viewModel.mediaItemDetails.location)
val local = "file" == uri.scheme
if (local)
browserFavRepository.addLocalFavItem(uri, viewModel.mediaItemDetails.title
?: "", viewModel.mediaItemDetails.artworkUrl)
else
browserFavRepository.addNetworkFavItem(uri, viewModel.mediaItemDetails.title
?: "", viewModel.mediaItemDetails.artworkUrl)
lifecycleScope.launch {
if (local)
browserFavRepository.addLocalFavItem(uri, viewModel.mediaItemDetails.title
?: "", viewModel.mediaItemDetails.artworkUrl)
else
browserFavRepository.addNetworkFavItem(uri, viewModel.mediaItemDetails.title
?: "", viewModel.mediaItemDetails.artworkUrl)
}
actionsAdapter.set(ID_FAVORITE, actionDelete)
rowsAdapter.notifyArrayItemRangeChanged(0, rowsAdapter.size())
Toast.makeText(activity, R.string.favorite_added, Toast.LENGTH_SHORT).show()
}
ID_FAVORITE_DELETE -> {
browserFavRepository.deleteBrowserFav(Uri.parse(viewModel.mediaItemDetails.location))
lifecycleScope.launch { browserFavRepository.deleteBrowserFav(Uri.parse(viewModel.mediaItemDetails.location)) }
actionsAdapter.set(ID_FAVORITE, actionAdd)
rowsAdapter.notifyArrayItemRangeChanged(0, rowsAdapter.size())
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)
withContext(Dispatchers.IO) { AudioUtil.readCoverBitmap(viewModel.mediaItemDetails.artworkUrl, 512) }
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 canSave = isDir && withContext(Dispatchers.IO) { FileUtils.canSave(viewModel.media) }
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.imageButtonFavorite, View.VISIBLE)
animationDelegate.setVisibility(binding.favoriteDescription, View.VISIBLE)
favExists = withContext(Dispatchers.IO) {
(item as? MediaWrapper)?.let { browserFavRepository.browserFavExists(it.uri) } ?: false
}
favExists = (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.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 = {
lifecycleScope.launch {
withContext(Dispatchers.IO) {
val mw = (item as MediaWrapper)
when {
browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri)
mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL)
else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
}
favExists = !favExists
val mw = (item as MediaWrapper)
when {
browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri)
mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL)
else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
}
favExists = !favExists
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)
}
@ -285,8 +281,8 @@ class FileBrowserTvFragment : BaseBrowserTvFragment<MediaLibraryItem>(), PathAda
when(dialog) {
is Dialog.LoginDialog -> goBack()
is Dialog.ErrorMessage -> {
view?.let { Snackbar.make(it, "${dialog.title}: ${dialog.text}", Snackbar.LENGTH_LONG).show() }
goBack()
view?.let { Snackbar.make(it, "${dialog.title}: ${dialog.text}", Snackbar.LENGTH_LONG).show() }
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 {
val mw = currentMedia ?: return@launch
withContext(Dispatchers.IO) {
when {
browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri)
mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL)
else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
}
when {
browserFavRepository.browserFavExists(mw.uri) -> browserFavRepository.deleteBrowserFav(mw.uri)
mw.uri.scheme == "file" -> browserFavRepository.addLocalFavItem(mw.uri, mw.title, mw.artworkURL)
else -> browserFavRepository.addNetworkFavItem(mw.uri, mw.title, mw.artworkURL)
}
activity?.invalidateOptionsMenu()
}
@ -507,7 +505,7 @@ abstract class BaseBrowserFragment : MediaBrowserFragment<BrowserModel>(), IRefr
val isFileBrowser = this@BaseBrowserFragment is FileBrowserFragment && item.uri.scheme == "file"
val isNetworkBrowser = this@BaseBrowserFragment is NetworkBrowserFragment
if (isFileBrowser || isNetworkBrowser) {
val favExists = withContext(Dispatchers.IO) { browserFavRepository.browserFavExists(mw.uri) }
val favExists = browserFavRepository.browserFavExists(mw.uri)
flags = if (favExists) {
if (isNetworkBrowser) flags or CTX_FAV_EDIT 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 androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.consumeAsFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.MLServiceLocator
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.medialibrary.media.MediaLibraryItem
@ -137,7 +134,7 @@ open class FileBrowserFragment : BaseBrowserFragment() {
override fun onCtxAction(position: Int, option: Int) {
val mw = this.adapter.getItem(position) as MediaWrapper?
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)
}
}
@ -159,7 +156,7 @@ open class FileBrowserFragment : BaseBrowserFragment() {
val isScanned = withContext(Dispatchers.IO) { MedialibraryUtils.isScanned(it) }
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)
R.drawable.ic_menu_bookmark_w
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.recyclerview.widget.RecyclerView
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import kotlinx.coroutines.withContext
import kotlinx.coroutines.*
import org.videolan.libvlc.Dialog
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.CTX_FAV_ADD
@ -85,11 +82,8 @@ class NetworkBrowserFragment : BaseBrowserFragment(), IDialogManager {
val item = menu.findItem(R.id.ml_menu_save)
item.isVisible = !isRootDirectory
lifecycleScope.launchWhenStarted {
val isFavorite = mrl != null && withContext(Dispatchers.IO) { browserFavRepository.browserFavExists(Uri.parse(mrl)) }
item.setIcon(if (isFavorite)
R.drawable.ic_menu_bookmark_w
else
R.drawable.ic_menu_bookmark_outline_w)
val isFavorite = mrl != null && browserFavRepository.browserFavExists(Uri.parse(mrl))
item.setIcon(if (isFavorite) 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)
}
}
@ -126,7 +120,7 @@ class NetworkBrowserFragment : BaseBrowserFragment(), IDialogManager {
override fun onCtxAction(position: Int, option: Int) {
val mw = this.adapter.getItem(position) as MediaWrapper
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)
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
editServername.text.toString()
val uri = Uri.parse(url.text.toString())
AppScope.launch(Dispatchers.IO) {
AppScope.launch {
if (::networkUri.isInitialized) browserFavRepository.deleteBrowserFav(networkUri)
browserFavRepository.addNetworkFavItem(uri, name, null)
dismiss()
}
}
@ -229,7 +230,6 @@ class NetworkServerDialog : DialogFragment(), AdapterView.OnItemSelectedListener
when (v.id) {
R.id.server_save -> {
saveServer()
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 kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.resources.AppContextProvider
import org.videolan.resources.TYPE_LOCAL_FAV
@ -42,7 +43,7 @@ import org.videolan.vlc.util.convertFavorites
import java.util.*
class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedObject() {
class BrowserFavRepository(private val browserFavDao: BrowserFavDao) {
private val networkMonitor = NetworkMonitor.getInstance(AppContextProvider.appContext)
@ -52,11 +53,11 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedO
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))
}
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))
}
@ -71,9 +72,9 @@ class BrowserFavRepository(private val browserFavDao: BrowserFavDao) : IOScopedO
}
@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> {
return when {

Loading…
Cancel
Save