diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 145f7a65c..683a4118d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -30,6 +30,7 @@ import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.util.find import org.koitharu.kotatsu.parsers.util.mapNotNullToSet import org.koitharu.kotatsu.parsers.util.mapToSet +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.reader.domain.ReaderColorFilter import java.io.File import java.net.Proxy @@ -413,10 +414,10 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { get() = prefs.getString(KEY_PROXY_PORT, null)?.toIntOrNull() ?: 0 val proxyLogin: String? - get() = prefs.getString(KEY_PROXY_LOGIN, null)?.takeUnless { it.isEmpty() } + get() = prefs.getString(KEY_PROXY_LOGIN, null)?.nullIfEmpty() val proxyPassword: String? - get() = prefs.getString(KEY_PROXY_PASSWORD, null)?.takeUnless { it.isEmpty() } + get() = prefs.getString(KEY_PROXY_PASSWORD, null)?.nullIfEmpty() var localListOrder: SortOrder get() = prefs.getEnumValue(KEY_LOCAL_LIST_ORDER, SortOrder.NEWEST) @@ -493,7 +494,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { get() = prefs.getBoolean(KEY_BACKUP_TG_ENABLED, false) val backupTelegramChatId: String? - get() = prefs.getString(KEY_BACKUP_TG_CHAT, null)?.takeUnless { it.isEmpty() } + get() = prefs.getString(KEY_BACKUP_TG_CHAT, null)?.nullIfEmpty() val isReadingTimeEstimationEnabled: Boolean get() = prefs.getBoolean(KEY_READING_TIME, true) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt index 8b38fb341..0f491099d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/SourceSettings.kt @@ -11,6 +11,7 @@ import org.koitharu.kotatsu.parsers.config.ConfigKey import org.koitharu.kotatsu.parsers.config.MangaSourceConfig import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.SortOrder +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.settings.utils.validation.DomainValidator class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig { @@ -38,7 +39,7 @@ class SourceSettings(context: Context, source: MangaSource) : MangaSourceConfig is ConfigKey.ShowSuspiciousContent -> prefs.getBoolean(key.key, key.defaultValue) is ConfigKey.SplitByTranslations -> prefs.getBoolean(key.key, key.defaultValue) - is ConfigKey.PreferredImageServer -> prefs.getString(key.key, key.defaultValue)?.takeUnless(String::isEmpty) + is ConfigKey.PreferredImageServer -> prefs.getString(key.key, key.defaultValue)?.nullIfEmpty() } as T } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/ContentResolver.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/ContentResolver.kt index 3f273a060..883df5b5a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/ContentResolver.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/ContentResolver.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.os.Build import android.os.storage.StorageManager import android.provider.DocumentsContract +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.parsers.util.removeSuffix import java.io.File import java.lang.reflect.Array as ArrayReflect @@ -80,7 +81,7 @@ private fun getVolumePathForAndroid11AndAbove(volumeId: String, context: Context private fun getVolumeIdFromTreeUri(treeUri: Uri): String? { val docId = DocumentsContract.getTreeDocumentId(treeUri) val split = docId.split(":".toRegex()) - return split.firstOrNull()?.takeUnless { it.isEmpty() } + return split.firstOrNull()?.nullIfEmpty() } private fun getDocumentPathFromTreeUri(treeUri: Uri): String? { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PageThumbnailAD.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PageThumbnailAD.kt index 494cbfdd7..71d2f26c6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PageThumbnailAD.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PageThumbnailAD.kt @@ -17,6 +17,7 @@ import org.koitharu.kotatsu.core.util.ext.newImageRequest import org.koitharu.kotatsu.core.util.ext.setTextColorAttr import org.koitharu.kotatsu.databinding.ItemPageThumbBinding import org.koitharu.kotatsu.list.ui.model.ListModel +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import com.google.android.material.R as materialR fun pageThumbnailAD( @@ -36,7 +37,7 @@ fun pageThumbnailAD( AdapterDelegateClickListenerAdapter(this, clickListener).attach(itemView) bind { - val data: Any = item.page.preview?.takeUnless { it.isEmpty() } ?: item.page.toMangaPage() + val data: Any = item.page.preview?.nullIfEmpty() ?: item.page.toMangaPage() binding.imageViewThumb.newImageRequest(lifecycleOwner, data)?.run { defaultPlaceholders(context) size(thumbSize) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/FilterCoordinator.kt b/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/FilterCoordinator.kt index d01f44e23..0d58c83a0 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/FilterCoordinator.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/filter/ui/FilterCoordinator.kt @@ -36,6 +36,7 @@ import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.SortOrder import org.koitharu.kotatsu.parsers.model.YEAR_MIN import org.koitharu.kotatsu.parsers.util.ifZero +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.parsers.util.suspendlazy.suspendLazy import org.koitharu.kotatsu.remotelist.ui.RemoteListFragment import org.koitharu.kotatsu.search.domain.MangaSearchRepository @@ -267,7 +268,7 @@ class FilterCoordinator @Inject constructor( } fun setQuery(value: String?) { - val newQuery = value?.trim()?.takeUnless { it.isEmpty() } + val newQuery = value?.trim()?.nullIfEmpty() currentListFilter.update { oldValue -> if (capabilities.isSearchWithFiltersSupported || newQuery == null) { oldValue.copy(query = newQuery) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt index a2e65e65b..de13d0b2b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt @@ -10,6 +10,7 @@ import com.google.android.material.badge.BadgeDrawable import com.google.android.material.badge.BadgeUtils import com.google.android.material.badge.ExperimentalBadgeUtils import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.parsers.util.nullIfEmpty @CheckResult fun View.bindBadge(badge: BadgeDrawable?, counter: Int): BadgeDrawable? { @@ -34,7 +35,7 @@ private fun View.bindBadgeImpl( if (counter > 0) { badgeDrawable.number = counter } else { - badgeDrawable.text = text?.takeUnless { it.isEmpty() } + badgeDrawable.text = text?.nullIfEmpty() } badgeDrawable.isVisible = true badgeDrawable.align(this) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt index 474ec79ba..95ea5fa31 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt @@ -33,6 +33,7 @@ import org.koitharu.kotatsu.core.util.ext.setValueRounded import org.koitharu.kotatsu.databinding.ActivityColorFilterBinding import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.util.format +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.reader.domain.ReaderColorFilter import javax.inject.Inject import com.google.android.material.R as materialR @@ -132,7 +133,7 @@ class ColorFilterConfigActivity : } private fun loadPreview(page: MangaPage) { - val data: Any = page.preview?.takeUnless { it.isEmpty() } ?: page + val data: Any = page.preview?.nullIfEmpty() ?: page ImageRequest.Builder(this@ColorFilterConfigActivity) .data(data) .scale(Scale.FILL) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/data/ScrobblerStorage.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/data/ScrobblerStorage.kt index c5fc090a1..d4b15e415 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/data/ScrobblerStorage.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/common/data/ScrobblerStorage.kt @@ -3,6 +3,7 @@ package org.koitharu.kotatsu.scrobbling.common.data import android.content.Context import androidx.core.content.edit import org.jsoup.internal.StringUtil.StringJoiner +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerService import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblerUser @@ -31,7 +32,7 @@ class ScrobblerStorage(context: Context, service: ScrobblerService) { ScrobblerUser( id = lines[0].toLong(), nickname = lines[1], - avatar = lines[2].takeUnless(String::isEmpty), + avatar = lines[2].nullIfEmpty(), service = ScrobblerService.valueOf(lines[3]), ) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/kitsu/data/KitsuInterceptor.kt b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/kitsu/data/KitsuInterceptor.kt index 9fe5b3f35..aac301e3b 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/kitsu/data/KitsuInterceptor.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/scrobbling/kitsu/data/KitsuInterceptor.kt @@ -7,6 +7,7 @@ import okhttp3.internal.closeQuietly import okio.IOException import org.koitharu.kotatsu.core.network.CommonHeaders import org.koitharu.kotatsu.parsers.util.mimeType +import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.parsers.util.parseHtml import org.koitharu.kotatsu.parsers.util.runCatchingCancellable import org.koitharu.kotatsu.scrobbling.common.data.ScrobblerStorage @@ -34,7 +35,7 @@ class KitsuInterceptor(private val storage: ScrobblerStorage) : Interceptor { } if (response.mimeType?.toMediaTypeOrNull()?.subtype == SUBTYPE_HTML) { val message = runCatchingCancellable { - response.parseHtml().title().takeUnless { it.isEmpty() } + response.parseHtml().title().nullIfEmpty() }.onFailure { response.closeQuietly() }.getOrNull() ?: "Invalid response (${response.code})" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0a64245c7..a8dae4831 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,7 +17,7 @@ diskLruCache = "1.4" fragment = "1.8.5" gradle = "8.7.3" guava = "33.3.1-android" -hilt = "2.53" +hilt = "2.53.1" hiltWork = "1.2.0" json = "20240303" junit = "4.13.2" @@ -28,10 +28,10 @@ leakcanary = "3.0-alpha-8" lifecycle = "2.8.7" markwon = "4.6.2" material = "1.13.0-alpha08" -moshi = "1.15.1" +moshi = "1.15.2" okhttp = "4.12.0" okio = "3.9.1" -parsers = "fece09b781" +parsers = "f86d31f811" preference = "1.2.1" recyclerview = "1.3.2" room = "2.6.1"