From 0d594da6c9ff9842b83bd9d62cc383eead9b0a52 Mon Sep 17 00:00:00 2001 From: tarsin Date: Wed, 22 Feb 2023 20:26:06 +0800 Subject: [PATCH] Cleanup some nullability --- app/src/main/java/com/hippo/ehviewer/EhDB.kt | 44 ++++++------------- .../ehviewer/download/DownloadManager.kt | 28 ++++++++---- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.kt b/app/src/main/java/com/hippo/ehviewer/EhDB.kt index aae59a833..8b8495c5f 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhDB.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhDB.kt @@ -49,16 +49,10 @@ object EhDB { // Fix state @get:Synchronized val allDownloadInfo: List - get() { - val dao = db.downloadsDao() - val list = dao.list() - // Fix state - for (info in list) { - if (info.state == DownloadInfo.STATE_WAIT || info.state == DownloadInfo.STATE_DOWNLOAD) { - info.state = DownloadInfo.STATE_NONE - } + get() = db.downloadsDao().list().onEach { + if (it.state == DownloadInfo.STATE_WAIT || it.state == DownloadInfo.STATE_DOWNLOAD) { + it.state = DownloadInfo.STATE_NONE } - return list } @Synchronized @@ -67,16 +61,14 @@ object EhDB { dao.update(downloadInfos) } - // Insert or update @Synchronized fun putDownloadInfo(downloadInfo: DownloadInfo) { - val dao = db.downloadsDao() - if (null != dao.load(downloadInfo.gid)) { - // Update - dao.update(downloadInfo) - } else { - // Insert - dao.insert(downloadInfo) + db.downloadsDao().run { + if (load(downloadInfo.gid) != null) { + update(downloadInfo) + } else { + insert(downloadInfo) + } } } @@ -92,20 +84,15 @@ object EhDB { return raw?.dirname } - /** - * Insert or update - */ @Synchronized fun putDownloadDirname(gid: Long, dirname: String?) { val dao = db.downloadDirnameDao() var raw = dao.load(gid) - if (raw != null) { // Update + if (raw != null) { raw.dirname = dirname dao.update(raw) - } else { // Insert - raw = DownloadDirname() - raw.gid = gid - raw.dirname = dirname + } else { + raw = DownloadDirname(gid, dirname) dao.insert(raw) } } @@ -124,13 +111,10 @@ object EhDB { @get:Synchronized val allDownloadLabelList: List - get() { - val dao = db.downloadLabelDao() - return dao.list() - } + get() = db.downloadLabelDao().list() @Synchronized - fun addDownloadLabel(label: String?): DownloadLabel { + fun addDownloadLabel(label: String): DownloadLabel { val dao = db.downloadLabelDao() val raw = DownloadLabel() raw.label = label diff --git a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt index 3681abcb1..8f55d03ea 100644 --- a/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt +++ b/app/src/main/java/com/hippo/ehviewer/download/DownloadManager.kt @@ -37,6 +37,8 @@ import com.hippo.yorozuya.collect.LongList import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import java.util.LinkedList +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract object DownloadManager : OnSpiderListener { // All download info list @@ -92,14 +94,20 @@ object DownloadManager : OnSpiderListener { allInfoMap.put(info.gid, info) // Add to each label list - var list = getInfoListForLabel(info.label) - if (list == null) { - // Can't find the label in label list - list = LinkedList() - map[info.label] = list - if (!containLabel(info.label)) { + val label = info.label + + val list = getInfoListForLabel(label) ?: LinkedList().also { + /* Contracts says if [getInfoListForLabel] return null, the param [label] is not null + * [label] is local immutable + * Why [label] is not smart casted to [String!] here ??? + * + * TODO: Report it to kotlin compiler team + */ + label!! + map[info.label] = it + if (!containLabel(label)) { // Add label to DB and list - labels.add(EhDB.addDownloadLabel(info.label)) + labels.add(EhDB.addDownloadLabel(label)) } } list.add(info) @@ -109,7 +117,11 @@ object DownloadManager : OnSpiderListener { mDownloadInfoListeners = ArrayList() } + @OptIn(ExperimentalContracts::class) private fun getInfoListForLabel(label: String?): LinkedList? { + contract { + returns(null) implies (label != null) + } return if (label == null) { mDefaultInfoList } else { @@ -342,7 +354,7 @@ object DownloadManager : OnSpiderListener { mMap[info.label] = list if (!containLabel(info.label)) { // Add label to DB and list - mLabelList.add(EhDB.addDownloadLabel(info.label)) + mLabelList.add(EhDB.addDownloadLabel(info.label!!)) } } list.add(info)