Fix null pointer in google task sync

pull/1143/head
Alex Baker 5 years ago
parent 5da49d9ee1
commit 0cf3e4c413

@ -107,7 +107,7 @@ abstract class GoogleTaskDao {
abstract suspend fun getRemoteId(task: Long): String? abstract suspend fun getRemoteId(task: Long): String?
@Query("SELECT gt_task FROM google_tasks WHERE gt_remote_id = :remoteId") @Query("SELECT gt_task FROM google_tasks WHERE gt_remote_id = :remoteId")
abstract suspend fun getTask(remoteId: String): Long abstract suspend fun getTask(remoteId: String): Long?
@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH)
@Query("SELECT google_tasks.*, gt_order AS primary_sort, NULL AS secondary_sort FROM google_tasks JOIN tasks ON tasks._id = gt_task WHERE gt_parent = 0 AND gt_list_id = :listId AND tasks.deleted = 0 UNION SELECT c.*, p.gt_order AS primary_sort, c.gt_order AS secondary_sort FROM google_tasks AS c LEFT JOIN google_tasks AS p ON c.gt_parent = p.gt_task JOIN tasks ON tasks._id = c.gt_task WHERE c.gt_parent > 0 AND c.gt_list_id = :listId AND tasks.deleted = 0 ORDER BY primary_sort ASC, secondary_sort ASC") @Query("SELECT google_tasks.*, gt_order AS primary_sort, NULL AS secondary_sort FROM google_tasks JOIN tasks ON tasks._id = gt_task WHERE gt_parent = 0 AND gt_list_id = :listId AND tasks.deleted = 0 UNION SELECT c.*, p.gt_order AS primary_sort, c.gt_order AS secondary_sort FROM google_tasks AS c LEFT JOIN google_tasks AS p ON c.gt_parent = p.gt_task JOIN tasks ON tasks._id = c.gt_task WHERE c.gt_parent > 0 AND c.gt_list_id = :listId AND tasks.deleted = 0 ORDER BY primary_sort ASC, secondary_sort ASC")

@ -236,8 +236,7 @@ class GoogleTaskSynchronizer @Inject constructor(
// Update the metadata for the newly created task // Update the metadata for the newly created task
gtasksMetadata.remoteId = created.id gtasksMetadata.remoteId = created.id
gtasksMetadata.listId = listId gtasksMetadata.listId = listId
gtasksMetadata.remoteOrder = created.position.toLong() setOrderAndParent(gtasksMetadata, created)
gtasksMetadata.remoteParent = created.parent
} else { } else {
return return
} }
@ -251,10 +250,9 @@ class GoogleTaskSynchronizer @Inject constructor(
listId!!, listId!!,
if (isNullOrEmpty(localParent)) 0 else parent, if (isNullOrEmpty(localParent)) 0 else parent,
gtasksMetadata.order) gtasksMetadata.order)
val result = gtasksInvoker.moveGtask(listId, remoteModel.id, localParent, previous) gtasksInvoker
gtasksMetadata.remoteOrder = result!!.position.toLong() .moveGtask(listId, remoteModel.id, localParent, previous)
gtasksMetadata.remoteParent = result.parent ?.let { setOrderAndParent(gtasksMetadata, it) }
gtasksMetadata.parent = if (isNullOrEmpty(result.parent)) 0 else googleTaskDao.getTask(result.parent)
} catch (e: GoogleJsonResponseException) { } catch (e: GoogleJsonResponseException) {
if (e.statusCode == 400) { if (e.statusCode == 400) {
Timber.e(e) Timber.e(e)
@ -335,18 +333,13 @@ class GoogleTaskSynchronizer @Inject constructor(
continue continue
} }
} else { } else {
googleTask.remoteOrder = gtask.position.toLong() setOrderAndParent(googleTask, gtask)
googleTask.remoteParent = gtask.parent
googleTask.parent = gtask.parent
?.takeIf { it.isNotBlank() }
?.let { googleTaskDao.getTask(it) }
?: 0L
googleTask.remoteId = gtask.id googleTask.remoteId = gtask.id
} }
if (task == null) { if (task == null) {
task = taskCreator.createWithValues("") task = taskCreator.createWithValues("")
} }
task!!.title = getTruncatedValue(task.title, gtask.title, MAX_TITLE_LENGTH) task.title = getTruncatedValue(task.title, gtask.title, MAX_TITLE_LENGTH)
task.creationDate = DateUtilities.now() task.creationDate = DateUtilities.now()
task.completionDate = GtasksApiUtilities.gtasksCompletedTimeToUnixTime(gtask.completed?.let(::DateTime)) task.completionDate = GtasksApiUtilities.gtasksCompletedTimeToUnixTime(gtask.completed?.let(::DateTime))
val dueDate = GtasksApiUtilities.gtasksDueTimeToUnixTime(gtask.due?.let(::DateTime)) val dueDate = GtasksApiUtilities.gtasksDueTimeToUnixTime(gtask.due?.let(::DateTime))
@ -360,6 +353,12 @@ class GoogleTaskSynchronizer @Inject constructor(
googleTaskListDao.insertOrReplace(list) googleTaskListDao.insertOrReplace(list)
} }
private suspend fun setOrderAndParent(googleTask: GoogleTask, task: Task) {
task.position?.toLongOrNull()?.let { googleTask.remoteOrder = it }
googleTask.remoteParent = task.parent?.takeIf { it.isNotBlank() }
googleTask.parent = googleTask.remoteParent?.let { googleTaskDao.getTask(it) } ?: 0L
}
private suspend fun write(task: com.todoroo.astrid.data.Task?, googleTask: GoogleTask) { private suspend fun write(task: com.todoroo.astrid.data.Task?, googleTask: GoogleTask) {
if (!(isNullOrEmpty(task!!.title) && isNullOrEmpty(task.notes))) { if (!(isNullOrEmpty(task!!.title) && isNullOrEmpty(task.notes))) {
task.suppressSync() task.suppressSync()

Loading…
Cancel
Save