diff --git a/.gitignore b/.gitignore
index 8c470b3..c216f78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -67,3 +67,6 @@ fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
+
+# kotlin
+.kotlin/
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index f8467b4..d4b7acc 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 2d17775..38f3438 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,6 +2,7 @@ plugins {
id 'com.android.application'
id 'kotlin-android'
id 'com.google.devtools.ksp'
+ id 'org.jetbrains.kotlin.plugin.serialization'
}
android {
@@ -51,11 +52,12 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'androidx.activity:activity-ktx:1.9.2'
- implementation 'androidx.fragment:fragment-ktx:1.8.3'
+ implementation 'androidx.fragment:fragment-ktx:1.8.4'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.guava:guava:33.1.0-android'
- implementation 'com.google.code.gson:gson:2.11.0'
+ implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3'
+
def shizuku_version = '13.1.5'
implementation "dev.rikka.shizuku:api:$shizuku_version"
@@ -71,7 +73,7 @@ dependencies {
androidTestImplementation "androidx.room:room-testing:$roomVersion"
// Lifecycle components
- def lifecycleVersion = '2.8.5'
+ def lifecycleVersion = '2.8.6'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycleVersion"
diff --git a/app/src/main/java/ru/karasevm/privatednstoggle/model/DnsServer.kt b/app/src/main/java/ru/karasevm/privatednstoggle/model/DnsServer.kt
index 35375d1..38c1be4 100644
--- a/app/src/main/java/ru/karasevm/privatednstoggle/model/DnsServer.kt
+++ b/app/src/main/java/ru/karasevm/privatednstoggle/model/DnsServer.kt
@@ -3,19 +3,21 @@ package ru.karasevm.privatednstoggle.model
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
-import com.google.gson.annotations.SerializedName
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
// All fields must have default values for proper deserialization
+@Serializable
@Entity(tableName = "dns_servers")
data class DnsServer(
- @SerializedName("id")
+ @SerialName("id")
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
- @SerializedName("server")
+ @SerialName("server")
val server: String = "",
- @SerializedName("label")
+ @SerialName("label")
val label: String = "",
- @SerializedName("enabled")
+ @SerialName("enabled")
@ColumnInfo(defaultValue = "1")
val enabled: Boolean = true,
val sortOrder: Int? = null
diff --git a/app/src/main/java/ru/karasevm/privatednstoggle/ui/MainActivity.kt b/app/src/main/java/ru/karasevm/privatednstoggle/ui/MainActivity.kt
index 1ee354e..e029c25 100644
--- a/app/src/main/java/ru/karasevm/privatednstoggle/ui/MainActivity.kt
+++ b/app/src/main/java/ru/karasevm/privatednstoggle/ui/MainActivity.kt
@@ -27,12 +27,9 @@ import androidx.recyclerview.widget.ItemTouchHelper.DOWN
import androidx.recyclerview.widget.ItemTouchHelper.UP
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import com.google.gson.Gson
-import com.google.gson.GsonBuilder
-import com.google.gson.JsonSyntaxException
-import com.google.gson.ToNumberPolicy
-import com.google.gson.reflect.TypeToken
import kotlinx.coroutines.launch
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
import org.lsposed.hiddenapibypass.HiddenApiBypass
import rikka.shizuku.Shizuku
import rikka.shizuku.ShizukuBinderWrapper
@@ -58,7 +55,6 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
private lateinit var sharedPrefs: SharedPreferences
private lateinit var adapter: ServerListRecyclerAdapter
private lateinit var clipboard: ClipboardManager
- private lateinit var gson: Gson
private val dnsServerViewModel: DnsServerViewModel by viewModels { DnsServerViewModelFactory((application as PrivateDNSApp).repository) }
private val itemTouchHelper by lazy {
@@ -126,7 +122,7 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
private fun importSettings(json: String) {
runCatching {
- val data: BackupUtils.Backup = gson.fromJson(json, BackupUtils.Backup::class.java)
+ val data: BackupUtils.Backup = Json.decodeFromString(json)
BackupUtils.import(data, dnsServerViewModel, sharedPrefs)
}.onSuccess {
Toast.makeText(
@@ -134,28 +130,18 @@ class MainActivity : AppCompatActivity(), AddServerDialogFragment.NoticeDialogLi
).show()
}.onFailure { exception ->
runCatching {
- val objectType = object : TypeToken