Fix backup import crashes

pull/2906/head
Alex Baker 4 months ago
parent 1a93c87ad9
commit 5ec02011f8

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

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

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

Loading…
Cancel
Save