From 43295a58ebcad3e572c2448becc8600de959e37f Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sat, 7 Nov 2020 10:53:59 +0530 Subject: [PATCH 1/3] build: add kotlinx.serialization dependencies Signed-off-by: Harsh Shandilya --- buildSrc/src/main/java/Dependencies.kt | 8 ++++++++ lobsters-api/build.gradle.kts | 3 +++ model/build.gradle.kts | 2 ++ 3 files changed, 13 insertions(+) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index fa67766a..a666c6d2 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -9,12 +9,19 @@ private const val DAGGER_HILT_VERSION = "2.29.1-alpha" object Dependencies { const val COMPOSE_VERSION = "1.0.0-alpha06" object Kotlin { + object Coroutines { private const val version = "1.4.1" const val android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version" const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version" } + + object Serialization { + + private const val version = "1.0.1" + const val json = "org.jetbrains.kotlinx:kotlinx-serialization-json:$version" + } } object AndroidX { @@ -70,6 +77,7 @@ object Dependencies { const val accompanist = "dev.chrisbanes.accompanist:accompanist-coil:0.3.2" const val customtabs = "saschpe.android:customtabs:3.0.2" + const val retrofitSerialization = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" object Moshi { diff --git a/lobsters-api/build.gradle.kts b/lobsters-api/build.gradle.kts index 41c48b8d..77c3ac11 100644 --- a/lobsters-api/build.gradle.kts +++ b/lobsters-api/build.gradle.kts @@ -2,6 +2,7 @@ plugins { id("com.android.library") kotlin("android") kotlin("kapt") + kotlin("plugin.serialization") version "1.4.10" `lobsters-plugin` } @@ -9,6 +10,8 @@ dependencies { implementation(project(":model")) implementation(Dependencies.ThirdParty.Retrofit.lib) implementation(Dependencies.ThirdParty.Retrofit.moshi) + implementation(Dependencies.Kotlin.Serialization.json) + implementation(Dependencies.ThirdParty.retrofitSerialization) kaptTest(Dependencies.ThirdParty.Moshi.codegen) testImplementation(Dependencies.Testing.junit) testImplementation(Dependencies.Kotlin.Coroutines.core) diff --git a/model/build.gradle.kts b/model/build.gradle.kts index cf3f95c4..137c0ade 100644 --- a/model/build.gradle.kts +++ b/model/build.gradle.kts @@ -2,10 +2,12 @@ plugins { id("com.android.library") kotlin("android") kotlin("kapt") + kotlin("plugin.serialization") version "1.4.10" `lobsters-plugin` } dependencies { kapt(Dependencies.ThirdParty.Moshi.codegen) implementation(Dependencies.ThirdParty.Moshi.lib) + implementation(Dependencies.Kotlin.Serialization.json) } From 84f45f523aba55256b4aed933b48e33d585eb76f Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sat, 7 Nov 2020 11:15:54 +0530 Subject: [PATCH 2/3] Replace Moshi with kotlinx.serialization Signed-off-by: Harsh Shandilya --- app/build.gradle.kts | 3 +- .../data/source/LobstersApiTypeConverters.kt | 10 +++---- .../lobsters/ui/posts/LobstersItem.kt | 2 +- buildSrc/src/main/java/Dependencies.kt | 8 ------ lobsters-api/build.gradle.kts | 4 --- .../dev/msfjarvis/lobsters/api/ApiClient.kt | 6 ++-- model/build.gradle.kts | 3 -- .../lobsters/model/KeybaseSignature.kt | 10 +++---- .../msfjarvis/lobsters/model/LobstersPost.kt | 18 ++++++------ .../dev/msfjarvis/lobsters/model/Submitter.kt | 28 +++++++++---------- 10 files changed, 40 insertions(+), 52 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3c610c94..6621c1d7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,6 +4,7 @@ plugins { id("com.android.application") kotlin("android") kotlin("kapt") + kotlin("plugin.serialization") version "1.4.10" id("dagger.hilt.android.plugin") `lobsters-plugin` `core-library-desugaring` @@ -90,9 +91,9 @@ dependencies { implementation(Dependencies.ThirdParty.Roomigrant.runtime) implementation(Dependencies.AndroidX.material) implementation(Dependencies.AndroidX.Hilt.dagger) - implementation(Dependencies.ThirdParty.Moshi.lib) implementation(Dependencies.ThirdParty.accompanist) implementation(Dependencies.Kotlin.Coroutines.android) + implementation(Dependencies.Kotlin.Serialization.json) implementation(Dependencies.ThirdParty.customtabs) androidTestImplementation(Dependencies.Testing.daggerHilt) testImplementation(Dependencies.Testing.junit) diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt index 8a00c910..6694ad8a 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt @@ -1,24 +1,24 @@ package dev.msfjarvis.lobsters.data.source import androidx.room.TypeConverter -import com.squareup.moshi.Moshi import dev.msfjarvis.lobsters.model.Submitter -import dev.msfjarvis.lobsters.model.SubmitterJsonAdapter +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json object LobstersApiTypeConverters { - private val moshi = Moshi.Builder().build() private const val SEPARATOR = "," @TypeConverter @JvmStatic fun toSubmitterUser(value: String?): Submitter? { - return value?.let { SubmitterJsonAdapter(moshi).fromJson(value) } + return value?.let { Json.decodeFromString(value) } } @TypeConverter @JvmStatic fun fromSubmitterUser(value: Submitter?): String? { - return value?.let { SubmitterJsonAdapter(moshi).toJson(value) } + return value?.let { Json.encodeToString(value) } } @TypeConverter diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt index b43c71c2..8eac2e0f 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt @@ -136,7 +136,7 @@ fun PreviewLobstersItem() { "sevan", null, null, - null, + emptyList(), ), listOf("openbsd"), ) diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index a666c6d2..baeb360e 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -79,18 +79,10 @@ object Dependencies { const val customtabs = "saschpe.android:customtabs:3.0.2" const val retrofitSerialization = "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" - object Moshi { - - private const val version = "1.11.0" - const val codegen = "com.squareup.moshi:moshi-kotlin-codegen:$version" - const val lib = "com.squareup.moshi:moshi:$version" - } - object Retrofit { private const val version = "2.9.0" const val lib = "com.squareup.retrofit2:retrofit:$version" - const val moshi = "com.squareup.retrofit2:converter-moshi:$version" } object Roomigrant { diff --git a/lobsters-api/build.gradle.kts b/lobsters-api/build.gradle.kts index 77c3ac11..0dcb4ae5 100644 --- a/lobsters-api/build.gradle.kts +++ b/lobsters-api/build.gradle.kts @@ -1,18 +1,14 @@ plugins { id("com.android.library") kotlin("android") - kotlin("kapt") kotlin("plugin.serialization") version "1.4.10" `lobsters-plugin` } dependencies { implementation(project(":model")) - implementation(Dependencies.ThirdParty.Retrofit.lib) - implementation(Dependencies.ThirdParty.Retrofit.moshi) implementation(Dependencies.Kotlin.Serialization.json) implementation(Dependencies.ThirdParty.retrofitSerialization) - kaptTest(Dependencies.ThirdParty.Moshi.codegen) testImplementation(Dependencies.Testing.junit) testImplementation(Dependencies.Kotlin.Coroutines.core) testImplementation(Dependencies.Testing.mockWebServer) diff --git a/lobsters-api/src/main/java/dev/msfjarvis/lobsters/api/ApiClient.kt b/lobsters-api/src/main/java/dev/msfjarvis/lobsters/api/ApiClient.kt index 26f72f56..3922f16a 100644 --- a/lobsters-api/src/main/java/dev/msfjarvis/lobsters/api/ApiClient.kt +++ b/lobsters-api/src/main/java/dev/msfjarvis/lobsters/api/ApiClient.kt @@ -1,13 +1,15 @@ package dev.msfjarvis.lobsters.api +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import kotlinx.serialization.json.Json +import okhttp3.MediaType import retrofit2.Retrofit -import retrofit2.converter.moshi.MoshiConverterFactory object ApiClient { inline fun getClient(baseUrl: String): T { return Retrofit.Builder() .baseUrl(baseUrl) - .addConverterFactory(MoshiConverterFactory.create()) + .addConverterFactory(Json.asConverterFactory(MediaType.get("application/json"))) .build() .create(T::class.java) } diff --git a/model/build.gradle.kts b/model/build.gradle.kts index 137c0ade..bdd12aef 100644 --- a/model/build.gradle.kts +++ b/model/build.gradle.kts @@ -1,13 +1,10 @@ plugins { id("com.android.library") kotlin("android") - kotlin("kapt") kotlin("plugin.serialization") version "1.4.10" `lobsters-plugin` } dependencies { - kapt(Dependencies.ThirdParty.Moshi.codegen) - implementation(Dependencies.ThirdParty.Moshi.lib) implementation(Dependencies.Kotlin.Serialization.json) } diff --git a/model/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt b/model/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt index 6002a693..77a3b001 100644 --- a/model/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt +++ b/model/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt @@ -1,12 +1,12 @@ package dev.msfjarvis.lobsters.model -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -@JsonClass(generateAdapter = true) +@Serializable class KeybaseSignature( - @Json(name = "kb_username") + @SerialName("kb_username") val kbUsername: String, - @Json(name = "sig_hash") + @SerialName("sig_hash") val sigHash: String ) diff --git a/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt b/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt index f6d947bd..4a617b12 100644 --- a/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt +++ b/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt @@ -1,26 +1,26 @@ package dev.msfjarvis.lobsters.model -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -@JsonClass(generateAdapter = true) +@Serializable class LobstersPost( - @Json(name = "short_id") + @SerialName("short_id") val shortId: String, - @Json(name = "short_id_url") + @SerialName("short_id_url") val shortIdUrl: String, - @Json(name = "created_at") + @SerialName("created_at") val createdAt: String, val title: String, val url: String, val score: Long, val flags: Long, - @Json(name = "comment_count") + @SerialName("comment_count") val commentCount: Long, val description: String, - @Json(name = "comments_url") + @SerialName("comments_url") val commentsUrl: String, - @Json(name = "submitter_user") + @SerialName("submitter_user") val submitterUser: Submitter, val tags: List, ) diff --git a/model/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt b/model/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt index 1260d02a..a98ce55b 100644 --- a/model/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt +++ b/model/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt @@ -1,27 +1,27 @@ package dev.msfjarvis.lobsters.model -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -@JsonClass(generateAdapter = true) +@Serializable class Submitter( val username: String, - @Json(name = "created_at") + @SerialName("created_at") val createdAt: String, - @Json(name = "is_admin") + @SerialName("is_admin") val isAdmin: Boolean, val about: String, - @Json(name = "is_moderator") + @SerialName("is_moderator") val isModerator: Boolean, val karma: Long = 0, - @Json(name = "avatar_url") + @SerialName("avatar_url") val avatarUrl: String, - @Json(name = "invited_by_user") + @SerialName("invited_by_user") val invitedByUser: String, - @Json(name = "github_username") - val githubUsername: String?, - @Json(name = "twitter_username") - val twitterUsername: String?, - @Json(name = "keybase_signatures") - val keybaseSignatures: List? + @SerialName("github_username") + val githubUsername: String? = null, + @SerialName("twitter_username") + val twitterUsername: String? = null, + @SerialName("keybase_signatures") + val keybaseSignatures: List = emptyList() ) From c3e73256bf6654c4971c0957d1664dbbb67c75af Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sat, 7 Nov 2020 11:18:10 +0530 Subject: [PATCH 3/3] app: add R8 rules for kotlinx.serialization Signed-off-by: Harsh Shandilya --- app/proguard-rules.pro | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index e69de29b..f1e70065 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -0,0 +1,10 @@ +-keepattributes *Annotation*, InnerClasses +-dontnote kotlinx.serialization.AnnotationsKt # core serialization annotations + +-keep,includedescriptorclasses class dev.msfjarvis.lobsters.model.**$$serializer { *; } +-keepclassmembers class dev.msfjarvis.lobsters.model.** { + *** Companion; +} +-keepclasseswithmembers class dev.msfjarvis.lobsters.model.** { + kotlinx.serialization.KSerializer serializer(...); +}