From 730c82a037f24038356e61ab215933da272d6944 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 8 Oct 2020 15:52:43 -0500 Subject: [PATCH] Add UpdateCalendarWork --- .../java/com/todoroo/astrid/dao/TaskDao.kt | 6 ++- .../com/todoroo/astrid/gcal/GCalHelper.kt | 15 +++++-- .../calendars/CalendarEventProvider.java | 3 ++ .../java/org/tasks/dialogs/DateTimePicker.kt | 7 ++-- .../main/java/org/tasks/jobs/AfterSaveWork.kt | 40 ++++-------------- .../java/org/tasks/jobs/UpdateCalendarWork.kt | 41 +++++++++++++++++++ .../main/java/org/tasks/jobs/WorkManager.kt | 4 +- .../java/org/tasks/jobs/WorkManagerImpl.kt | 10 ++++- .../java/org/tasks/ui/TaskEditViewModel.kt | 11 +---- 9 files changed, 84 insertions(+), 53 deletions(-) create mode 100644 app/src/main/java/org/tasks/jobs/UpdateCalendarWork.kt diff --git a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt index 97c3dc4dc..3eb4a5c08 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt @@ -89,8 +89,10 @@ class TaskDao @Inject constructor( val deletionDateModified = task.deletionDate != original?.deletionDate ?: 0 val justCompleted = completionDateModified && task.isCompleted val justDeleted = deletionDateModified && task.isDeleted - if (justCompleted && (task.isRecurring || !task.calendarURI.isNullOrBlank())) { - workManager.afterComplete(task) + if (justCompleted && task.isRecurring) { + workManager.scheduleRepeat(task) + } else if (!task.calendarURI.isNullOrBlank()) { + workManager.updateCalendar(task) } coroutineScope { launch(Dispatchers.Default) { diff --git a/app/src/main/java/com/todoroo/astrid/gcal/GCalHelper.kt b/app/src/main/java/com/todoroo/astrid/gcal/GCalHelper.kt index af0dd461c..a0cb1f0ec 100644 --- a/app/src/main/java/com/todoroo/astrid/gcal/GCalHelper.kt +++ b/app/src/main/java/com/todoroo/astrid/gcal/GCalHelper.kt @@ -25,7 +25,7 @@ import java.util.* import javax.inject.Inject class GCalHelper @Inject constructor( - @ApplicationContext context: Context, + @ApplicationContext private val context: Context, private val taskDao: TaskDao, private val preferences: Preferences, private val permissionChecker: PermissionChecker, @@ -94,11 +94,18 @@ class GCalHelper @Inject constructor( return null } - fun updateEvent(uri: String?, task: Task) { + fun updateEvent(task: Task) { + val uri = task.calendarURI ?: return + if (!permissionChecker.canAccessCalendars()) { + return + } try { val updateValues = ContentValues() - // check if we need to update the item - updateValues.put(CalendarContract.Events.TITLE, task.title) + updateValues.put(CalendarContract.Events.TITLE, if (task.isCompleted) { + context.getString(R.string.gcal_completed_title, task.title) + } else { + task.title + }) updateValues.put(CalendarContract.Events.DESCRIPTION, task.notes) createStartAndEndDate(task, updateValues) cr.update(Uri.parse(uri), updateValues, null, null) diff --git a/app/src/main/java/org/tasks/calendars/CalendarEventProvider.java b/app/src/main/java/org/tasks/calendars/CalendarEventProvider.java index 485376899..099e39065 100644 --- a/app/src/main/java/org/tasks/calendars/CalendarEventProvider.java +++ b/app/src/main/java/org/tasks/calendars/CalendarEventProvider.java @@ -65,6 +65,9 @@ public class CalendarEventProvider { } public void deleteEvent(Task task) { + if (!permissionChecker.canAccessCalendars()) { + return; + } String uri = task.getCalendarURI(); task.setCalendarURI(""); deleteEvent(uri); diff --git a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt index 3af5cf638..35a3cd4c3 100644 --- a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt +++ b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt @@ -243,9 +243,10 @@ class DateTimePicker : BottomSheetDialogFragment() { if (dueDate != arguments?.getLong(EXTRA_TIMESTAMP)) { if (taskId > 0) { lifecycleScope.launch(NonCancellable) { - val task: Task = taskDao.fetch(taskId)!! - task.setDueDateAdjustingHideUntil(dueDate) - taskDao.save(task) + taskDao.fetch(taskId)?.let { + it.setDueDateAdjustingHideUntil(dueDate) + taskDao.save(it) + } } } else { val intent = Intent() diff --git a/app/src/main/java/org/tasks/jobs/AfterSaveWork.kt b/app/src/main/java/org/tasks/jobs/AfterSaveWork.kt index 29d477172..1a52978e5 100644 --- a/app/src/main/java/org/tasks/jobs/AfterSaveWork.kt +++ b/app/src/main/java/org/tasks/jobs/AfterSaveWork.kt @@ -1,21 +1,15 @@ package org.tasks.jobs -import android.content.ContentValues import android.content.Context -import android.net.Uri -import android.provider.CalendarContract import androidx.hilt.Assisted import androidx.hilt.work.WorkerInject import androidx.work.WorkerParameters -import com.todoroo.astrid.data.Task +import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.repeats.RepeatTaskHelper -import org.tasks.R -import org.tasks.Strings.isNullOrEmpty import org.tasks.analytics.Firebase import org.tasks.data.CaldavDao import org.tasks.data.TaskDao import org.tasks.injection.BaseWorker -import timber.log.Timber class AfterSaveWork @WorkerInject constructor( @Assisted context: Context, @@ -23,42 +17,22 @@ class AfterSaveWork @WorkerInject constructor( firebase: Firebase, private val repeatTaskHelper: RepeatTaskHelper, private val taskDao: TaskDao, - private val caldavDao: CaldavDao + private val caldavDao: CaldavDao, + private val gCalHelper: GCalHelper ) : BaseWorker(context, workerParams, firebase) { override suspend fun run(): Result { val taskId = inputData.getLong(EXTRA_ID, -1) - val task = taskDao.fetch(taskId) - if (task == null) { - Timber.e("Missing saved task") - return Result.failure() - } + val task = taskDao.fetch(taskId) ?: return Result.failure() + + gCalHelper.updateEvent(task) - updateCalendarTitle(task) - val account = caldavDao.getAccountForTask(taskId) - if (account == null || !account.isSuppressRepeatingTasks) { + if (caldavDao.getAccountForTask(taskId)?.isSuppressRepeatingTasks != true) { repeatTaskHelper.handleRepeat(task) } return Result.success() } - private fun updateCalendarTitle(task: Task) { - val calendarUri = task.calendarURI - if (!isNullOrEmpty(calendarUri)) { - try { - // change title of calendar event - val cr = context.contentResolver - val values = ContentValues() - values.put( - CalendarContract.Events.TITLE, - context.getString(R.string.gcal_completed_title, task.title)) - cr.update(Uri.parse(calendarUri), values, null, null) - } catch (e: Exception) { - Timber.e(e) - } - } - } - companion object { const val EXTRA_ID = "extra_id" } diff --git a/app/src/main/java/org/tasks/jobs/UpdateCalendarWork.kt b/app/src/main/java/org/tasks/jobs/UpdateCalendarWork.kt new file mode 100644 index 000000000..9ee2071d9 --- /dev/null +++ b/app/src/main/java/org/tasks/jobs/UpdateCalendarWork.kt @@ -0,0 +1,41 @@ +package org.tasks.jobs + +import android.content.Context +import androidx.hilt.Assisted +import androidx.hilt.work.WorkerInject +import androidx.work.WorkerParameters +import com.todoroo.astrid.gcal.GCalHelper +import org.tasks.analytics.Firebase +import org.tasks.calendars.CalendarEventProvider +import org.tasks.data.TaskDao +import org.tasks.injection.BaseWorker +import org.tasks.preferences.PermissionChecker + +class UpdateCalendarWork @WorkerInject constructor( + @Assisted context: Context, + @Assisted workerParams: WorkerParameters, + firebase: Firebase, + private val taskDao: TaskDao, + private val gCalHelper: GCalHelper, + private val calendarEventProvider: CalendarEventProvider, + private val permissionChecker: PermissionChecker +) : BaseWorker(context, workerParams, firebase) { + + override suspend fun run(): Result { + if (!permissionChecker.canAccessCalendars()) { + return Result.failure() + } + val taskId = inputData.getLong(EXTRA_ID, -1) + val task = taskDao.fetch(taskId) ?: return Result.failure() + if (task.hasDueDate()) { + gCalHelper.updateEvent(task) + } else { + calendarEventProvider.deleteEvent(task) + } + return Result.success() + } + + companion object { + const val EXTRA_ID = "extra_id" + } +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/jobs/WorkManager.kt b/app/src/main/java/org/tasks/jobs/WorkManager.kt index 52d7e003f..afec321e2 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManager.kt +++ b/app/src/main/java/org/tasks/jobs/WorkManager.kt @@ -7,7 +7,9 @@ import org.tasks.data.Place interface WorkManager { - fun afterComplete(task: Task) + fun scheduleRepeat(task: Task) + + fun updateCalendar(task: Task) fun cleanup(ids: Iterable) diff --git a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt index c74b62b3b..2e0e2d1e1 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt +++ b/app/src/main/java/org/tasks/jobs/WorkManagerImpl.kt @@ -55,7 +55,7 @@ class WorkManagerImpl constructor( private val alarmManager: AlarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager private val workManager = androidx.work.WorkManager.getInstance(context) - override fun afterComplete(task: Task) { + override fun scheduleRepeat(task: Task) { enqueue( OneTimeWorkRequest.Builder(AfterSaveWork::class.java) .setInputData(Data.Builder() @@ -63,6 +63,14 @@ class WorkManagerImpl constructor( .build())) } + override fun updateCalendar(task: Task) { + enqueue( + OneTimeWorkRequest.Builder(UpdateCalendarWork::class.java) + .setInputData(Data.Builder() + .putLong(UpdateCalendarWork.EXTRA_ID, task.id) + .build())) + } + override fun cleanup(ids: Iterable) { ids.chunked(MAX_CLEANUP_LENGTH) { enqueue( diff --git a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt index 8a2f9fbf6..5bd0fde64 100644 --- a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt @@ -380,19 +380,12 @@ class TaskEditViewModel @ViewModelInject constructor( if (!permissionChecker.canAccessCalendars()) { return } - if (eventUri == null || task?.hasDueDate() != true) { - if (!task?.calendarURI.isNullOrBlank()) { - calendarEventProvider.deleteEvent(task) - } + if (eventUri == null) { + calendarEventProvider.deleteEvent(task) } if (task?.hasDueDate() != true) { return } - eventUri?.let { - if (!it.isBlank()) { - gCalHelper.updateEvent(it, task!!) - } - } selectedCalendar?.let { try { task?.calendarURI = gCalHelper.createTaskEvent(task!!, it)?.toString()