Skip to content

Commit 4e8dff1

Browse files
committed
Fix exporting json data in case of name modified by R8
1 parent d019b91 commit 4e8dff1

File tree

3 files changed

+51
-13
lines changed

3 files changed

+51
-13
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
android:name=".LinkApplication"
1313
android:allowBackup="false"
1414
android:icon="@mipmap/ic_launcher"
15+
android:enableOnBackInvokedCallback="true"
1516
android:label="@string/app_name"
1617
android:requestLegacyExternalStorage="true"
1718
android:roundIcon="@mipmap/ic_launcher_round"

app/src/main/java/com/amrdeveloper/linkhub/data/DataPackage.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ import com.google.gson.annotations.SerializedName
77
data class DataPackage(
88

99
@SerializedName("folders")
10-
val folders: List<Folder>,
10+
var folders: List<Folder>? = listOf(),
1111

1212
@SerializedName("links")
13-
val links: List<Link>,
13+
var links: List<Link>?= listOf(),
1414

1515
@SerializedName("showClickCounter")
16-
val showClickCounter: Boolean?,
16+
var showClickCounter: Boolean? = true,
1717

1818
@SerializedName("autoSaving")
19-
val enableAutoSaving: Boolean?,
19+
var enableAutoSaving: Boolean? = false,
2020

2121
@SerializedName("defaultFolderMode")
22-
val defaultFolderMode: Boolean?,
22+
var defaultFolderMode: Boolean? = true,
2323

2424
@SerializedName("theme")
25-
val theme: Theme?
25+
var theme: Theme? = Theme.WHITE
2626
)

app/src/main/java/com/amrdeveloper/linkhub/data/parser/JsonImportExportFileParser.kt

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.amrdeveloper.linkhub.data.parser
22

33
import com.amrdeveloper.linkhub.data.DataPackage
4+
import com.amrdeveloper.linkhub.data.Folder
45
import com.amrdeveloper.linkhub.data.FolderColor
56
import com.amrdeveloper.linkhub.data.ImportExportFileType
7+
import com.amrdeveloper.linkhub.data.Link
8+
import com.amrdeveloper.linkhub.data.Theme
69
import com.amrdeveloper.linkhub.data.source.FolderRepository
710
import com.amrdeveloper.linkhub.data.source.LinkRepository
811
import com.amrdeveloper.linkhub.util.UiPreferences
912
import com.google.gson.Gson
13+
import com.google.gson.JsonParser
1014
import com.google.gson.JsonSyntaxException
1115

1216
class JsonImportExportFileParser : ImportExportFileParser {
@@ -17,20 +21,53 @@ class JsonImportExportFileParser : ImportExportFileParser {
1721
linkRepository: LinkRepository
1822
): Result<DataPackage?> {
1923
try {
20-
val dataPackage = Gson().fromJson(data, DataPackage::class.java)
24+
val jsonElement = JsonParser.parseString(data)
25+
if (!jsonElement.isJsonObject) {
26+
return Result.success(null)
27+
}
28+
29+
val jsonObject = jsonElement.asJsonObject
30+
val jsonObjectKeys = jsonObject.keySet()
31+
32+
// TODO: Replace with reflection later
33+
val validKeysSet = setOf("folders", "links", "showClickCounter", "autoSaving", "defaultFolderMode", "theme")
34+
if (jsonObjectKeys.size != validKeysSet.size) {
35+
return Result.success(null)
36+
}
37+
38+
val gson = Gson()
39+
var dataPackage = DataPackage()
40+
41+
if (jsonObjectKeys == validKeysSet) {
42+
dataPackage = gson.fromJson(data, DataPackage::class.java)
43+
} else {
44+
val keysAsList = jsonObjectKeys.toList()
45+
jsonObject.getAsJsonArray(keysAsList[0])?.let { jsonLinks ->
46+
dataPackage.folders = gson.fromJson(jsonLinks, Array<Folder>::class.java).toList()
47+
}
48+
49+
jsonObject.getAsJsonArray(keysAsList[1])?.let { jsonLinks ->
50+
dataPackage.links = gson.fromJson(jsonLinks, Array<Link>::class.java).toList()
51+
}
52+
53+
dataPackage.showClickCounter = jsonObject[keysAsList[2]].asBoolean
54+
dataPackage.enableAutoSaving = jsonObject[keysAsList[3]].asBoolean
55+
dataPackage.defaultFolderMode = jsonObject[keysAsList[4]].asBoolean
56+
57+
jsonObject[keysAsList[5]]?.asString?.let { jsonTheme ->
58+
dataPackage.theme = Theme.entries.firstOrNull { it.name.equals(jsonTheme, ignoreCase = true) }
59+
}
60+
}
2161

22-
val folders = dataPackage.folders
2362
// This code should be removed after found why it not serialized on some devices (see Issue #23)
2463
// folderColor field is declared as non nullable type but in this case GSON will break the null safety feature
25-
folders.forEach { if (it.folderColor == null) it.folderColor = FolderColor.BLUE }
26-
folderRepository.insertFolders(folders)
64+
dataPackage.folders?.forEach { if (it.folderColor == null) it.folderColor = FolderColor.BLUE }
2765

28-
linkRepository.insertLinks(dataPackage.links)
66+
dataPackage.folders?.let { folderRepository.insertFolders(it) }
67+
dataPackage.links?.let { linkRepository.insertLinks(it) }
2968
return Result.success(dataPackage)
3069
} catch (e: JsonSyntaxException) {
3170
return Result.failure(e)
32-
} catch (e: Exception) {
33-
return Result.failure(e)
3471
}
3572
}
3673

0 commit comments

Comments
 (0)