Fix backup import crashes

pull/2906/head
Alex Baker 3 weeks ago
parent 1a93c87ad9
commit 5ec02011f8

@ -42,15 +42,14 @@ class BackupContainer(
@Serializable
class TaskBackup(
val task: Task,
val alarms: List<Alarm>,
val alarms: List<Alarm>?,
val geofences: List<Geofence>?,
val tags: List<Tag>,
val comments: List<UserActivity>,
val tags: List<Tag>?,
val comments: List<UserActivity>?,
val attachments: List<Attachment>?,
val caldavTasks: List<CaldavTask>?,
val vtodo: String? = null,
val google: List<GoogleTask> = emptyList(),
) {
val locations: List<LegacyLocation> = emptyList()
}
val vtodo: String?,
val google: List<GoogleTask>? = null,
val locations: List<LegacyLocation>? = null,
)
}

@ -92,7 +92,7 @@ class TasksJsonImporter @Inject constructor(
try {
val data = input.jsonObject["data"]!!
val version = input.jsonObject["version"]!!.jsonPrimitive.int
val backupContainer = Json.decodeFromJsonElement<BackupContainer>(data)
val backupContainer = json.decodeFromJsonElement<BackupContainer>(data)
backupContainer.tags?.forEach { tagData ->
findTagData(tagData)?.let {
return@forEach
@ -203,7 +203,7 @@ class TasksJsonImporter @Inject constructor(
taskDao.createNew(task)
val taskId = task.id
val taskUuid = task.uuid
alarmDao.insert(backup.alarms.map { it.copy(task = taskId) })
backup.alarms?.map { it.copy(task = taskId) }?.let { alarmDao.insert(it) }
if (version < V12_4) {
task.defaultReminders(task.ringFlags)
alarmDao.insert(task.getDefaultAlarms())
@ -218,14 +218,14 @@ class TasksJsonImporter @Inject constructor(
task.repeatFrom = task.recurrence.repeatFrom()
task.recurrence = task.recurrence.withoutFrom()
}
for (comment in backup.comments) {
backup.comments?.forEach { comment ->
comment.targetId = taskUuid
if (version < V6_4) {
comment.convertPictureUri()
}
userActivityDao.createNew(comment)
}
for (googleTask in backup.google) {
backup.google?.forEach { googleTask ->
caldavDao.insert(
CaldavTask(
task = taskId,
@ -237,7 +237,7 @@ class TasksJsonImporter @Inject constructor(
)
)
}
for (location in backup.locations) {
backup.locations?.forEach { location ->
val place = Place(
longitude = location.longitude,
latitude = location.latitude,
@ -256,8 +256,8 @@ class TasksJsonImporter @Inject constructor(
)
)
}
for (tag in backup.tags) {
val tagData = findTagData(tag) ?: continue
backup.tags?.forEach tags@ { tag ->
val tagData = findTagData(tag) ?: return@tags
tagDao.insert(
tag.copy(
task = taskId,
@ -349,6 +349,7 @@ class TasksJsonImporter @Inject constructor(
var skipCount = 0
}
@Deprecated("For backup use only")
@Serializable
class LegacyLocation {
var name: String? = null
@ -363,6 +364,7 @@ class TasksJsonImporter @Inject constructor(
}
companion object {
private val json = Json { ignoreUnknownKeys = true}
private val ignorePrefs = intArrayOf(
R.string.p_current_version,
R.string.p_backups_android_backup_last

@ -4,6 +4,7 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.PrimaryKey
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import org.tasks.data.UUIDHelper
@ -35,6 +36,7 @@ data class CaldavTask(
@ColumnInfo(name = "cd_remote_id")
var remoteId: String? = UUIDHelper.newUUID(),
@ColumnInfo(name = "cd_object")
@SerialName("object")
var obj: String? = remoteId?.let { "$it.ics" },
@ColumnInfo(name = "cd_etag")
var etag: String? = null,

Loading…
Cancel
Save