From 2847a5167479a5871656f8b161dbadb4319a14a9 Mon Sep 17 00:00:00 2001 From: Nite Date: Tue, 19 Oct 2021 21:02:51 +0200 Subject: [PATCH] Fixed autoplay Fixed uncaught exception Fixed playlist loading from file --- .../moire/ultrasonic/domain/ArtistOrIndex.kt | 2 +- .../org/moire/ultrasonic/domain/Identifiable.kt | 5 ++--- .../moire/ultrasonic/domain/MusicDirectory.kt | 2 +- .../org/moire/ultrasonic/domain/MusicFolder.kt | 2 +- .../org/moire/ultrasonic/domain/Playlist.kt | 2 +- .../moire/ultrasonic/domain/PodcastsChannel.kt | 2 +- .../kotlin/org/moire/ultrasonic/domain/Share.kt | 2 +- .../org/moire/ultrasonic/service/Downloader.kt | 16 ++++++++++++++-- .../ultrasonic/service/MediaPlayerService.kt | 17 ++++++++++++----- 9 files changed, 34 insertions(+), 16 deletions(-) diff --git a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/ArtistOrIndex.kt b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/ArtistOrIndex.kt index 8a4a4c1d..586f1dae 100644 --- a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/ArtistOrIndex.kt +++ b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/ArtistOrIndex.kt @@ -15,4 +15,4 @@ abstract class ArtistOrIndex( open var albumCount: Long? = null, @Ignore open var closeness: Int = 0 -) : GenericEntry(id) +) : GenericEntry() diff --git a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Identifiable.kt b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Identifiable.kt index e147ea13..b361d0b7 100644 --- a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Identifiable.kt +++ b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Identifiable.kt @@ -2,9 +2,8 @@ package org.moire.ultrasonic.domain import androidx.room.Ignore -open class GenericEntry( - @Ignore override val id: String -) : Identifiable { +abstract class GenericEntry : Identifiable { + abstract override val id: String @Ignore open val name: String? = null override fun compareTo(other: Identifiable): Int { diff --git a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt index a0f32560..a9c80a5c 100644 --- a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt +++ b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicDirectory.kt @@ -69,7 +69,7 @@ class MusicDirectory { var bookmarkPosition: Int = 0, var userRating: Int? = null, var averageRating: Float? = null - ) : Serializable, GenericEntry(id) { + ) : Serializable, GenericEntry() { fun setDuration(duration: Long) { this.duration = duration.toInt() } diff --git a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt index e692a5c7..c4f94fb6 100644 --- a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt +++ b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/MusicFolder.kt @@ -10,4 +10,4 @@ import androidx.room.PrimaryKey data class MusicFolder( @PrimaryKey override val id: String, override val name: String -) : GenericEntry(id) +) : GenericEntry() diff --git a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt index 3ae9afee..fa91d9b9 100644 --- a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt +++ b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Playlist.kt @@ -10,7 +10,7 @@ data class Playlist @JvmOverloads constructor( val songCount: String = "", val created: String = "", val public: Boolean? = null -) : Serializable, GenericEntry(id) { +) : Serializable, GenericEntry() { companion object { private const val serialVersionUID = -4160515427075433798L } diff --git a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt index b38f7f41..a589877e 100644 --- a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt +++ b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/PodcastsChannel.kt @@ -8,7 +8,7 @@ data class PodcastsChannel( val url: String?, val description: String?, val status: String? -) : Serializable, GenericEntry(id) { +) : Serializable, GenericEntry() { companion object { private const val serialVersionUID = -4160515427075433798L } diff --git a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt index bec9bffa..f8d147b0 100644 --- a/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt +++ b/core/domain/src/main/kotlin/org/moire/ultrasonic/domain/Share.kt @@ -13,7 +13,7 @@ data class Share( var expires: String? = null, var visitCount: Long? = null, private val entries: MutableList = mutableListOf() -) : Serializable, GenericEntry(id) { +) : Serializable, GenericEntry() { override val name: String? get() { if (url != null) { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt index 10ec0a36..3f27c85d 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData import java.util.ArrayList import java.util.PriorityQueue import java.util.concurrent.Executors +import java.util.concurrent.RejectedExecutionException import java.util.concurrent.ScheduledExecutorService import java.util.concurrent.TimeUnit import org.koin.core.component.KoinComponent @@ -91,10 +92,21 @@ class Downloader( } fun checkDownloads() { - if (executorService == null || executorService!!.isTerminated) { + if ( + executorService == null || + executorService!!.isTerminated || + executorService!!.isShutdown + ) { start() } else { - executorService?.execute(downloadChecker) + try { + executorService?.execute(downloadChecker) + } catch (exception: RejectedExecutionException) { + Timber.w( + exception, + "checkDownloads() can't run, maybe the Downloader is shutting down..." + ) + } } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt index ae1a865a..d25da1ec 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt @@ -15,7 +15,9 @@ import android.app.Service import android.content.Context import android.content.Intent import android.os.Build +import android.os.Handler import android.os.IBinder +import android.os.Looper import android.support.v4.media.session.MediaSessionCompat import android.view.KeyEvent import androidx.core.app.NotificationCompat @@ -159,7 +161,10 @@ class MediaPlayerService : Service() { } fun notifyDownloaderStopped() { - stopIfIdle() + // TODO It would be nice to know if the service really can be stopped instead of just + // checking if it is idle once... + val handler = Handler(Looper.getMainLooper()) + handler.postDelayed({ stopIfIdle() }, 1000) } @Synchronized @@ -740,14 +745,16 @@ class MediaPlayerService : Service() { private const val NOTIFICATION_CHANNEL_NAME = "Ultrasonic background service" private const val NOTIFICATION_ID = 3033 + @Volatile private var instance: MediaPlayerService? = null private val instanceLock = Any() @JvmStatic fun getInstance(): MediaPlayerService? { val context = UApp.applicationContext() - synchronized(instanceLock) { - for (i in 0..19) { + for (i in 0..19) { + if (instance != null) return instance + synchronized(instanceLock) { if (instance != null) return instance if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService( @@ -756,10 +763,10 @@ class MediaPlayerService : Service() { } else { context.startService(Intent(context, MediaPlayerService::class.java)) } - Util.sleepQuietly(50L) } - return instance + Util.sleepQuietly(100L) } + return instance } @JvmStatic