Browse Source

Update coroutines dependency version and migrate from offer to trySend

merge-requests/1287/head
Nicolas Pomepuy 5 years ago
parent
commit
85ad7d78a6
  1. 26
      application/moviepedia/src/main/java/org/videolan/moviepedia/viewmodel/MediaMetadataModel.kt
  2. 2
      application/television/src/main/java/org/videolan/television/ui/MediaItemDetailsFragment.kt
  3. 10
      application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt
  4. 8
      application/tools/src/main/java/org/videolan/tools/KotlinExtensions.kt
  5. 2
      application/vlc-android/res/layout/history_list.xml
  6. 8
      application/vlc-android/src/org/videolan/vlc/ExternalMonitor.kt
  7. 33
      application/vlc-android/src/org/videolan/vlc/MediaBrowserCallback.kt
  8. 24
      application/vlc-android/src/org/videolan/vlc/MediaParsingService.kt
  9. 16
      application/vlc-android/src/org/videolan/vlc/PlaybackService.kt
  10. 4
      application/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt
  11. 2
      application/vlc-android/src/org/videolan/vlc/gui/DiffUtilAdapter.kt
  12. 9
      application/vlc-android/src/org/videolan/vlc/gui/HistoryAdapter.kt
  13. 2
      application/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.kt
  14. 4
      application/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitlesAdapter.kt
  15. 12
      application/vlc-android/src/org/videolan/vlc/gui/network/MRLAdapter.kt
  16. 9
      application/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt
  17. 5
      application/vlc-android/src/org/videolan/vlc/gui/view/FastScroller.kt
  18. 8
      application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt
  19. 2
      application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt
  20. 8
      application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt
  21. 6
      application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt
  22. 7
      application/vlc-android/src/org/videolan/vlc/viewmodels/BaseModel.kt
  23. 51
      application/vlc-android/src/org/videolan/vlc/viewmodels/CallBackDelegate.kt
  24. 3
      application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
  25. 2
      build.gradle

26
application/moviepedia/src/main/java/org/videolan/moviepedia/viewmodel/MediaMetadataModel.kt

