From 611539be556595bc1c9004d34123c0a659575c46 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 12 Sep 2021 13:45:00 +0200 Subject: [PATCH] Handle WifiLock in Download manager class, instead of creating an individual lock per task. Also only stop the executor when done. --- .../moire/ultrasonic/service/Downloader.kt | 46 ++++++++++++++----- .../moire/ultrasonic/service/DownloadFile.kt | 10 +--- .../ultrasonic/service/MediaPlayerService.kt | 1 - 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/Downloader.kt b/ultrasonic/src/main/java/org/moire/ultrasonic/service/Downloader.kt index 3c8fbf73..3842be8d 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/Downloader.kt +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/Downloader.kt @@ -1,5 +1,6 @@ package org.moire.ultrasonic.service +import android.net.wifi.WifiManager import java.util.ArrayList import java.util.PriorityQueue import java.util.concurrent.Executors @@ -11,6 +12,7 @@ import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.domain.PlayerState import org.moire.ultrasonic.util.LRUCache import org.moire.ultrasonic.util.ShufflePlayBuffer +import org.moire.ultrasonic.util.Util import org.moire.ultrasonic.util.Util.getMaxSongs import org.moire.ultrasonic.util.Util.getPreloadCount import org.moire.ultrasonic.util.Util.isExternalStoragePresent @@ -39,27 +41,21 @@ class Downloader( private val downloadFileCache = LRUCache(100) private var executorService: ScheduledExecutorService? = null + private var wifiLock: WifiManager.WifiLock? = null + var playlistUpdateRevision: Long = 0 private set val downloadChecker = Runnable { try { - Timber.w("checking Downloads") + Timber.w("Checking Downloads") checkDownloadsInternal() } catch (all: Exception) { Timber.e(all, "checkDownloads() failed.") } } - fun onCreate() { - executorService = Executors.newSingleThreadScheduledExecutor() - executorService!!.scheduleWithFixedDelay( - downloadChecker, CHECK_INTERVAL, CHECK_INTERVAL, TimeUnit.SECONDS - ) - Timber.i("Downloader created") - } - fun onDestroy() { stop() clearPlaylist() @@ -67,16 +63,39 @@ class Downloader( Timber.i("Downloader destroyed") } + fun start() { + if (executorService == null) { + executorService = Executors.newSingleThreadScheduledExecutor() + executorService!!.scheduleWithFixedDelay( + downloadChecker, 0L, CHECK_INTERVAL, TimeUnit.SECONDS + ) + Timber.i("Downloader started") + } + + if (wifiLock == null) { + wifiLock = Util.createWifiLock(toString()) + wifiLock?.acquire() + } + } + fun stop() { - if (executorService != null) executorService!!.shutdown() + executorService?.shutdown() + executorService = null + wifiLock?.release() + wifiLock = null Timber.i("Downloader stopped") } fun checkDownloads() { - executorService?.execute(downloadChecker) + if (executorService == null || executorService!!.isTerminated) { + start() + } else { + executorService?.execute(downloadChecker) + } } @Synchronized + @Suppress("ComplexMethod") fun checkDownloadsInternal() { if (!isExternalStoragePresent() || !externalStorageMonitor.isExternalStorageAvailable) { return @@ -126,6 +145,11 @@ class Downloader( localMediaPlayer.setNextPlayerState(PlayerState.DOWNLOADING) } } + + // Stop Executor service when done downloading + if (activelyDownloading.size == 0) { + stop() + } } private fun startDownloadOnService(task: DownloadFile) { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt index c386ae2c..cccbc498 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt @@ -28,10 +28,7 @@ import org.moire.ultrasonic.util.Util import timber.log.Timber /** - * This class represents a singe Song or Video that can be downloaded. - * - * @author Sindre Mehus - * @version $Id$ + * This class represents a single Song or Video that can be downloaded. */ class DownloadFile( val song: MusicDirectory.Entry, @@ -204,11 +201,7 @@ class DownloadFile( override fun execute() { var inputStream: InputStream? = null var outputStream: FileOutputStream? = null - var wifiLock: WifiLock? = null try { - wifiLock = Util.createWifiLock(toString()) - wifiLock.acquire() - if (saveFile.exists()) { Timber.i("%s already exists. Skipping.", saveFile) return @@ -300,7 +293,6 @@ class DownloadFile( } finally { Util.close(inputStream) Util.close(outputStream) - wifiLock?.release() CacheCleaner().cleanSpace() downloader.checkDownloads() } 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 b76b0b93..5d1f5709 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt @@ -81,7 +81,6 @@ class MediaPlayerService : Service() { override fun onCreate() { super.onCreate() - downloader.onCreate() shufflePlayBuffer.onCreate() localMediaPlayer.init()