From df48c5ccf77b24025d494db841189cff4d86f5dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geoffrey=20M=C3=A9tais?= Date: Tue, 24 Mar 2020 17:51:54 +0100 Subject: [PATCH] Fix BrowserFavRepository functions Make it suspend functions for consistency --- .../television/ui/MediaItemDetailsFragment.kt | 18 ++++++++------- .../ui/browser/FileBrowserTvFragment.kt | 22 ++++++++----------- .../vlc/gui/browser/BaseBrowserFragment.kt | 12 +++++----- .../vlc/gui/browser/FileBrowserFragment.kt | 9 +++----- .../vlc/gui/browser/NetworkBrowserFragment.kt | 14 ++++-------- .../vlc/gui/dialogs/NetworkServerDialog.kt | 4 ++-- .../vlc/repository/BrowserFavRepository.kt | 11 +++++----- 7 files changed, 39 insertions(+), 51 deletions(-) diff --git a/application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt b/application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt index 2f2ef1be4..e33b33a5b 100644 --- a/application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt +++ b/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 diff --git a/application/television/src/main/java/org/videolan/television/ui/browser/FileBrowserTvFragment.kt b/application/television/src/main/java/org/videolan/television/ui/browser/FileBrowserTvFragment.kt index d136c6f5e..083378c63 100644 --- a/application/television/src/main/java/org/videolan/television/ui/browser/FileBrowserTvFragment.kt +++ b/application/television/src/main/java/org/videolan/television/ui/browser/FileBrowserTvFragment.kt @@ -196,9 +196,7 @@ class FileBrowserTvFragment : BaseBrowserTvFragment(), 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(), 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(), 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() } } } diff --git a/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt index 172390174..4646410ae 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt +++ b/application/vlc-android/src/org/videolan/vlc/gui/browser/BaseBrowserFragment.kt @@ -457,12 +457,10 @@ abstract class BaseBrowserFragment : MediaBrowserFragment(), 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(), 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 diff --git a/application/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt index 096fc2bab..4e3ffb05a 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/browser/FileBrowserFragment.kt +++ b/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 diff --git a/application/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt b/application/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt index 79231ae2f..38f4e5352 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/browser/NetworkBrowserFragment.kt +++ b/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) } diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt index 8c39c44a7..236fdbd51 100644 --- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt +++ b/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() } diff --git a/application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt b/application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt index af8d2baa4..7441e1480 100644 --- a/application/vlc-android/src/org/videolan/vlc/repository/BrowserFavRepository.kt +++ b/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.filterNetworkFavs() : List { return when {