diff --git a/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt b/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt index f6742bc31..1d6a9d345 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookSourceController.kt @@ -8,7 +8,6 @@ import io.legado.app.data.entities.BookSource import io.legado.app.help.config.SourceConfig import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonArray -import io.legado.app.utils.fromJsonObject object BookSourceController { @@ -24,7 +23,7 @@ object BookSourceController { fun saveSource(postData: String?): ReturnData { val returnData = ReturnData() postData ?: return returnData.setErrorMsg("数据不能为空") - val bookSource = GSON.fromJsonObject(postData).getOrNull() + val bookSource = BookSource.fromJson(postData).getOrNull() if (bookSource != null) { if (TextUtils.isEmpty(bookSource.bookSourceName) || TextUtils.isEmpty(bookSource.bookSourceUrl)) { returnData.setErrorMsg("源名称和URL不能为空") @@ -41,7 +40,7 @@ object BookSourceController { fun saveSources(postData: String?): ReturnData { postData ?: return ReturnData().setErrorMsg("数据为空") val okSources = arrayListOf() - val bookSources = GSON.fromJsonArray(postData).getOrNull() + val bookSources = BookSource.fromJsonArray(postData).getOrNull() if (bookSources.isNullOrEmpty()) { return ReturnData().setErrorMsg("转换源失败") } diff --git a/app/src/main/java/io/legado/app/api/controller/RssSourceController.kt b/app/src/main/java/io/legado/app/api/controller/RssSourceController.kt index b60b8ae0f..6df9c5b28 100644 --- a/app/src/main/java/io/legado/app/api/controller/RssSourceController.kt +++ b/app/src/main/java/io/legado/app/api/controller/RssSourceController.kt @@ -5,9 +5,6 @@ import android.text.TextUtils import io.legado.app.api.ReturnData import io.legado.app.data.appDb import io.legado.app.data.entities.RssSource -import io.legado.app.utils.GSON -import io.legado.app.utils.fromJsonArray -import io.legado.app.utils.fromJsonObject object RssSourceController { @@ -23,7 +20,7 @@ object RssSourceController { fun saveSource(postData: String?): ReturnData { val returnData = ReturnData() postData ?: return returnData.setErrorMsg("数据不能为空") - GSON.fromJsonObject(postData).onFailure { + RssSource.fromJson(postData).onFailure { returnData.setErrorMsg("转换源失败${it.localizedMessage}") }.onSuccess { source -> if (TextUtils.isEmpty(source.sourceName) || TextUtils.isEmpty(source.sourceUrl)) { @@ -39,7 +36,7 @@ object RssSourceController { fun saveSources(postData: String?): ReturnData { postData ?: return ReturnData().setErrorMsg("数据不能为空") val okSources = arrayListOf() - val source = GSON.fromJsonArray(postData).getOrNull() + val source = RssSource.fromJsonArray(postData).getOrNull() if (source.isNullOrEmpty()) { return ReturnData().setErrorMsg("转换源失败") } @@ -66,7 +63,7 @@ object RssSourceController { fun deleteSources(postData: String?): ReturnData { postData ?: return ReturnData().setErrorMsg("没有传递数据") - GSON.fromJsonArray(postData).onFailure { + RssSource.fromJsonArray(postData).onFailure { return ReturnData().setErrorMsg("格式不对") }.onSuccess { it.forEach { source -> diff --git a/app/src/main/java/io/legado/app/data/entities/BookSource.kt b/app/src/main/java/io/legado/app/data/entities/BookSource.kt index ca1232f7f..0abab30ac 100644 --- a/app/src/main/java/io/legado/app/data/entities/BookSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BookSource.kt @@ -7,9 +7,11 @@ import io.legado.app.constant.AppPattern import io.legado.app.constant.BookSourceType import io.legado.app.data.entities.rule.* import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonArray import io.legado.app.utils.fromJsonObject import io.legado.app.utils.splitNotBlank import kotlinx.parcelize.Parcelize +import java.io.InputStream @Suppress("unused") @Parcelize @@ -218,6 +220,22 @@ data class BookSource( private fun equal(a: String?, b: String?) = a == b || (a.isNullOrEmpty() && b.isNullOrEmpty()) + companion object { + + fun fromJson(json: String): Result { + return GSON.fromJsonObject(json) + } + + fun fromJsonArray(json: String): Result> { + return GSON.fromJsonArray(json) + } + + fun fromJsonArray(inputStream: InputStream): Result> { + return GSON.fromJsonArray(inputStream) + } + + } + class Converters { @TypeConverter diff --git a/app/src/main/java/io/legado/app/data/entities/RssSource.kt b/app/src/main/java/io/legado/app/data/entities/RssSource.kt index 6c87f1213..95184d7e6 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssSource.kt @@ -2,12 +2,9 @@ package io.legado.app.data.entities import android.os.Parcelable import android.text.TextUtils -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room.* import io.legado.app.constant.AppPattern -import io.legado.app.utils.splitNotBlank +import io.legado.app.utils.* import kotlinx.parcelize.Parcelize @Parcelize @@ -171,4 +168,17 @@ data class RssSource( } } + @Suppress("MemberVisibilityCanBePrivate") + companion object { + + fun fromJson(json: String): Result { + return GSON.fromJsonObject(json) + } + + fun fromJsonArray(jsonArray: String): Result> { + return GSON.fromJsonArray(jsonArray) + } + + } + } diff --git a/app/src/main/java/io/legado/app/help/DefaultData.kt b/app/src/main/java/io/legado/app/help/DefaultData.kt index cc94b65b8..1d3079668 100644 --- a/app/src/main/java/io/legado/app/help/DefaultData.kt +++ b/app/src/main/java/io/legado/app/help/DefaultData.kt @@ -79,7 +79,7 @@ object DefaultData { appCtx.assets.open("defaultData${File.separator}rssSources.json") .readBytes() ) - GSON.fromJsonArray(json).getOrDefault(emptyList()) + RssSource.fromJsonArray(json).getOrDefault(emptyList()) } val coverRule: BookCover.CoverRule by lazy { diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt index 3e148a97c..c0388579b 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt @@ -191,7 +191,7 @@ class ImportBookSourceDialog() : BaseDialogFragment(R.layout.dialog_recycler_vie override fun onCodeSave(code: String, requestId: String?) { requestId?.toInt()?.let { - GSON.fromJsonObject(code).getOrNull()?.let { source -> + BookSource.fromJson(code).getOrNull()?.let { source -> viewModel.allSources[it] = source adapter.setItem(it, source) } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt index a505b41d7..620c25254 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt @@ -7,7 +7,6 @@ import com.jayway.jsonpath.JsonPath import io.legado.app.R import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppConst -import io.legado.app.constant.AppLog import io.legado.app.constant.AppPattern import io.legado.app.data.appDb import io.legado.app.data.entities.BookSource @@ -100,35 +99,31 @@ class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) { val json = JsonPath.parse(mText) json.read>("$.sourceUrls") }.onSuccess { - it.forEach { url -> - importSourceUrl(url) + it.forEach { + importSourceUrl(it) } }.onFailure { - GSON.fromJsonObject(mText).getOrThrow().let { + BookSource.fromJson(mText).getOrThrow().let { allSources.add(it) } } } - mText.isJsonArray() -> { - GSON.fromJsonArray(mText).getOrThrow().let { items -> - allSources.addAll(items) - } + mText.isJsonArray() -> BookSource.fromJsonArray(mText).getOrThrow().let { items -> + allSources.addAll(items) } mText.isAbsUrl() -> { importSourceUrl(mText) } mText.isUri() -> { val uri = Uri.parse(mText) - uri.inputStream(context).getOrThrow().use { - GSON.fromJsonArray(it).getOrThrow().let {bookSources -> - allSources.addAll(bookSources) - } + uri.inputStream(context).getOrThrow().let { + allSources.addAll(BookSource.fromJsonArray(it).getOrThrow()) } } else -> throw NoStackTraceException(context.getString(R.string.wrong_format)) } }.onError { - AppLog.put("读取书源出错", it) + it.printOnDebug() errorLiveData.postValue(it.localizedMessage ?: "") }.onSuccess { comparisonSource() @@ -144,7 +139,7 @@ class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) { url(url) } }.byteStream().let { - allSources.addAll(GSON.fromJsonArray(it).getOrThrow()) + allSources.addAll(BookSource.fromJsonArray(it).getOrThrow()) } } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt index 8bd3650e5..eff9a6d18 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceDialog.kt @@ -190,7 +190,7 @@ class ImportRssSourceDialog() : BaseDialogFragment(R.layout.dialog_recycler_view override fun onCodeSave(code: String, requestId: String?) { requestId?.toInt()?.let { - GSON.fromJsonObject(code).getOrNull()?.let { source -> + RssSource.fromJson(code).getOrNull()?.let { source -> viewModel.allSources[it] = source adapter.setItem(it, source) } diff --git a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt index 11b7695b3..51e421ab1 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt @@ -98,13 +98,13 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) { importSourceUrl(it) } } else { - GSON.fromJsonArray(mText).getOrThrow().let { + RssSource.fromJsonArray(mText).getOrThrow().let { allSources.addAll(it) } } } mText.isJsonArray() -> { - GSON.fromJsonArray(mText).getOrThrow().let { + RssSource.fromJsonArray(mText).getOrThrow().let { allSources.addAll(it) } } @@ -132,7 +132,7 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) { val items: List> = jsonPath.parse(body).read("$") for (item in items) { val jsonItem = jsonPath.parse(item) - GSON.fromJsonObject(jsonItem.jsonString()).getOrThrow().let { source -> + RssSource.fromJson(jsonItem.jsonString()).getOrThrow().let { source -> allSources.add(source) } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt index 8a5db5a83..d0b268e75 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditViewModel.kt @@ -93,12 +93,12 @@ class BookSourceEditViewModel(application: Application) : BaseViewModel(applicat text.isJsonArray() -> { val items: List> = jsonPath.parse(text).read("$") val jsonItem = jsonPath.parse(items[0]) - GSON.fromJsonObject(jsonItem.jsonString()).getOrElse { + BookSource.fromJson(jsonItem.jsonString()).getOrElse { ImportOldData.fromOldBookSource(jsonItem) } } text.isJsonObject() -> { - GSON.fromJsonObject(text).getOrElse { + BookSource.fromJson(text).getOrElse { val jsonItem = jsonPath.parse(text) ImportOldData.fromOldBookSource(jsonItem) } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt index 98632b9b1..74a3696fc 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditViewModel.kt @@ -9,8 +9,11 @@ import io.legado.app.data.entities.RssSource import io.legado.app.exception.NoStackTraceException import io.legado.app.help.RuleComplete import io.legado.app.help.http.CookieStore -import io.legado.app.utils.* +import io.legado.app.utils.getClipText +import io.legado.app.utils.printOnDebug +import io.legado.app.utils.stackTraceStr +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers @@ -54,7 +57,7 @@ class RssSourceEditViewModel(application: Application) : BaseViewModel(applicati execute(context = Dispatchers.Main) { var source: RssSource? = null context.getClipText()?.let { json -> - source = GSON.fromJsonObject(json).getOrThrow() + source = RssSource.fromJson(json).getOrThrow() } source }.onError { @@ -71,7 +74,7 @@ class RssSourceEditViewModel(application: Application) : BaseViewModel(applicati fun importSource(text: String, finally: (source: RssSource) -> Unit) { execute { val text1 = text.trim() - GSON.fromJsonObject(text1).getOrThrow().let { + RssSource.fromJson(text1).getOrThrow().let { finally.invoke(it) } }.onError { diff --git a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt index e13d284f8..8946a2c99 100644 --- a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt @@ -22,7 +22,7 @@ val GSON: Gson by lazy { ) .registerTypeAdapter(Int::class.java, IntJsonDeserializer()) .registerTypeAdapter(String::class.java, StringJsonDeserializer()) -// .registerTypeAdapter(ExploreRule::class.java, ExploreRule.jsonDeserializer) + .registerTypeAdapter(ExploreRule::class.java, ExploreRule.jsonDeserializer) // .registerTypeAdapter(SearchRule::class.java, SearchRule.jsonDeserializer) // .registerTypeAdapter(BookInfoRule::class.java, BookInfoRule.jsonDeserializer) // .registerTypeAdapter(TocRule::class.java, TocRule.jsonDeserializer)