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 56984123..3c8fbf73 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/Downloader.kt +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/Downloader.kt @@ -119,7 +119,7 @@ class Downloader( while (activelyDownloading.size < PARALLEL_DOWNLOADS && downloadQueue.size > 0) { val task = downloadQueue.remove() activelyDownloading.add(task) - task.download() + startDownloadOnService(task) // The next file on the playlist is currently downloading if (playlist.indexOf(task) == 1) { @@ -128,6 +128,12 @@ class Downloader( } } + private fun startDownloadOnService(task: DownloadFile) { + MediaPlayerService.executeOnStartedMediaPlayerService { + task.download() + } + } + private fun cleanupActiveDownloads() { activelyDownloading.retainAll { when { diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java index da7b6bb9..6c70339d 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/CancellableTask.java @@ -18,11 +18,11 @@ */ package org.moire.ultrasonic.util; -import timber.log.Timber; - import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import timber.log.Timber; + /** * @author Sindre Mehus * @version $Id$ @@ -93,7 +93,7 @@ public abstract class CancellableTask thread.get().start(); } - public static interface OnCancelListener + public interface OnCancelListener { void onCancel(); } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java index 28404977..18d66684 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Constants.java @@ -87,7 +87,6 @@ public final class Constants public static final String PREFERENCES_KEY_PRELOAD_COUNT = "preloadCount"; public static final String PREFERENCES_KEY_HIDE_MEDIA = "hideMedia"; public static final String PREFERENCES_KEY_MEDIA_BUTTONS = "mediaButtons"; - public static final String PREFERENCES_KEY_SCREEN_LIT_ON_DOWNLOAD = "screenLitOnDownload"; public static final String PREFERENCES_KEY_SCROBBLE = "scrobble"; public static final String PREFERENCES_KEY_SERVER_SCALING = "serverScaling"; public static final String PREFERENCES_KEY_REPEAT_MODE = "repeatMode"; diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/ImageLoader.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/ImageLoader.kt index 73862c20..6d24a54f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/ImageLoader.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/imageloader/ImageLoader.kt @@ -162,8 +162,7 @@ class ImageLoader( var inputStream: InputStream? = null try { inputStream = response.stream - val bytes = Util.toByteArray(inputStream) - + val bytes = inputStream!!.readBytes() var outputStream: OutputStream? = null try { outputStream = FileOutputStream(file) 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 bb486fa7..de341825 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt @@ -7,21 +7,11 @@ package org.moire.ultrasonic.service -import android.content.Context import android.net.wifi.WifiManager.WifiLock -import android.os.PowerManager -import android.os.PowerManager.WakeLock import android.text.TextUtils import androidx.lifecycle.MutableLiveData -import java.io.File -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.io.OutputStream -import java.io.RandomAccessFile import org.koin.core.component.KoinComponent import org.koin.core.component.inject -import org.moire.ultrasonic.app.UApp import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.service.MusicServiceFactory.getMusicService import org.moire.ultrasonic.subsonic.ImageLoaderProvider @@ -30,6 +20,12 @@ import org.moire.ultrasonic.util.CancellableTask import org.moire.ultrasonic.util.FileUtil import org.moire.ultrasonic.util.Util import timber.log.Timber +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.io.RandomAccessFile /** * This class represents a singe Song or Video that can be downloaded. @@ -208,10 +204,8 @@ class DownloadFile( override fun execute() { var inputStream: InputStream? = null var outputStream: FileOutputStream? = null - var wakeLock: WakeLock? = null var wifiLock: WifiLock? = null try { - wakeLock = acquireWakeLock(wakeLock) wifiLock = Util.createWifiLock(toString()) wifiLock.acquire() @@ -306,29 +300,12 @@ class DownloadFile( } finally { Util.close(inputStream) Util.close(outputStream) - if (wakeLock != null) { - wakeLock.release() - Timber.i("Released wake lock %s", wakeLock) - } wifiLock?.release() CacheCleaner().cleanSpace() downloader.checkDownloads() } } - private fun acquireWakeLock(wakeLock: WakeLock?): WakeLock? { - var wakeLock1 = wakeLock - if (Util.isScreenLitOnDownload()) { - val context = UApp.applicationContext() - val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager - val flags = PowerManager.SCREEN_DIM_WAKE_LOCK or PowerManager.ON_AFTER_RELEASE - wakeLock1 = pm.newWakeLock(flags, toString()) - wakeLock1.acquire(10 * 60 * 1000L /*10 minutes*/) - Timber.i("Acquired wake lock %s", wakeLock1) - } - return wakeLock1 - } - override fun toString(): String { return String.format("DownloadTask (%s)", song) } 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 7f234a75..b76b0b93 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerService.kt @@ -47,6 +47,9 @@ import timber.log.Timber /** * Android Foreground Service for playing music * while the rest of the Ultrasonic App is in the background. + * + * "A foreground service is a service that the user is + * actively aware of and isn’t a candidate for the system to kill when low on memory." */ @Suppress("LargeClass") class MediaPlayerService : Service() { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt index a1db4420..ed847ffd 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt @@ -102,14 +102,6 @@ object Util { return applicationContext() } - fun isScreenLitOnDownload(): Boolean { - val preferences = getPreferences() - return preferences.getBoolean( - Constants.PREFERENCES_KEY_SCREEN_LIT_ON_DOWNLOAD, - false - ) - } - var repeatMode: RepeatMode get() { val preferences = getPreferences() @@ -221,38 +213,6 @@ object Util { fun getPreferences(): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext()) - /** - * Get the contents of an `InputStream` as a `byte[]`. - * - * - * This method buffers the input internally, so there is no need to use a - * `BufferedInputStream`. - * - * @param input the `InputStream` to read from - * @return the requested byte array - * @throws NullPointerException if the input is null - * @throws java.io.IOException if an I/O error occurs - */ - @Throws(IOException::class) - fun toByteArray(input: InputStream?): ByteArray { - val output = ByteArrayOutputStream() - copy(input!!, output) - return output.toByteArray() - } - - @Throws(IOException::class) - @Suppress("MagicNumber") - fun copy(input: InputStream, output: OutputStream): Long { - val buffer = ByteArray(KBYTE * 4) - var count: Long = 0 - var n: Int - while (-1 != input.read(buffer).also { n = it }) { - output.write(buffer, 0, n) - count += n.toLong() - } - return count - } - @Throws(IOException::class) fun atomicCopy(from: File, to: File) { val tmp = File(String.format(Locale.ROOT, "%s.tmp", to.path)) diff --git a/ultrasonic/src/main/res/xml/settings.xml b/ultrasonic/src/main/res/xml/settings.xml index 46ad73b9..1947f681 100644 --- a/ultrasonic/src/main/res/xml/settings.xml +++ b/ultrasonic/src/main/res/xml/settings.xml @@ -343,12 +343,6 @@ a:summary="@string/settings.hide_media_summary" a:title="@string/settings.hide_media_title" app:iconSpaceReserved="false"/> -