diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 28c931538..9732a6274 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -30,6 +30,41 @@ (); } +# Kotlin Serialization +-keepattributes *Annotation*, InnerClasses +-dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations + +# kotlinx-serialization-json specific. Add this if you have java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer +-keepclassmembers class kotlinx.serialization.json.** { + *** Companion; +} +-keepclasseswithmembers class kotlinx.serialization.json.** { + kotlinx.serialization.KSerializer serializer(...); +} + +-keep,includedescriptorclasses class eu.kanade.tachiyomi.**$$serializer { *; } +-keepclassmembers class eu.kanade.tachiyomi.** { + *** Companion; +} +-keepclasseswithmembers class eu.kanade.tachiyomi.** { + kotlinx.serialization.KSerializer serializer(...); +} +-keep,includedescriptorclasses class exh.**$$serializer { *; } +-keepclassmembers class exh.** { + *** Companion; +} +-keepclasseswithmembers class exh.** { + kotlinx.serialization.KSerializer serializer(...); +} + +-keep,includedescriptorclasses class xyz.nulldev.ts.api.http.serializer.**$$serializer { *; } +-keepclassmembers class xyz.nulldev.ts.api.http.serializer.** { + *** Companion; +} +-keepclasseswithmembers class xyz.nulldev.ts.api.http.serializer.** { + kotlinx.serialization.KSerializer serializer(...); +} + # Madokami extension username and password crash fix -keepclassmembers class androidx.preference.EditTextPreference { *** mOnBindEditTextListener; diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt index 240796c04..eb11be660 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/full/FullBackupManager.kt @@ -164,7 +164,7 @@ class FullBackupManager(val context: Context) : AbstractBackupManager() { private fun backupSavedSearches(): List { return preferences.eh_savedSearches().get().map { val sourceId = it.substringBefore(':').toLong() - val content = JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + val content = Json.decodeFromString(it.substringAfter(':')) BackupSavedSearch( content.name, content.query, @@ -490,7 +490,7 @@ class FullBackupManager(val context: Context) : AbstractBackupManager() { internal fun restoreSavedSearches(backupSavedSearches: List) { val currentSavedSearches = preferences.eh_savedSearches().get().map { val sourceId = it.substringBefore(':').toLong() - val content = JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + val content = Json.decodeFromString(it.substringAfter(':')) BackupSavedSearch( content.name, content.query, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/legacy/LegacyBackupManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/legacy/LegacyBackupManager.kt index be49b45e4..8cc1a87ae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/legacy/LegacyBackupManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/legacy/LegacyBackupManager.kt @@ -549,7 +549,7 @@ class LegacyBackupManager(val context: Context, version: Int = CURRENT_VERSION) val newSavedSearches = backupSavedSearches.mapNotNull { try { val id = it.substringBefore(':').toLong() - val content = JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + val content = Json.decodeFromString(it.substringAfter(':')) id to content } catch (t: RuntimeException) { // Load failed @@ -564,7 +564,7 @@ class LegacyBackupManager(val context: Context, version: Int = CURRENT_VERSION) newSavedSearches += preferences.eh_savedSearches().get().mapNotNull { try { val id = it.substringBefore(':').toLong() - val content = JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + val content = Json.decodeFromString(it.substringAfter(':')) id to content } catch (t: RuntimeException) { // Load failed diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt index 8956bd4c1..1dd939b1f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubApi.kt @@ -8,8 +8,6 @@ import eu.kanade.tachiyomi.extension.util.ExtensionLoader import exh.source.BlacklistedSources import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.int import kotlinx.serialization.json.jsonObject @@ -25,8 +23,7 @@ internal class ExtensionGithubApi { val service: ExtensionGithubService = ExtensionGithubService.create() return withContext(Dispatchers.IO) { - val response = Json.decodeFromString(service.getRepo().toString()) - + val response = service.getRepo() parseResponse(response) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt index 052bf8d66..c8848b08c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/api/ExtensionGithubService.kt @@ -1,9 +1,11 @@ package eu.kanade.tachiyomi.extension.api -import com.google.gson.JsonArray +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import eu.kanade.tachiyomi.network.NetworkHelper +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray +import okhttp3.MediaType.Companion.toMediaType import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory import retrofit2.http.GET import uy.kohesive.injekt.injectLazy @@ -29,7 +31,7 @@ interface ExtensionGithubService { fun create(): ExtensionGithubService { val adapter = Retrofit.Builder() .baseUrl(ExtensionGithubApi.BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) .client(client) .build() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt index 414fdee1d..9184a92b3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt @@ -461,7 +461,7 @@ open class BrowseSourcePresenter( try { val id = it.substringBefore(':').toLong() if (id != source.id) return@map null - val content = JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + val content = Json.decodeFromString(it.substringAfter(':')) val originalFilters = source.getFilterList() filterSerializer.deserialize(originalFilters, content.filters) EXHSavedSearch( diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt index 81b485333..de922014f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexPresenter.kt @@ -231,7 +231,7 @@ open class IndexPresenter( try { val id = it.substringBefore(':').toLong() if (id != source.id) return@map null - val content = JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + val content = Json.decodeFromString(it.substringAfter(':')) val originalFilters = source.getFilterList() filterSerializer.deserialize(originalFilters, content.filters) EXHSavedSearch( diff --git a/app/src/main/java/exh/debug/DebugFunctions.kt b/app/src/main/java/exh/debug/DebugFunctions.kt index be790b246..c200b7de8 100644 --- a/app/src/main/java/exh/debug/DebugFunctions.kt +++ b/app/src/main/java/exh/debug/DebugFunctions.kt @@ -239,7 +239,7 @@ object DebugFunctions { try { val id = it.substringBefore(':').toLong() if (id != source.id) return@mapNotNull null - JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + Json.decodeFromString(it.substringAfter(':')) } catch (t: RuntimeException) { // Load failed XLog.e("Failed to load saved search!", t) @@ -251,7 +251,7 @@ object DebugFunctions { try { val id = it.substringBefore(':').toLong() if (id != newSource.id) return@mapNotNull null - JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + Json.decodeFromString(it.substringAfter(':')) } catch (t: RuntimeException) { // Load failed XLog.e("Failed to load saved search!", t) @@ -278,7 +278,7 @@ object DebugFunctions { try { val id = it.substringBefore(':').toLong() if (id != source.id) return@mapNotNull null - JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + Json.decodeFromString(it.substringAfter(':')) } catch (t: RuntimeException) { // Load failed XLog.e("Failed to load saved search!", t) @@ -290,7 +290,7 @@ object DebugFunctions { try { val id = it.substringBefore(':').toLong() if (id != newSource.id) return@mapNotNull null - JsonSavedSearch.fromJsonObject(Json.decodeFromString(it.substringAfter(':'))) + Json.decodeFromString(it.substringAfter(':')) } catch (t: RuntimeException) { // Load failed XLog.e("Failed to load saved search!", t) diff --git a/app/src/main/java/exh/savedsearches/JsonSavedSearch.kt b/app/src/main/java/exh/savedsearches/JsonSavedSearch.kt index 5f5a5bb0e..560551cc4 100644 --- a/app/src/main/java/exh/savedsearches/JsonSavedSearch.kt +++ b/app/src/main/java/exh/savedsearches/JsonSavedSearch.kt @@ -2,23 +2,10 @@ package exh.savedsearches import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.jsonArray -import kotlinx.serialization.json.jsonPrimitive @Serializable data class JsonSavedSearch( val name: String, val query: String, val filters: JsonArray -) { - companion object { - fun fromJsonObject(json: JsonObject): JsonSavedSearch { - return JsonSavedSearch( - json["name"]!!.jsonPrimitive.content, - json["query"]!!.jsonPrimitive.content, - json["filters"]!!.jsonArray, - ) - } - } -} +)