Skip to content

Commit

Permalink
refactor: replace Gson to kotlin serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
JunioJsv committed Mar 24, 2024
1 parent 76cdb57 commit bb870fa
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 21 deletions.
7 changes: 4 additions & 3 deletions app/build.gradle.kts
@@ -1,6 +1,7 @@
plugins {
id("com.android.application")
id("kotlin-android")
kotlin("android")
kotlin("plugin.serialization") version "1.8.0"
}

repositories {
Expand All @@ -17,7 +18,7 @@ android {
minSdk = 21
targetSdk = 33
compileSdk = 33
versionCode = 140
versionCode = 141
versionName = "1.6.0"
setProperty("archivesBaseName", "$applicationId-v$versionName")
}
Expand All @@ -44,5 +45,5 @@ dependencies {
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
implementation("androidx.recyclerview:recyclerview:1.3.2")
implementation("androidx.preference:preference-ktx:1.2.1")
implementation("com.google.code.gson:gson:2.10.1")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
}
Expand Up @@ -12,12 +12,12 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.Gson
import juniojsv.minimum.BuildConfig
import juniojsv.minimum.databinding.ApplicationGridVariantBinding
import juniojsv.minimum.databinding.ApplicationListVariantBinding
import juniojsv.minimum.models.Application
import juniojsv.minimum.models.ApplicationsGroup
import juniojsv.minimum.utils.UUIDSerializer
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
Expand All @@ -28,12 +28,20 @@ import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import java.util.UUID
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.resume

private data class ApplicationState(val isPinned: Boolean, val group: UUID?)
@Serializable
private data class ApplicationState(
val isPinned: Boolean,
@Serializable(with = UUIDSerializer::class) val group: UUID?
)

@Serializable
private data class ApplicationsAdapterState(
val groups: List<ApplicationsGroup>,
val applications: Map<String, ApplicationState>
Expand All @@ -48,7 +56,6 @@ class ApplicationsAdapter(
ApplicationsEventsBroadcastReceiver.Callbacks, DefaultLifecycleObserver, CoroutineScope {
private val events = ApplicationsEventsBroadcastReceiver(lifecycle, this)
val controller = ApplicationsAdapterController(this)
private val gson = Gson()
private val lastPersistedState = async {
suspendCancellableCoroutine {
try {
Expand All @@ -57,7 +64,7 @@ class ApplicationsAdapter(
val json = reader.readText()
reader.close()
file.close()
it.resume(gson.fromJson(json, ApplicationsAdapterState::class.java))
it.resume(Json.decodeFromString<ApplicationsAdapterState>(json))
} catch (e: Throwable) {
it.resume(null)
}
Expand Down Expand Up @@ -95,7 +102,7 @@ class ApplicationsAdapter(
}
)
val file = context.openFileOutput(STATE_FILE_NAME, Context.MODE_PRIVATE)
file.write(gson.toJson(state).toByteArray())
file.write(Json.encodeToString(state).toByteArray())
file.close()
}
}
Expand Down
7 changes: 3 additions & 4 deletions app/src/main/java/juniojsv/minimum/models/Application.kt
@@ -1,17 +1,16 @@
package juniojsv.minimum.models

import android.content.Intent
import com.google.gson.annotations.SerializedName
import java.util.UUID

data class Application(
@SerializedName("application_label") override val label: String,
override val label: String,
val packageName: String,
val launchIntent: Intent,
val isNew: Boolean = false,
val isPinned: Boolean = false,
val group: UUID? = null,
@SerializedName("application_id") override val id: UUID = UUID.randomUUID()
) : ApplicationBase(label, id) {
override val id: UUID = UUID.randomUUID()
) : ApplicationBase() {
override val priority: Int = if (isPinned) 1 else 0
}
8 changes: 4 additions & 4 deletions app/src/main/java/juniojsv/minimum/models/ApplicationBase.kt
Expand Up @@ -2,11 +2,11 @@ package juniojsv.minimum.models

import java.util.UUID

sealed class ApplicationBase(
open val label: String,
open val id: UUID
) :
sealed class ApplicationBase :
Comparable<ApplicationBase> {
abstract val label: String
abstract val id: UUID

/**
* Sorting priority
*/
Expand Down
12 changes: 7 additions & 5 deletions app/src/main/java/juniojsv/minimum/models/ApplicationsGroup.kt
@@ -1,16 +1,18 @@
package juniojsv.minimum.models

import com.google.gson.annotations.SerializedName
import juniojsv.minimum.utils.UUIDSerializer
import kotlinx.serialization.Serializable
import java.util.UUID

/**
* @param mergeWith is the id of target [ApplicationsGroup] to move all items of this group
*/
@Serializable
data class ApplicationsGroup(
@SerializedName("group_label") override val label: String,
@SerializedName("group_id") override val id: UUID = UUID.randomUUID(),
override val label: String,
@Serializable(with = UUIDSerializer::class) override val id: UUID = UUID.randomUUID(),
val isPinned: Boolean,
val mergeWith: UUID? = null
) : ApplicationBase(label, id) {
@Serializable(with = UUIDSerializer::class) val mergeWith: UUID? = null
) : ApplicationBase() {
override val priority: Int = if (isPinned) 1 else 0
}
20 changes: 20 additions & 0 deletions app/src/main/java/juniojsv/minimum/utils/UUIDSerializer.kt
@@ -0,0 +1,20 @@
package juniojsv.minimum.utils

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import java.util.UUID

object UUIDSerializer : KSerializer<UUID> {
override val descriptor = PrimitiveSerialDescriptor("UUID", PrimitiveKind.STRING)

override fun deserialize(decoder: Decoder): UUID {
return UUID.fromString(decoder.decodeString())
}

override fun serialize(encoder: Encoder, value: UUID) {
encoder.encodeString(value.toString())
}
}

0 comments on commit bb870fa

Please sign in to comment.