@ -58,7 +58,7 @@ class MediaMetadataModel(private val context: Context, mlId: Long? = null, movie
val metadata = MediaMetadataRepository.getInstance(context).getMetadataLiveByML(medialibId)
updateLiveData.addSource(metadata) { mediaMetadataWithImages ->
mediaMetadataFull.metadata = mediaMetadataWithImages
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
if (mediaMetadataFull.metadata?.metadata?.type == MediaMetadataType.TV_EPISODE) {
//look for a next episode
mediaMetadataFull.metadata?.show?.let {
@ -82,23 +82,23 @@ class MediaMetadataModel(private val context: Context, mlId: Long? = null, movie
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(it.moviepediaId, PersonType.ACTOR)) { persons ->
mediaMetadataFull.actors = persons
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(it.moviepediaId, PersonType.WRITER)) { persons ->
mediaMetadataFull.writers = persons
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(it.moviepediaId, PersonType.PRODUCER)) { persons ->
mediaMetadataFull.producers = persons
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(it.moviepediaId, PersonType.MUSICIAN)) { persons ->
mediaMetadataFull.musicians = persons
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(it.moviepediaId, PersonType.DIRECTOR)) { persons ->
mediaMetadataFull.directors = persons
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
}
}
@ -112,7 +112,7 @@ class MediaMetadataModel(private val context: Context, mlId: Long? = null, movie
val metadata = MediaMetadataRepository.getInstance(context).getMetadataLive(mId)
updateLiveData.addSource(metadata) {
mediaMetadataFull.metadata = it
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
if (it?.metadata?.type == MediaMetadataType.TV_SHOW) {
val episodes = MediaMetadataRepository.getInstance(context).getEpisodesLive(mId)
updateLiveData.addSource(episodes) { episodes ->
@ -120,7 +120,7 @@ class MediaMetadataModel(private val context: Context, mlId: Long? = null, movie
launch {
val seasons = withContext(Dispatchers.IO) { provider.getAllSeasons(mediaMetadataFull.metadata!!) }
mediaMetadataFull.seasons = seasons.sortedBy { it.seasonNumber }
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
}
}
@ -128,23 +128,23 @@ class MediaMetadataModel(private val context: Context, mlId: Long? = null, movie
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(mId, PersonType.ACTOR)) {
mediaMetadataFull.actors = it
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(mId, PersonType.WRITER)) {
mediaMetadataFull.writers = it
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(mId, PersonType.PRODUCER)) {
mediaMetadataFull.producers = it
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(mId, PersonType.MUSICIAN)) {
mediaMetadataFull.musicians = it
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
updateLiveData.addSource(MediaPersonRepository.getInstance(context).getPersonsByType(mId, PersonType.DIRECTOR)) {
mediaMetadataFull.directors = it
updateActor.offer(mediaMetadataFull)
updateActor.trySend(mediaMetadataFull)
}
}
}

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

@ -471,7 +471,7 @@ class MediaItemDetailsModel(context: Application) : AndroidViewModel(context), C
oldList.addAll(convertFavorites)
// we convert this new entry to a [MediaWrapper] and re-launch the activity with this new item
listenForNetworkFav = false
updateActor.offer(media)
updateActor.trySend(media)
}
}
}

10
application/television/src/main/java/org/videolan/television/viewmodel/MainTvModel.kt

@ -105,7 +105,7 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
private val favObserver = Observer<List<BrowserFav>> { list ->
updatedFavoriteList = convertFavorites(list)
if (!updateActor.isClosedForSend) updateActor.offer(Unit)
if (!updateActor.isClosedForSend) updateActor.trySend(Unit)
}
private val playerObserver = Observer<Boolean> { updateAudioCategories() }
@ -116,8 +116,8 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
medialibrary.addOnMedialibraryReadyListener(this)
medialibrary.addOnDeviceChangeListener(this)
favorites.observeForever(favObserver)
networkMonitor.connectionFlow.onEach { updateActor.offer(Unit) }.launchIn(viewModelScope)
ExternalMonitor.storageEvents.onEach { updateActor.offer(Unit) }.launchIn(viewModelScope)
networkMonitor.connectionFlow.onEach { updateActor.trySend(Unit) }.launchIn(viewModelScope)
ExternalMonitor.storageEvents.onEach { updateActor.trySend(Unit) }.launchIn(viewModelScope)
PlaylistManager.showAudioPlayer.observeForever(playerObserver)
mediaMetadataRepository.getAllLive().observeForever(videoObserver)
}
@ -128,8 +128,8 @@ class MainTvModel(app: Application) : AndroidViewModel(app), Medialibrary.OnMedi
updateRecentlyPlayed()
updateRecentlyAdded()
updateAudioCategories()
historyActor.offer(Unit)
updateActor.offer(Unit)
historyActor.trySend(Unit)
updateActor.trySend(Unit)
updatePlaylists()
}

8
application/tools/src/main/java/org/videolan/tools/KotlinExtensions.kt

@ -116,16 +116,10 @@ fun String?.isValidUrl(): Boolean {
}
fun View.clicks(): Flow<Unit> = callbackFlow {
setOnClickListener { safeOffer(Unit) }
setOnClickListener { trySend(Unit) }
awaitClose { setOnClickListener(null) }
}
fun <E> SendChannel<E>.safeOffer(value: E) = !isClosedForSend && try {
offer(value)
} catch (e: CancellationException) {
false
}
@SuppressLint("MissingPermission")
fun Context.isConnected(): Boolean {
return getSystemService<ConnectivityManager>()?.activeNetworkInfo?.isConnected == true

2
application/vlc-android/res/layout/history_list.xml

@ -24,7 +24,7 @@
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@android:id/list"
android:id="@+id/list"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/searchButton"

8
application/vlc-android/src/org/videolan/vlc/ExternalMonitor.kt

@ -82,7 +82,7 @@ object ExternalMonitor : BroadcastReceiver(), LifecycleObserver, CoroutineScope
delay(100L)
Log.i("ExternalMonitor", "Storage management: unmount: ${action.uuid} - ${action.path}")
Medialibrary.getInstance().removeDevice(action.uuid, action.path)
storageChannel.safeOffer(action)
storageChannel.trySend(action)
}
}
}
@ -96,10 +96,10 @@ object ExternalMonitor : BroadcastReceiver(), LifecycleObserver, CoroutineScope
override fun onReceive(context: Context, intent: Intent) {
if (!this::ctx.isInitialized) ctx = context.applicationContext
when (intent.action) {
Intent.ACTION_MEDIA_MOUNTED -> intent.data?.let { actor.offer(MediaMounted(it)) }
Intent.ACTION_MEDIA_MOUNTED -> intent.data?.let { actor.trySend(MediaMounted(it)) }
Intent.ACTION_MEDIA_UNMOUNTED,
Intent.ACTION_MEDIA_EJECT -> intent.data?.let {
actor.offer(MediaUnmounted(it))
actor.trySend(MediaUnmounted(it))
}
UsbManager.ACTION_USB_DEVICE_ATTACHED -> {
if (intent.hasExtra(UsbManager.EXTRA_DEVICE)) {
@ -165,7 +165,7 @@ object ExternalMonitor : BroadcastReceiver(), LifecycleObserver, CoroutineScope
private fun notifyNewStorage(mediaMounted: MediaMounted) {
val activity = storageObserver?.get() ?: return
UiTools.newStorageDetected(activity, mediaMounted.path)
storageChannel.safeOffer(mediaMounted)
storageChannel.trySend(mediaMounted)
}
@Synchronized

33
application/vlc-android/src/org/videolan/vlc/MediaBrowserCallback.kt

@ -25,7 +25,6 @@ import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.channels.SendChannel
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.tools.conflatedActor
import org.videolan.tools.safeOffer
/**
* @see org.videolan.vlc.viewmodels.ICallBackHandler
@ -57,7 +56,7 @@ class MediaBrowserCallback(private val playbackService: PlaybackService) : IMedi
}
override fun onHistoryModified() {
historyActor.safeOffer(Unit)
historyActor.trySend(Unit)
}
override fun registerMediaCallback(refresh: () -> Unit) {
@ -70,11 +69,11 @@ class MediaBrowserCallback(private val playbackService: PlaybackService) : IMedi
}
override fun onMediaAdded() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onMediaDeleted(id: LongArray?) {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onMediaModified() {
@ -82,55 +81,55 @@ class MediaBrowserCallback(private val playbackService: PlaybackService) : IMedi
}
override fun onMediaConvertedToExternal(id: LongArray?) {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onArtistsAdded() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onArtistsModified() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onArtistsDeleted() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onAlbumsAdded() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onAlbumsModified() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onAlbumsDeleted() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onGenresAdded() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onGenresModified() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onGenresDeleted() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onPlaylistsAdded() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onPlaylistsModified() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun onPlaylistsDeleted() {
refreshActor.safeOffer(Unit)
refreshActor.trySend(Unit)
}
override fun removeCallbacks() {

24
application/vlc-android/src/org/videolan/vlc/MediaParsingService.kt

@ -180,11 +180,11 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
val removeDevices = intent.getBooleanExtra(EXTRA_REMOVE_DEVICE, false)
setupMedialibrary(upgrade, parse, removeDevices)
}
ACTION_RELOAD -> actions.safeOffer(Reload(intent.getStringExtra(EXTRA_PATH)))
ACTION_FORCE_RELOAD -> actions.safeOffer(ForceReload)
ACTION_RELOAD -> actions.trySend(Reload(intent.getStringExtra(EXTRA_PATH)))
ACTION_FORCE_RELOAD -> actions.trySend(ForceReload)
ACTION_DISCOVER -> intent.getStringExtra(EXTRA_PATH)?.let { discover(it) }
ACTION_DISCOVER_DEVICE -> intent.getStringExtra(EXTRA_PATH)?.let { discoverStorage(it) }
ACTION_CHECK_STORAGES -> if (settings.getInt(KEY_MEDIALIBRARY_SCAN, -1) != ML_SCAN_OFF) actions.safeOffer(UpdateStorages) else exitCommand()
ACTION_CHECK_STORAGES -> if (settings.getInt(KEY_MEDIALIBRARY_SCAN, -1) != ML_SCAN_OFF) actions.trySend(UpdateStorages) else exitCommand()
else -> {
exitCommand()
return START_NOT_STICKY
@ -206,7 +206,7 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
return
}
discoverTriggered = true
actions.safeOffer(DiscoverStorage(path))
actions.trySend(DiscoverStorage(path))
}
private fun discover(path: String) {
@ -214,7 +214,7 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
exitCommand()
return
}
actions.safeOffer(DiscoverFolder(path))
actions.trySend(DiscoverFolder(path))
}
private fun addDeviceIfNeeded(path: String) {
@ -251,8 +251,8 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
private fun setupMedialibrary(upgrade: Boolean, parse: Boolean, removeDevices:Boolean) {
if (medialibrary.isInitiated) {
medialibrary.resumeBackgroundOperations()
if (parse && !scanActivated) actions.safeOffer(StartScan(upgrade))
} else actions.safeOffer(Init(upgrade, parse, removeDevices))
if (parse && !scanActivated) actions.trySend(StartScan(upgrade))
} else actions.trySend(Init(upgrade, parse, removeDevices))
}
private suspend fun initMedialib(parse: Boolean, context: Context, shouldInit: Boolean, upgrade: Boolean, removeDevices: Boolean) {
@ -387,7 +387,7 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
override fun onDiscoveryProgress(entryPoint: String) {
if (BuildConfig.DEBUG) Log.v(TAG, "onDiscoveryProgress: $entryPoint")
currentDiscovery = entryPoint
if (::notificationActor.isInitialized) notificationActor.safeOffer(Show(-1, -1))
if (::notificationActor.isInitialized) notificationActor.trySend(Show(-1, -1))
}
override fun onDiscoveryCompleted() {
@ -396,14 +396,14 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
override fun onDiscoveryFailed(entryPoint: String) {
Log.e(TAG, "onDiscoveryFailed")
notificationActor.safeOffer(Error(entryPoint))
notificationActor.trySend(Error(entryPoint))
}
override fun onParsingStatsUpdated(done: Int, scheduled:Int) {
lastDone = done
lastScheduled = scheduled
parsing = (done.toFloat() / scheduled.toFloat() * 100F)
if (parsing != 100F && ::notificationActor.isInitialized) notificationActor.safeOffer(Show(done, scheduled))
if (parsing != 100F && ::notificationActor.isInitialized) notificationActor.trySend(Show(done, scheduled))
}
override fun onReloadStarted(entryPoint: String) {
@ -427,7 +427,7 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
}
localBroadcastManager.sendBroadcast(Intent(ACTION_CONTENT_INDEXING))
//todo reenable entry point when ready
if (::notificationActor.isInitialized) notificationActor.safeOffer(Hide)
if (::notificationActor.isInitialized) notificationActor.trySend(Hide)
//Delay service stop to ensure service goes foreground.
// Otherwise, we get some RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
lifecycleScope.launch {
@ -516,7 +516,7 @@ class MediaParsingService : LifecycleService(), DevicesDiscoveryCb {
scanPaused = false
}
}
notificationActor.safeOffer(Show(lastDone, lastScheduled))
notificationActor.trySend(Show(lastDone, lastScheduled))
}
}

16
application/vlc-android/src/org/videolan/vlc/PlaybackService.kt

@ -220,7 +220,7 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
}
MediaPlayer.Event.MediaChanged -> if (BuildConfig.DEBUG) Log.d(TAG, "onEvent: MediaChanged")
}
cbActor.safeOffer(CbMediaPlayerEvent(event))
cbActor.trySend(CbMediaPlayerEvent(event))
}
private val handler = PlaybackServiceHandler(this)
@ -792,10 +792,10 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
private fun canSwitchToVideo() = playlistManager.player.canSwitchToVideo()
fun onMediaEvent(event: IMedia.Event) = cbActor.safeOffer(CbMediaEvent(event))
fun onMediaEvent(event: IMedia.Event) = cbActor.trySend(CbMediaEvent(event))
fun executeUpdate(pubState: Boolean = false) {
cbActor.safeOffer(CbUpdate)
cbActor.trySend(CbUpdate)
updateWidget()
updateMetadata()
broadcastMetadata()
@ -837,7 +837,7 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
fun showNotification(): Boolean {
notificationShowing = true
return cbActor.safeOffer(ShowNotification)
return cbActor.trySend(ShowNotification).isSuccess
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@ -911,7 +911,7 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
private fun hideNotification(remove: Boolean): Boolean {
notificationShowing = false
return if (::cbActor.isInitialized) cbActor.safeOffer(HideNotification(remove)) else false
return if (::cbActor.isInitialized) cbActor.trySend(HideNotification(remove)).isSuccess else false
}
private fun hideNotificationInternal(remove: Boolean) {
@ -972,7 +972,7 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
}
private fun updateMetadata() {
cbActor.safeOffer(UpdateMeta)
cbActor.trySend(UpdateMeta)
}
private suspend fun updateMetadataInternal() {
@ -1267,10 +1267,10 @@ class PlaybackService : MediaBrowserServiceCompat(), LifecycleOwner, CoroutineSc
fun hasPlaylist() = playlistManager.hasPlaylist()
@MainThread
fun addCallback(cb: Callback) = cbActor.safeOffer(CbAdd(cb))
fun addCallback(cb: Callback) = cbActor.trySend(CbAdd(cb))
@MainThread
fun removeCallback(cb: Callback) = cbActor.safeOffer(CbRemove(cb))
fun removeCallback(cb: Callback) = cbActor.trySend(CbRemove(cb))
private fun restartPlaylistManager() = playlistManager.restart()
fun restartMediaPlayer() = playlistManager.player.restart()

4
application/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt

@ -24,8 +24,8 @@ class StoragesMonitor : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action ?: return
if (!isAppStarted()) when (action) {
Intent.ACTION_MEDIA_MOUNTED -> intent.data?.let { actor.offer(Mount(context, it)) }
Intent.ACTION_MEDIA_UNMOUNTED -> intent.data?.let { actor.offer(Unmount(context, it)) }
Intent.ACTION_MEDIA_MOUNTED -> intent.data?.let { actor.trySend(Mount(context, it)) }
Intent.ACTION_MEDIA_UNMOUNTED -> intent.data?.let { actor.trySend(Unmount(context, it)) }
else -> return
}
}

2
application/vlc-android/src/org/videolan/vlc/gui/DiffUtilAdapter.kt

@ -22,7 +22,7 @@ abstract class DiffUtilAdapter<D, VH : RecyclerView.ViewHolder> : RecyclerView.A
@MainThread
fun update (list: List<D>) {
updateActor.offer(list)
updateActor.trySend(list)
}
@MainThread

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

@ -36,7 +36,6 @@ import org.videolan.resources.UPDATE_SELECTION
import org.videolan.tools.MultiSelectAdapter
import org.videolan.tools.MultiSelectHelper
import org.videolan.tools.Settings
import org.videolan.tools.safeOffer
import org.videolan.vlc.BR
import org.videolan.vlc.databinding.HistoryItemBinding
import org.videolan.vlc.databinding.HistoryItemCardBinding
@ -73,16 +72,16 @@ class HistoryAdapter(private val inCards: Boolean = false, private val listEvent
}
fun onClick(v: View) {
eventsChannel.safeOffer(SimpleClick(layoutPosition))
eventsChannel.trySend(SimpleClick(layoutPosition))
}
fun onLongClick(v: View) = eventsChannel.safeOffer(LongClick(layoutPosition))
fun onLongClick(v: View) = eventsChannel.trySend(LongClick(layoutPosition)).isSuccess
fun onImageClick(v: View) {
if (inCards)
eventsChannel.safeOffer(SimpleClick(layoutPosition))
eventsChannel.trySend(SimpleClick(layoutPosition))
else
eventsChannel.safeOffer(ImageClick(layoutPosition))
eventsChannel.trySend(ImageClick(layoutPosition))
}
override fun isSelected() = getItem(layoutPosition).hasStateFlags(MediaLibraryItem.FLAG_SELECTED)

2
application/vlc-android/src/org/videolan/vlc/gui/HistoryFragment.kt

@ -101,7 +101,7 @@ class HistoryFragment : MediaBrowserFragment<HistoryModel>(), IRefreshable, IHis
list.nextFocusForwardId = android.R.id.list
itemTouchHelper = ItemTouchHelper(SwipeDragItemTouchHelperCallback(historyAdapter))
itemTouchHelper!!.attachToRecyclerView(list)
itemTouchHelper.attachToRecyclerView(list)
multiSelectHelper = historyAdapter.multiSelectHelper
list.requestFocus()

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

@ -35,12 +35,12 @@ internal class SubtitlesAdapter(private val eventActor: SendChannel<SubtitleEven
itemView.setOnClickListener {
dataset?.get(layoutPosition)?.let {
if(!eventActor.isClosedForSend)
eventActor.offer(SubtitleClick(it)) }
eventActor.trySend(SubtitleClick(it)) }
}
itemView.setOnLongClickListener {
dataset?.get(layoutPosition)?.let {
if(!eventActor.isClosedForSend)
eventActor.offer(SubtitleLongClick(it))
eventActor.trySend(SubtitleLongClick(it))
}
true
}

12
application/vlc-android/src/org/videolan/vlc/gui/network/MRLAdapter.kt

@ -127,13 +127,13 @@ internal class MRLAdapter(private val eventActor: SendChannel<MrlAction>, privat
init {
itemView.setOnClickListener(this)
itemView.setOnLongClickListener { eventActor.offer(ShowContext(layoutPosition)) }
binding.mrlCtx.setOnClickListener { eventActor.offer(ShowContext(layoutPosition)) }
itemView.setOnLongClickListener { eventActor.trySend(ShowContext(layoutPosition)).isSuccess }
binding.mrlCtx.setOnClickListener { eventActor.trySend(ShowContext(layoutPosition)) }
binding.selector.setOnClickListener { onClick(it) }
}
override fun onClick(v: View) {
dataset.getOrNull(layoutPosition)?.let { eventActor.offer(Playmedia(it)) }
dataset.getOrNull(layoutPosition)?.let { eventActor.trySend(Playmedia(it)) }
}
fun recycle() {}
@ -143,12 +143,12 @@ internal class MRLAdapter(private val eventActor: SendChannel<MrlAction>, privat
init {
binding.container.setOnClickListener(this)
binding.container.setOnLongClickListener { eventActor.offer(ShowContext(layoutPosition)) }
binding.mrlCtx.setOnClickListener { eventActor.offer(ShowContext(layoutPosition)) }
binding.container.setOnLongClickListener { eventActor.trySend(ShowContext(layoutPosition)).isSuccess }
binding.mrlCtx.setOnClickListener { eventActor.trySend(ShowContext(layoutPosition)) }
}
override fun onClick(v: View) {
dataset.getOrNull(layoutPosition)?.let { eventActor.offer(Playmedia(it)) }
dataset.getOrNull(layoutPosition)?.let { eventActor.trySend(Playmedia(it)) }
}
fun recycle() {

9
application/vlc-android/src/org/videolan/vlc/gui/video/VideoListAdapter.kt

@ -48,7 +48,6 @@ import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.resources.*
import org.videolan.tools.MultiSelectAdapter
import org.videolan.tools.MultiSelectHelper
import org.videolan.tools.safeOffer
import org.videolan.vlc.BR
import org.videolan.vlc.R
import org.videolan.vlc.gui.helpers.*
@ -212,22 +211,22 @@ class VideoListAdapter(private var isSeenMediaMarkerVisible: Boolean
fun onImageClick(v: View) {
val position = layoutPosition
if (isPositionValid(position)) getItem(position)?.let { eventsChannel.safeOffer(VideoImageClick(layoutPosition, it)) }
if (isPositionValid(position)) getItem(position)?.let { eventsChannel.trySend(VideoImageClick(layoutPosition, it)) }
}
fun onClick(v: View) {
val position = layoutPosition
if (isPositionValid(position)) getItem(position)?.let { eventsChannel.safeOffer(VideoClick(layoutPosition, it)) }
if (isPositionValid(position)) getItem(position)?.let { eventsChannel.trySend(VideoClick(layoutPosition, it)) }
}
fun onMoreClick(v: View) {
val position = layoutPosition
if (isPositionValid(position)) getItem(position)?.let { eventsChannel.safeOffer(VideoCtxClick(layoutPosition, it)) }
if (isPositionValid(position)) getItem(position)?.let { eventsChannel.trySend(VideoCtxClick(layoutPosition, it)) }
}
fun onLongClick(v: View): Boolean {
val position = layoutPosition
return isPositionValid(position) && getItem(position)?.let { eventsChannel.safeOffer(VideoLongClick(layoutPosition, it)) } == true
return isPositionValid(position) && getItem(position)?.let { eventsChannel.trySend(VideoLongClick(layoutPosition, it)).isSuccess } == true
}
override fun selectView(selected: Boolean) {

5
application/vlc-android/src/org/videolan/vlc/gui/view/FastScroller.kt

@ -52,7 +52,6 @@ import org.videolan.vlc.R
import org.videolan.resources.util.HeadersIndex
import org.videolan.vlc.providers.medialibrary.MedialibraryProvider
import org.videolan.tools.WeakHandler
import org.videolan.tools.safeOffer
import org.videolan.vlc.util.scope
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.math.max
@ -367,10 +366,10 @@ class FastScroller : LinearLayout, Observer<HeadersIndex> {
val proportion = if (recyclerviewTotalHeight == 0) 0f else verticalScrollOffset / recyclerviewTotalHeight.toFloat()
setPosition(currentHeight * proportion)
if (visibility == View.INVISIBLE) handler.sendEmptyMessage(SHOW_SCROLLER)
actor.safeOffer(Unit)
actor.trySend(Unit)
}
override fun onChanged(t: HeadersIndex?) {
actor.safeOffer(Unit)
actor.trySend(Unit)
}
}

8
application/vlc-android/src/org/videolan/vlc/media/MediaUtils.kt

@ -463,11 +463,11 @@ object MediaUtils {
for (action in channel) when (action) {
Connect -> {
val service = PlaybackService.instance
if (service != null) channel.offer(Task(service, task))
if (service != null) channel.trySend(Task(service, task))
else {
PlaybackService.start(context)
PlaybackService.serviceFlow.filterNotNull().first().let {
channel.offer(Task(it, task))
channel.trySend(Task(it, task))
}
}
}
@ -488,9 +488,9 @@ object MediaUtils {
"${context.applicationContext.getString(R.string.loading)}",
context.applicationContext.getString(R.string.please_wait), true)
dialog.setCancelable(true)
dialog.setOnCancelListener { actor.offer(Disconnect) }
dialog.setOnCancelListener { actor.trySend(Disconnect) }
}
actor.safeOffer(Connect)
actor.trySend(Connect)
}
private fun dismiss() {

2
application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt

@ -335,7 +335,7 @@ class PlayerController(val context: Context) : IVLCVout.Callback, MediaPlayer.Ev
}
override fun onEvent(event: MediaPlayer.Event?) {
if (event != null) eventActor.offer(event)
if (event != null) eventActor.trySend(event)
}
private fun setPlaybackStopped() {

8
application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt

@ -461,7 +461,7 @@ class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventList
override fun onItemAdded(index: Int, mrl: String) {
if (BuildConfig.DEBUG) Log.i(TAG, "CustomMediaListItemAdded")
if (currentIndex >= index && !expanding) ++currentIndex
addUpdateActor.offer(Unit)
addUpdateActor.trySend(Unit)
}
private val addUpdateActor = actor<Unit>(capacity = Channel.CONFLATED) {
@ -609,7 +609,7 @@ class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventList
// If we are in random mode, we completely reset the stored previous track
// as their indices changed.
previous.clear()
addUpdateActor.safeOffer(Unit)
addUpdateActor.trySend(Unit)
}
private suspend fun determinePrevAndNextIndices(expand: Boolean = false) {
@ -717,7 +717,7 @@ class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventList
child.release()
}
mediaList.addEventListener(this)
addUpdateActor.offer(Unit)
addUpdateActor.trySend(Unit)
service.onMediaListChanged()
if (mrl !== null && ml.count == 1) {
getCurrentMedia()?.apply {
@ -802,7 +802,7 @@ class PlaylistManager(val service: PlaybackService) : MediaWrapperList.EventList
}
}
mediaList.addEventListener(this)
addUpdateActor.offer(Unit)
addUpdateActor.trySend(Unit)
}
/**

6
application/vlc-android/src/org/videolan/vlc/providers/BrowserProvider.kt

@ -193,7 +193,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
private suspend fun filesFlow(url: String? = this.url, interact : Boolean = true) = channelFlow<IMedia> {
val listener = object : EventListener {
override fun onMediaAdded(index: Int, media: IMedia) {
if (!isClosedForSend) offer(media.apply { retain() })
if (!isClosedForSend) trySend(media.apply { retain() })
}
override fun onBrowseEnd() {
@ -348,7 +348,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
}
open fun stop() {
browserActor.offer(Release)
browserActor.trySend(Release)
discoveryJob?.cancel()
discoveryJob = null
parsingJob?.cancel()
@ -389,7 +389,7 @@ abstract class BrowserProvider(val context: Context, val dataset: LiveDataset<Me
private val prefetchLists = mutableMapOf<String, MutableList<MediaLibraryItem>>()
}
private fun <E> SendChannel<E>.post(element: E) = isActive && !isClosedForSend && offer(element)
private fun <E> SendChannel<E>.post(element: E) = isActive && !isClosedForSend && trySend(element).isSuccess
}
private sealed class BrowserAction

7
application/vlc-android/src/org/videolan/vlc/viewmodels/BaseModel.kt

@ -32,7 +32,6 @@ import kotlinx.coroutines.withContext
import org.videolan.medialibrary.media.MediaLibraryItem
import org.videolan.tools.CoroutineContextProvider
import org.videolan.tools.livedata.LiveDataset
import org.videolan.tools.safeOffer
import org.videolan.vlc.util.FilterDelegate
import org.videolan.vlc.util.ModelsHelper
import org.videolan.vlc.util.map
@ -72,17 +71,17 @@ abstract class BaseModel<T : MediaLibraryItem>(context: Context, val coroutineCo
fun isEmpty() = dataset.isEmpty()
override fun refresh() {
updateActor.safeOffer(Refresh)
updateActor.trySend(Refresh)
}
fun remove(mw: T) {
updateActor.safeOffer(Remove(mw))
updateActor.trySend(Remove(mw))
}
override fun filter(query: String?) {
if (!updateActor.isClosedForSend) {
filterQuery = query
updateActor.offer(Filter(query))
updateActor.trySend(Filter(query))
}
}

51
application/vlc-android/src/org/videolan/vlc/viewmodels/CallBackDelegate.kt

@ -29,7 +29,6 @@ import kotlinx.coroutines.channels.actor
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.resources.AppContextProvider
import org.videolan.tools.conflatedActor
import org.videolan.tools.safeOffer
import org.videolan.vlc.util.FileUtils
import java.io.File
@ -148,57 +147,57 @@ class CallBackDelegate : ICallBackHandler,
refreshActor.close()
}
override fun onMedialibraryReady() { refreshActor.safeOffer(Unit) }
override fun onMedialibraryReady() { refreshActor.trySend(Unit) }
override fun onMedialibraryIdle() { refreshActor.safeOffer(Unit) }
override fun onMedialibraryIdle() { refreshActor.trySend(Unit) }
override fun onDeviceChange() { refreshActor.safeOffer(Unit) }
override fun onDeviceChange() { refreshActor.trySend(Unit) }
override fun onMediaAdded() { refreshActor.safeOffer(Unit) }
override fun onMediaAdded() { refreshActor.trySend(Unit) }
override fun onMediaModified() { refreshActor.safeOffer(Unit) }
override fun onMediaModified() { refreshActor.trySend(Unit) }
override fun onMediaDeleted(ids: LongArray) {
refreshActor.safeOffer(Unit)
deleteActor.safeOffer(MediaDeletedAction(ids))
refreshActor.trySend(Unit)
deleteActor.trySend(MediaDeletedAction(ids))
}
override fun onMediaConvertedToExternal(ids: LongArray) {
refreshActor.safeOffer(Unit)
deleteActor.safeOffer(MediaConvertedExternalAction(ids))
refreshActor.trySend(Unit)
deleteActor.trySend(MediaConvertedExternalAction(ids))
}
override fun onArtistsAdded() { refreshActor.safeOffer(Unit) }
override fun onArtistsAdded() { refreshActor.trySend(Unit) }
override fun onArtistsModified() { refreshActor.safeOffer(Unit) }
override fun onArtistsModified() { refreshActor.trySend(Unit) }
override fun onArtistsDeleted() { refreshActor.safeOffer(Unit) }
override fun onArtistsDeleted() { refreshActor.trySend(Unit) }
override fun onAlbumsAdded() { refreshActor.safeOffer(Unit) }
override fun onAlbumsAdded() { refreshActor.trySend(Unit) }
override fun onAlbumsModified() { refreshActor.safeOffer(Unit) }
override fun onAlbumsModified() { refreshActor.trySend(Unit) }
override fun onAlbumsDeleted() { refreshActor.safeOffer(Unit) }
override fun onAlbumsDeleted() { refreshActor.trySend(Unit) }
override fun onGenresAdded() { refreshActor.safeOffer(Unit) }
override fun onGenresAdded() { refreshActor.trySend(Unit) }
override fun onGenresModified() { refreshActor.safeOffer(Unit) }
override fun onGenresModified() { refreshActor.trySend(Unit) }
override fun onGenresDeleted() { refreshActor.safeOffer(Unit) }
override fun onGenresDeleted() { refreshActor.trySend(Unit) }
override fun onPlaylistsAdded() { refreshActor.safeOffer(Unit) }
override fun onPlaylistsAdded() { refreshActor.trySend(Unit) }
override fun onPlaylistsModified() { refreshActor.safeOffer(Unit) }
override fun onPlaylistsModified() { refreshActor.trySend(Unit) }
override fun onPlaylistsDeleted() { refreshActor.safeOffer(Unit) }
override fun onPlaylistsDeleted() { refreshActor.trySend(Unit) }
override fun onHistoryModified() { refreshActor.safeOffer(Unit) }
override fun onHistoryModified() { refreshActor.trySend(Unit) }
override fun onMediaGroupsAdded() { refreshActor.safeOffer(Unit) }
override fun onMediaGroupsAdded() { refreshActor.trySend(Unit) }
override fun onMediaGroupsModified() { refreshActor.safeOffer(Unit) }
override fun onMediaGroupsModified() { refreshActor.trySend(Unit) }
override fun onMediaGroupsDeleted() { refreshActor.safeOffer(Unit) }
override fun onMediaGroupsDeleted() { refreshActor.trySend(Unit) }
}
sealed class MediaAction

3
application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt

@ -35,7 +35,6 @@ import org.videolan.medialibrary.Tools
import org.videolan.medialibrary.interfaces.media.MediaWrapper
import org.videolan.tools.livedata.LiveDataset
import org.videolan.tools.readableSize
import org.videolan.tools.safeOffer
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
import org.videolan.vlc.media.PlaylistManager
@ -100,7 +99,7 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
this.filtering = filtering
originalDataset = if (filtering) dataset.value.toMutableList() else null
}
filterActor.safeOffer(query)
filterActor.trySend(query)
}
val title

2
build.gradle

@ -2,7 +2,7 @@
buildscript {
ext.android_plugin_version = '7.1.1'
ext.kotlin_version = '1.6.10'
ext.kotlinx_version = '1.4.1'
ext.kotlinx_version = '1.6.0'
repositories {
flatDir dirs: "gradle/plugins"
google()

Loading…
Cancel
Save