Skip to content

Commit c2e28ff

Browse files
committed
#1362 fix: back up and restore trigger keys without crashing due to serializing abstract classes
1 parent a098c22 commit c2e28ff

File tree

3 files changed

+57
-40
lines changed

3 files changed

+57
-40
lines changed

app/src/main/java/io/github/sds100/keymapper/backup/BackupManager.kt

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,12 @@ class BackupManagerImpl(
113113
.registerTypeAdapter(FingerprintMapEntity.DESERIALIZER)
114114
.registerTypeAdapter(KeyMapEntity.DESERIALIZER)
115115
.registerTypeAdapter(TriggerEntity.DESERIALIZER)
116+
.registerTypeAdapter(TriggerKeyEntity.SERIALIZER)
116117
.registerTypeAdapter(TriggerKeyEntity.DESERIALIZER)
117118
.registerTypeAdapter(ActionEntity.DESERIALIZER)
118119
.registerTypeAdapter(Extra.DESERIALIZER)
119-
.registerTypeAdapter(ConstraintEntity.DESERIALIZER).create()
120+
.registerTypeAdapter(ConstraintEntity.DESERIALIZER)
121+
.create()
120122
}
121123

122124
private val backupAutomatically: Flow<Boolean> = preferenceRepository
@@ -426,7 +428,7 @@ class BackupManagerImpl(
426428
} catch (e: NoSuchElementException) {
427429
return Error.CorruptJsonFile(e.message ?: "")
428430
} catch (e: Exception) {
429-
e.printStackTrace()
431+
Timber.e(e)
430432

431433
if (throwExceptions) {
432434
throw e
@@ -448,45 +450,45 @@ class BackupManagerImpl(
448450
// delete the contents of the file
449451
output.clear()
450452

451-
val json = gson.toJson(
452-
BackupModel(
453-
AppDatabase.DATABASE_VERSION,
454-
Constants.VERSION_CODE,
455-
keyMapList,
456-
fingerprintMaps,
457-
defaultLongPressDelay =
458-
preferenceRepository
459-
.get(Keys.defaultLongPressDelay)
460-
.first()
461-
.takeIf { it != PreferenceDefaults.LONG_PRESS_DELAY },
462-
defaultDoublePressDelay =
463-
preferenceRepository
464-
.get(Keys.defaultDoublePressDelay)
465-
.first()
466-
.takeIf { it != PreferenceDefaults.DOUBLE_PRESS_DELAY },
467-
defaultRepeatDelay =
468-
preferenceRepository
469-
.get(Keys.defaultRepeatDelay)
470-
.first()
471-
.takeIf { it != PreferenceDefaults.REPEAT_DELAY },
472-
defaultRepeatRate =
473-
preferenceRepository
474-
.get(Keys.defaultRepeatRate)
475-
.first()
476-
.takeIf { it != PreferenceDefaults.REPEAT_RATE },
477-
defaultSequenceTriggerTimeout =
478-
preferenceRepository
479-
.get(Keys.defaultSequenceTriggerTimeout)
480-
.first()
481-
.takeIf { it != PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT },
482-
defaultVibrationDuration =
483-
preferenceRepository
484-
.get(Keys.defaultVibrateDuration)
485-
.first()
486-
.takeIf { it != PreferenceDefaults.VIBRATION_DURATION },
487-
),
453+
val backupModel = BackupModel(
454+
AppDatabase.DATABASE_VERSION,
455+
Constants.VERSION_CODE,
456+
keyMapList,
457+
fingerprintMaps,
458+
defaultLongPressDelay =
459+
preferenceRepository
460+
.get(Keys.defaultLongPressDelay)
461+
.first()
462+
.takeIf { it != PreferenceDefaults.LONG_PRESS_DELAY },
463+
defaultDoublePressDelay =
464+
preferenceRepository
465+
.get(Keys.defaultDoublePressDelay)
466+
.first()
467+
.takeIf { it != PreferenceDefaults.DOUBLE_PRESS_DELAY },
468+
defaultRepeatDelay =
469+
preferenceRepository
470+
.get(Keys.defaultRepeatDelay)
471+
.first()
472+
.takeIf { it != PreferenceDefaults.REPEAT_DELAY },
473+
defaultRepeatRate =
474+
preferenceRepository
475+
.get(Keys.defaultRepeatRate)
476+
.first()
477+
.takeIf { it != PreferenceDefaults.REPEAT_RATE },
478+
defaultSequenceTriggerTimeout =
479+
preferenceRepository
480+
.get(Keys.defaultSequenceTriggerTimeout)
481+
.first()
482+
.takeIf { it != PreferenceDefaults.SEQUENCE_TRIGGER_TIMEOUT },
483+
defaultVibrationDuration =
484+
preferenceRepository
485+
.get(Keys.defaultVibrateDuration)
486+
.first()
487+
.takeIf { it != PreferenceDefaults.VIBRATION_DURATION },
488488
)
489489

490+
val json = gson.toJson(backupModel)
491+
490492
val backupUid = uuidGenerator.random()
491493

492494
tempBackupDir = fileAdapter.getPrivateFile("$TEMP_BACKUP_ROOT_DIR/$backupUid")
@@ -549,7 +551,7 @@ class BackupManagerImpl(
549551
val appVersion: Int,
550552

551553
@SerializedName(NAME_KEYMAP_LIST)
552-
val keymapList: List<KeyMapEntity>? = null,
554+
val keyMapList: List<KeyMapEntity>? = null,
553555

554556
@SerializedName(NAME_FINGERPRINT_MAP_LIST)
555557
val fingerprintMapList: List<FingerprintMapEntity>?,

app/src/main/java/io/github/sds100/keymapper/data/db/typeconverter/TriggerTypeConverter.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class TriggerTypeConverter {
1818
fun toTrigger(json: String): TriggerEntity {
1919
val gson = GsonBuilder()
2020
.registerTypeAdapter(TriggerEntity.DESERIALIZER)
21+
.registerTypeAdapter(TriggerKeyEntity.SERIALIZER)
2122
.registerTypeAdapter(TriggerKeyEntity.DESERIALIZER)
2223
.registerTypeAdapter(Extra.DESERIALIZER).create()
2324

app/src/main/java/io/github/sds100/keymapper/data/entities/TriggerKeyEntity.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import com.github.salomonbrys.kotson.byNullableInt
66
import com.github.salomonbrys.kotson.byNullableString
77
import com.github.salomonbrys.kotson.byString
88
import com.github.salomonbrys.kotson.jsonDeserializer
9+
import com.github.salomonbrys.kotson.jsonSerializer
910
import com.github.salomonbrys.kotson.obj
11+
import com.google.gson.Gson
1012
import com.google.gson.JsonDeserializer
1113
import com.google.gson.JsonElement
14+
import com.google.gson.JsonSerializer
1215
import java.util.UUID
1316

1417
sealed class TriggerKeyEntity : Parcelable {
@@ -26,6 +29,17 @@ sealed class TriggerKeyEntity : Parcelable {
2629
const val LONG_PRESS = 1
2730
const val DOUBLE_PRESS = 2
2831

32+
/**
33+
* This is required because they are subclasses and Gson doesn't know about their
34+
* fields otherwise.
35+
*/
36+
val SERIALIZER: JsonSerializer<TriggerKeyEntity> = jsonSerializer { (key) ->
37+
when (key) {
38+
is AssistantTriggerKeyEntity -> Gson().toJsonTree(key)
39+
is KeyCodeTriggerKeyEntity -> Gson().toJsonTree(key)
40+
}
41+
}
42+
2943
val DESERIALIZER: JsonDeserializer<TriggerKeyEntity> =
3044
jsonDeserializer { (json, _, _) ->
3145
// nullable because this property was added after backup and restore was released.

0 commit comments

Comments
 (0)