From 107146c8d95e973b2e749c94df533d9972d97b29 Mon Sep 17 00:00:00 2001 From: Nite Date: Thu, 16 Dec 2021 14:18:54 +0100 Subject: [PATCH] Minor cleanup, added comments --- .../moire/ultrasonic/service/DownloadFile.kt | 10 +++++-- .../moire/ultrasonic/service/Downloader.kt | 2 +- .../org/moire/ultrasonic/util/AbstractFile.kt | 3 ++ .../org/moire/ultrasonic/util/JavaFile.kt | 4 +++ .../moire/ultrasonic/util/ResettableLazy.kt | 10 +++++++ .../org/moire/ultrasonic/util/Storage.kt | 30 +++++++++---------- .../org/moire/ultrasonic/util/StorageFile.kt | 4 +++ 7 files changed, 45 insertions(+), 18 deletions(-) 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 0b4dbbcc..ca9517c5 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt @@ -69,7 +69,13 @@ class DownloadFile( val progress: MutableLiveData = MutableLiveData(0) - val lazyStatus: Lazy = lazy { + // We must be able to query if the status is initialized. + // The status is lazy because DownloadFiles are usually created in bulk, and + // checking their status possibly means a slow SAF operation. + val isStatusInitialized: Boolean + get() = lazyInitialStatus.isInitialized() + + private val lazyInitialStatus: Lazy = lazy { when { Storage.isPathExists(saveFile) -> { DownloadStatus.PINNED @@ -84,7 +90,7 @@ class DownloadFile( } val status: MutableLiveData by lazy { - MutableLiveData(lazyStatus.value) + MutableLiveData(lazyInitialStatus.value) } init { 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 bbc60775..d2c0ea22 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt @@ -267,7 +267,7 @@ class Downloader( temp.addAll(downloadQueue) temp.addAll( playlist.filter { - if (!it.lazyStatus.isInitialized()) false + if (!it.isStatusInitialized) false else when (it.status.value) { DownloadStatus.DOWNLOADING -> true else -> false diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/AbstractFile.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/AbstractFile.kt index 10e374e8..282dcdc8 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/AbstractFile.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/AbstractFile.kt @@ -12,6 +12,9 @@ import java.io.IOException import java.io.InputStream import java.io.OutputStream +/** + * Contains the abstract file operations which Ultrasonic uses during the media store access + */ abstract class AbstractFile : Comparable { abstract val name: String abstract val isDirectory: Boolean diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/JavaFile.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/JavaFile.kt index 9cfc32a6..fda48969 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/JavaFile.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/JavaFile.kt @@ -16,6 +16,10 @@ import java.io.InputStream import java.io.OutputStream import org.moire.ultrasonic.app.UApp +/** + * The java.io.File based implementation of AbstractFile + * This class is used when the Ultrasonic directory is set as media storage + */ class JavaFile(override val parent: AbstractFile?, val file: File) : AbstractFile() { override val name: String = file.name override val isDirectory: Boolean = file.isDirectory diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ResettableLazy.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ResettableLazy.kt index 9d77b8d9..a52f8de8 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ResettableLazy.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/ResettableLazy.kt @@ -1,8 +1,18 @@ +/* + * ResettableLazy.kt + * Copyright (C) 2009-2021 Ultrasonic developers + * + * Distributed under terms of the GNU GPLv3 license. + */ + package org.moire.ultrasonic.util import java.util.concurrent.atomic.AtomicReference import kotlin.reflect.KProperty +/** + * This class is similar to Lazy, but its value can be reset and then reinitialized + */ class ResettableLazy(private val initializer: () -> T) { private val lazyRef: AtomicReference> = AtomicReference( lazy( diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Storage.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Storage.kt index 64c5c4e0..27c9ea66 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Storage.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Storage.kt @@ -24,21 +24,6 @@ object Storage { getRoot()!! } - private fun getRoot(): AbstractFile? { - return if (Settings.cacheLocation.isUri()) { - val documentFile = DocumentFile.fromTreeUri( - UApp.applicationContext(), - Uri.parse(Settings.cacheLocation) - ) ?: return null - if (!documentFile.exists()) return null - StorageFile(null, documentFile.uri, documentFile.name!!, documentFile.isDirectory) - } else { - val file = File(Settings.cacheLocation) - if (!file.exists()) return null - JavaFile(null, file) - } - } - fun reset() { StorageFile.storageFilePathDictionary.clear() StorageFile.notExistingPathDictionary.clear() @@ -74,6 +59,21 @@ object Storage { fun rename(pathFrom: AbstractFile, pathTo: String) { mediaRoot.value.rename(pathFrom, pathTo) } + + private fun getRoot(): AbstractFile? { + return if (Settings.cacheLocation.isUri()) { + val documentFile = DocumentFile.fromTreeUri( + UApp.applicationContext(), + Uri.parse(Settings.cacheLocation) + ) ?: return null + if (!documentFile.exists()) return null + StorageFile(null, documentFile.uri, documentFile.name!!, documentFile.isDirectory) + } else { + val file = File(Settings.cacheLocation) + if (!file.exists()) return null + JavaFile(null, file) + } + } } fun String.isUri(): Boolean { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/StorageFile.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/StorageFile.kt index ca1bb857..714c6df9 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/StorageFile.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/StorageFile.kt @@ -18,6 +18,10 @@ import java.util.concurrent.ConcurrentHashMap import org.moire.ultrasonic.app.UApp import timber.log.Timber +/** + * The DocumentsContract based implementation of AbstractFile + * This class is used when a user selected directory is set as media storage + */ class StorageFile( override val parent: StorageFile?, var uri: Uri,