Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate from Gson to Kotlinx Serialization #178

Merged
merged 12 commits into from
May 26, 2023
Merged
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ dependencies {
// Extras
implementation (libs.app.compat)
implementation (libs.accompanist.navigation.animation)
implementation (libs.kotlinx.serialization.json)


// Material
Expand Down
30 changes: 0 additions & 30 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,6 @@
-dontwarn org.bouncycastle.**
-dontwarn org.openjsse.**

#Gson Rules
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**

# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

#Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}

-keepclassmembers,allowobfuscation class * {

@com.google.gson.annotations.SerializedName <fields>;

}

# Keep Domain data classes
-keep class com.my.kizzy.domain.model.** { <fields>; }

Expand All @@ -41,10 +16,5 @@
# slf4j error during build
-dontwarn org.slf4j.impl.StaticLoggerBinder

# Waiting for new retrofit release to remove these rules
-keep,allowobfuscation,allowshrinking interface retrofit2.Call
-keep,allowobfuscation,allowshrinking class retrofit2.Response
-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

# some unknown error
-dontwarn java.lang.invoke.StringConcatFactory
9 changes: 4 additions & 5 deletions app/src/main/java/com/my/kizzy/Kizzy.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import android.content.ComponentName
import androidx.activity.ComponentActivity
import androidx.activity.viewModels
import androidx.compose.animation.ExperimentalAnimationApi
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
Expand All @@ -28,7 +27,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import com.google.accompanist.navigation.animation.AnimatedNavHost
import com.google.accompanist.navigation.animation.rememberAnimatedNavController
import com.google.gson.Gson
import com.my.kizzy.data.utils.fromJson
import com.my.kizzy.domain.model.User
import com.my.kizzy.feature_about.about.About
Expand All @@ -44,9 +42,9 @@ import com.my.kizzy.feature_home.provideFeatures
import com.my.kizzy.feature_logs.LogScreen
import com.my.kizzy.feature_logs.LogsViewModel
import com.my.kizzy.feature_media_rpc.MediaRPC
import com.my.kizzy.feature_profile.ui.user.UserViewModel
import com.my.kizzy.feature_profile.ui.login.LoginScreen
import com.my.kizzy.feature_profile.ui.user.UserScreen
import com.my.kizzy.feature_profile.ui.user.UserViewModel
import com.my.kizzy.feature_rpc_base.AppUtils
import com.my.kizzy.feature_rpc_base.services.KizzyTileService
import com.my.kizzy.feature_settings.language.Language
Expand All @@ -57,9 +55,10 @@ import com.my.kizzy.feature_startup.StartUp
import com.my.kizzy.navigation.Routes
import com.my.kizzy.navigation.animatedComposable
import com.my.kizzy.preference.Prefs
import kotlinx.serialization.json.Json

@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@OptIn(ExperimentalAnimationApi::class, ExperimentalMaterial3Api::class)
@OptIn(ExperimentalAnimationApi::class)
@Composable
internal fun ComponentActivity.Kizzy() {
Scaffold()
Expand All @@ -86,7 +85,7 @@ internal fun ComponentActivity.Kizzy() {
})
}
animatedComposable(Routes.HOME) {
val user: User? = Gson().fromJson(Prefs[Prefs.USER_DATA, ""])
val user: User? = Json.fromJson(Prefs[Prefs.USER_DATA, ""])
val ctx = LocalContext.current
Home(
features = provideFeatures(
Expand Down
2 changes: 1 addition & 1 deletion common/preference/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ dependencies {
implementation(projects.common.resources)
implementation(libs.material3)
implementation(libs.mmkv)
implementation(libs.gson)
implementation(libs.kotlinx.coroutine)
implementation(libs.compose.ui)
implementation(libs.kotlinx.serialization.json)
}
17 changes: 6 additions & 11 deletions common/preference/src/main/java/com/my/kizzy/preference/Prefs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@

package com.my.kizzy.preference

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.tencent.mmkv.MMKV
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

object Prefs {
val kv = MMKV.defaultMMKV()
Expand Down Expand Up @@ -48,25 +49,19 @@ object Prefs {

fun isAppEnabled(packageName: String?): Boolean {
val apps = get(ENABLED_APPS, "[]")
val enabledPackages: ArrayList<String> = Gson().fromJson(
apps,
object : TypeToken<ArrayList<String>?>() {}.type
)
val enabledPackages: ArrayList<String> = Json.decodeFromString(apps)
return enabledPackages.contains(packageName)
}

fun saveToPrefs(pkg: String) {
val apps = get(ENABLED_APPS, "[]")
val enabledPackages: ArrayList<String> = Gson().fromJson(
apps,
object : TypeToken<ArrayList<String>?>() {}.type
)
val enabledPackages: ArrayList<String> = Json.decodeFromString(apps)
if (enabledPackages.contains(pkg))
enabledPackages.remove(pkg)
else
enabledPackages.add(pkg)

set(ENABLED_APPS, Gson().toJson(enabledPackages))
set(ENABLED_APPS, Json.encodeToString(enabledPackages))
}
//User Preferences
const val USER_DATA = "user" //Json Data Referencing User_Data class
Expand Down
24 changes: 12 additions & 12 deletions domain/src/main/java/com/my/kizzy/domain/model/User.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,29 +22,29 @@ data class User(
@SerialName("nitro")
val nitro: Boolean? = false,
@SerialName("accent_color")
val accentColor: Int?,
val accentColor: Int? = null,
@SerialName("avatar")
val avatar: String?,
val avatar: String? = null,
@SerialName("avatar_decoration")
val avatarDecoration: String?,
val avatarDecoration: String? = null,
@SerialName("badges")
val badges: List<Badge>?,
val badges: List<Badge>? = null,
@SerialName("banner")
val banner: String?,
val banner: String? = null,
@SerialName("banner_color")
val bannerColor: String?,
val bannerColor: String? = null,
@SerialName("discriminator")
val discriminator: String?,
val discriminator: String? = null,
@SerialName("id")
val id: String?,
val id: String? = null,
@SerialName("public_flags")
val publicFlags: Int?,
val publicFlags: Int? = null,
@SerialName("username")
val username: String?,
val username: String? = null,
@SerialName("special")
val special: String?,
val special: String? = null,
@SerialName("verified")
val verified: Boolean
val verified: Boolean = false
) {
fun getAvatarImage(): String {
return if (avatar?.startsWith("a_") == true)
Expand Down
2 changes: 1 addition & 1 deletion feature_console_rpc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ android {
dependencies {
implementation (projects.featureRpcBase)
implementation (libs.material.icons.extended)
implementation (libs.gson)
implementation (libs.glide)
implementation (libs.activity.compose)
implementation (libs.kotlinx.serialization.json)
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.google.gson.Gson
import com.my.kizzy.domain.model.Game
import com.my.kizzy.domain.model.RpcConfig
import com.my.kizzy.feature_rpc_base.services.AppDetectionService
Expand All @@ -50,6 +49,8 @@ import com.my.kizzy.ui.components.SwitchBar
import com.my.kizzy.ui.components.shimmer.AnimatedShimmer
import com.my.kizzy.ui.components.shimmer.ShimmerGamesScreen
import com.skydoves.landscapist.glide.GlideImage
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

@OptIn(ExperimentalMaterial3Api::class)
@Composable
Expand Down Expand Up @@ -187,7 +188,7 @@ fun GamesScreen(
selected = game.game_title == selected
) { info ->
selected = game.game_title
val string = Gson().toJson(
val string = Json.encodeToString(
RpcConfig(
name = info.platform,
details = info.game_title,
Expand Down
2 changes: 1 addition & 1 deletion feature_custom_rpc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@ android {
dependencies {
implementation (libs.material.icons.extended)
implementation(libs.accompanist.permission)
implementation(libs.gson)
implementation(libs.activity.compose)
implementation(libs.blankj.utilcodex)
implementation(libs.glide)
implementation(libs.kotlinx.serialization.json)
implementation(projects.featureRpcBase)
implementation(projects.featureProfile)
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.google.gson.Gson
import com.my.kizzy.data.rpc.Constants.MAX_ALLOWED_CHARACTER_LENGTH
import com.my.kizzy.domain.model.User
import com.my.kizzy.feature_custom_rpc.components.BottomSheet
Expand All @@ -52,6 +51,8 @@ import com.my.kizzy.ui.components.BackButton
import com.my.kizzy.ui.components.RpcField
import com.my.kizzy.ui.components.SwitchBar
import kotlinx.coroutines.launch
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import java.util.*

@Composable
Expand Down Expand Up @@ -113,7 +114,7 @@ fun CustomRPC(
}
if (state.showPreviewDialog) {
val json = Prefs[Prefs.USER_DATA, "{}"]
val user = Gson().fromJson(json, User::class.java)
val user = Json.decodeFromString<User>(json)
PreviewDialog(
user = user,
rpc = state.rpcConfig,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,16 @@ import android.net.Uri
import android.os.Build
import android.os.Environment
import com.blankj.utilcode.util.FileIOUtils
import com.google.gson.GsonBuilder
import com.my.kizzy.data.rpc.Constants
import com.my.kizzy.data.utils.getFileName
import com.my.kizzy.domain.model.RpcConfig
import com.my.kizzy.preference.Prefs
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import java.io.File
import java.io.FilenameFilter

internal val gson = GsonBuilder().setPrettyPrinting().serializeNulls().create()
internal val FILE_FILTER = FilenameFilter { _: File?, f: String ->
f.endsWith(".json")
}
Expand Down Expand Up @@ -61,18 +62,18 @@ internal fun Context.handleUriResult(uri: Uri?, onSuccess: (json: String) -> Uni
onSuccess(json)
}
}
internal val json = Json {
ignoreUnknownKeys = true
}

fun RpcConfig.dataToString(): String {
return gson.toJson(this)
internal fun RpcConfig.dataToString(): String {
return json.encodeToString(this)
}

fun String.stringToData(): RpcConfig {

internal fun String.stringToData(): RpcConfig {
return try {
var config = gson.fromJson(this, RpcConfig::class.java)
//Gson will set value of url as null if its not present in json
if (config.url == null)
config = config.copy(url = "")
return config
return json.decodeFromString(this)
} catch (ex: Exception) {
RpcConfig()
}
Expand Down
1 change: 0 additions & 1 deletion feature_home/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ android {
}

dependencies {
implementation (libs.gson)
implementation (libs.accompanist.flowLayout)
implementation (projects.featureRpcBase)
implementation (projects.featureSettings)
Expand Down
2 changes: 1 addition & 1 deletion feature_profile/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ dependencies {
implementation (projects.theme)
implementation (projects.gateway)
implementation (libs.glide)
implementation (libs.gson)
implementation(libs.activity.compose)
implementation(libs.kotlinx.serialization.json)
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@ import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.google.gson.Gson
import com.my.kizzy.domain.model.Resource
import com.my.kizzy.domain.model.User
import com.my.kizzy.domain.use_case.get_user.GetUserUseCase
import com.my.kizzy.preference.Prefs
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import javax.inject.Inject

@HiltViewModel
Expand All @@ -48,10 +50,10 @@ class UserViewModel @Inject constructor(
nitro = Prefs[Prefs.USER_NITRO]
)
)
Prefs[Prefs.USER_DATA] = Gson().toJson(result.data)
Prefs[Prefs.USER_DATA] = Json.encodeToString(result.data)
}
is Resource.Error -> {
val user = Gson().fromJson(Prefs[Prefs.USER_DATA,"{}"], User::class.java)
val user = Json.decodeFromString<User>(Prefs[Prefs.USER_DATA,"{}"])
_state.value = UserState.Error(
error = result.message ?: "An unexpected error occurred",
user = user
Expand Down
3 changes: 1 addition & 2 deletions feature_rpc_base/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ android {
}

dependencies {
implementation (libs.gson)
implementation (libs.blankj.utilcodex)
implementation(libs.androidx.material)

implementation(libs.kotlinx.serialization.json)
}