Create views in suspending function

pull/1047/head
Alex Baker 6 years ago
parent 2b6af062f6
commit 012663eebe

@ -5,8 +5,9 @@
*/ */
package com.todoroo.astrid.alarms package com.todoroo.astrid.alarms
import kotlinx.coroutines.runBlocking
import org.tasks.data.Alarm import org.tasks.data.Alarm
import org.tasks.data.AlarmDaoBlocking import org.tasks.data.AlarmDao
import org.tasks.jobs.AlarmEntry import org.tasks.jobs.AlarmEntry
import org.tasks.jobs.NotificationQueue import org.tasks.jobs.NotificationQueue
import java.util.* import java.util.*
@ -20,12 +21,13 @@ import javax.inject.Singleton
*/ */
@Singleton @Singleton
class AlarmService @Inject constructor( class AlarmService @Inject constructor(
private val alarmDao: AlarmDaoBlocking, private val alarmDao: AlarmDao,
private val jobs: NotificationQueue) { private val jobs: NotificationQueue) {
fun rescheduleAlarms(taskId: Long, oldDueDate: Long, newDueDate: Long) { // TODO: remove runBlocking
fun rescheduleAlarms(taskId: Long, oldDueDate: Long, newDueDate: Long) = runBlocking {
if (newDueDate <= 0 || newDueDate <= oldDueDate) { if (newDueDate <= 0 || newDueDate <= oldDueDate) {
return return@runBlocking
} }
val alarms: MutableSet<Long> = LinkedHashSet() val alarms: MutableSet<Long> = LinkedHashSet()
for (alarm in getAlarms(taskId)) { for (alarm in getAlarms(taskId)) {
@ -36,7 +38,7 @@ class AlarmService @Inject constructor(
} }
} }
fun getAlarms(taskId: Long): List<Alarm> { suspend fun getAlarms(taskId: Long): List<Alarm> {
return alarmDao.getAlarms(taskId) return alarmDao.getAlarms(taskId)
} }
@ -45,7 +47,7 @@ class AlarmService @Inject constructor(
* *
* @return true if data was changed * @return true if data was changed
*/ */
fun synchronizeAlarms(taskId: Long, timestamps: MutableSet<Long>): Boolean { suspend fun synchronizeAlarms(taskId: Long, timestamps: MutableSet<Long>): Boolean {
var changed = false var changed = false
for (item in alarmDao.getAlarms(taskId)) { for (item in alarmDao.getAlarms(taskId)) {
if (!timestamps.remove(item.time)) { if (!timestamps.remove(item.time)) {
@ -64,25 +66,25 @@ class AlarmService @Inject constructor(
return changed return changed
} }
private fun getActiveAlarmsForTask(taskId: Long): List<Alarm> { private suspend fun getActiveAlarmsForTask(taskId: Long): List<Alarm> {
return alarmDao.getActiveAlarms(taskId) return alarmDao.getActiveAlarms(taskId)
} }
/** Schedules all alarms */ // TODO: remove runBlocking
fun scheduleAllAlarms() { fun scheduleAllAlarms() = runBlocking {
for (alarm in alarmDao.getActiveAlarms()) { for (alarm in alarmDao.getActiveAlarms()) {
scheduleAlarm(alarm) scheduleAlarm(alarm)
} }
} }
fun cancelAlarms(taskId: Long) { suspend fun cancelAlarms(taskId: Long) {
for (alarm in getActiveAlarmsForTask(taskId)) { for (alarm in getActiveAlarmsForTask(taskId)) {
jobs.cancelAlarm(alarm.id) jobs.cancelAlarm(alarm.id)
} }
} }
/** Schedules alarms for a single task */ /** Schedules alarms for a single task */
private fun scheduleAlarms(taskId: Long) { private suspend fun scheduleAlarms(taskId: Long) {
for (alarm in getActiveAlarmsForTask(taskId)) { for (alarm in getActiveAlarmsForTask(taskId)) {
scheduleAlarm(alarm) scheduleAlarm(alarm)
} }

@ -10,18 +10,20 @@ import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.lifecycle.lifecycleScope
import butterknife.BindView import butterknife.BindView
import butterknife.OnClick import butterknife.OnClick
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.tasks.R import org.tasks.R
import org.tasks.data.TaskAttachment import org.tasks.data.TaskAttachment
import org.tasks.data.TaskAttachmentDaoBlocking import org.tasks.data.TaskAttachmentDao
import org.tasks.dialogs.AddAttachmentDialog import org.tasks.dialogs.AddAttachmentDialog
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
import org.tasks.files.FileHelper import org.tasks.files.FileHelper
@ -33,7 +35,7 @@ import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class FilesControlSet : TaskEditControlFragment() { class FilesControlSet : TaskEditControlFragment() {
@Inject lateinit var activity: Activity @Inject lateinit var activity: Activity
@Inject lateinit var taskAttachmentDao: TaskAttachmentDaoBlocking @Inject lateinit var taskAttachmentDao: TaskAttachmentDao
@Inject lateinit var dialogBuilder: DialogBuilder @Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
@ -45,13 +47,8 @@ class FilesControlSet : TaskEditControlFragment() {
private var taskUuid: String? = null private var taskUuid: String? = null
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
taskUuid = task.uuid taskUuid = task.uuid
for (attachment in taskAttachmentDao.getAttachments(taskUuid!!)) {
addAttachment(attachment)
}
if (savedInstanceState == null) { if (savedInstanceState == null) {
if (task.hasTransitory(TaskAttachment.KEY)) { if (task.hasTransitory(TaskAttachment.KEY)) {
for (uri in (task.getTransitory<ArrayList<Uri>>(TaskAttachment.KEY))!!) { for (uri in (task.getTransitory<ArrayList<Uri>>(TaskAttachment.KEY))!!) {
@ -59,7 +56,10 @@ class FilesControlSet : TaskEditControlFragment() {
} }
} }
} }
return view
taskAttachmentDao
.getAttachments(task.uuid)
.forEach { addAttachment(it) }
} }
@OnClick(R.id.add_attachment) @OnClick(R.id.add_attachment)
@ -118,10 +118,14 @@ class FilesControlSet : TaskEditControlFragment() {
dialogBuilder dialogBuilder
.newDialog(R.string.premium_remove_file_confirm) .newDialog(R.string.premium_remove_file_confirm)
.setPositiveButton(android.R.string.ok) { _, _ -> .setPositiveButton(android.R.string.ok) { _, _ ->
lifecycleScope.launch {
withContext(NonCancellable) {
taskAttachmentDao.delete(taskAttachment) taskAttachmentDao.delete(taskAttachment)
FileHelper.delete(context, taskAttachment.parseUri()) FileHelper.delete(context, taskAttachment.parseUri())
}
attachmentContainer.removeView(fileRow) attachmentContainer.removeView(fileRow)
} }
}
.setNegativeButton(android.R.string.cancel, null) .setNegativeButton(android.R.string.cancel, null)
.show() .show()
} }
@ -138,9 +142,11 @@ class FilesControlSet : TaskEditControlFragment() {
private fun newAttachment(output: Uri) { private fun newAttachment(output: Uri) {
val attachment = TaskAttachment(taskUuid!!, output, FileHelper.getFilename(context, output)!!) val attachment = TaskAttachment(taskUuid!!, output, FileHelper.getFilename(context, output)!!)
lifecycleScope.launch {
taskAttachmentDao.createNew(attachment) taskAttachmentDao.createNew(attachment)
addAttachment(attachment) addAttachment(attachment)
} }
}
companion object { companion object {
const val TAG = R.string.TEA_ctrl_files_pref const val TAG = R.string.TEA_ctrl_files_pref

@ -7,7 +7,6 @@ package com.todoroo.astrid.repeats
import android.app.Activity import android.app.Activity
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.AdapterView import android.widget.AdapterView
@ -87,9 +86,7 @@ class RepeatControlSet : TaskEditControlFragment() {
} }
} }
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
if (savedInstanceState == null) { if (savedInstanceState == null) {
repeatAfterCompletion = task.repeatAfterCompletion() repeatAfterCompletion = task.repeatAfterCompletion()
dueDate = task.dueDate dueDate = task.dueDate
@ -129,7 +126,7 @@ class RepeatControlSet : TaskEditControlFragment() {
if (parent is AdapterView<*>) { if (parent is AdapterView<*>) {
selectedItemPosition = parent.selectedItemPosition selectedItemPosition = parent.selectedItemPosition
} }
val tv = inflater.inflate(android.R.layout.simple_spinner_item, parent, false) as TextView val tv = activity.layoutInflater.inflate(android.R.layout.simple_spinner_item, parent, false) as TextView
tv.setPadding(0, 0, 0, 0) tv.setPadding(0, 0, 0, 0)
tv.text = repeatTypes[selectedItemPosition] tv.text = repeatTypes[selectedItemPosition]
return tv return tv
@ -141,7 +138,6 @@ class RepeatControlSet : TaskEditControlFragment() {
typeSpinner.adapter = typeAdapter typeSpinner.adapter = typeAdapter
typeSpinner.setSelection(if (repeatAfterCompletion) TYPE_COMPLETION_DATE else TYPE_DUE_DATE) typeSpinner.setSelection(if (repeatAfterCompletion) TYPE_COMPLETION_DATE else TYPE_DUE_DATE)
refreshDisplayView() refreshDisplayView()
return view
} }
@OnItemSelected(R.id.repeatType) @OnItemSelected(R.id.repeatType)

@ -8,9 +8,7 @@ package com.todoroo.astrid.tags
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import butterknife.BindView import butterknife.BindView
import com.google.android.material.chip.ChipGroup import com.google.android.material.chip.ChipGroup
@ -18,9 +16,9 @@ import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.tasks.R import org.tasks.R
import org.tasks.data.TagDaoBlocking import org.tasks.data.TagDao
import org.tasks.data.TagData import org.tasks.data.TagData
import org.tasks.data.TagDataDaoBlocking import org.tasks.data.TagDataDao
import org.tasks.tags.TagPickerActivity import org.tasks.tags.TagPickerActivity
import org.tasks.ui.ChipProvider import org.tasks.ui.ChipProvider
import org.tasks.ui.TaskEditControlFragment import org.tasks.ui.TaskEditControlFragment
@ -34,8 +32,8 @@ import javax.inject.Inject
*/ */
@AndroidEntryPoint @AndroidEntryPoint
class TagsControlSet : TaskEditControlFragment() { class TagsControlSet : TaskEditControlFragment() {
@Inject lateinit var tagDao: TagDaoBlocking @Inject lateinit var tagDao: TagDao
@Inject lateinit var tagDataDao: TagDataDaoBlocking @Inject lateinit var tagDataDao: TagDataDao
@Inject lateinit var chipProvider: ChipProvider @Inject lateinit var chipProvider: ChipProvider
@BindView(R.id.no_tags) @BindView(R.id.no_tags)
@ -47,22 +45,20 @@ class TagsControlSet : TaskEditControlFragment() {
private lateinit var originalTags: ArrayList<TagData> private lateinit var originalTags: ArrayList<TagData>
private lateinit var selectedTags: ArrayList<TagData> private lateinit var selectedTags: ArrayList<TagData>
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { if (savedInstanceState == null) {
val view = super.onCreateView(inflater, container, savedInstanceState)
if (savedInstanceState != null) {
selectedTags = savedInstanceState.getParcelableArrayList(EXTRA_SELECTED_TAGS)!!
originalTags = savedInstanceState.getParcelableArrayList(EXTRA_ORIGINAL_TAGS)!!
} else {
originalTags = ArrayList(if (task.isNew) { originalTags = ArrayList(if (task.isNew) {
task.tags.mapNotNull(tagDataDao::getTagByName) task.tags.mapNotNull { tagDataDao.getTagByName(it) }
} else { } else {
tagDataDao.getTagDataForTask(task.id) tagDataDao.getTagDataForTask(task.id)
}) })
selectedTags = ArrayList(originalTags) selectedTags = ArrayList(originalTags)
}
refreshDisplayView() refreshDisplayView()
return view } else {
selectedTags = savedInstanceState.getParcelableArrayList(EXTRA_SELECTED_TAGS)!!
originalTags = savedInstanceState.getParcelableArrayList(EXTRA_ORIGINAL_TAGS)!!
refreshDisplayView()
}
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {

@ -10,9 +10,7 @@ import android.os.Bundle
import android.os.SystemClock import android.os.SystemClock
import android.text.format.DateFormat import android.text.format.DateFormat
import android.text.format.DateUtils import android.text.format.DateUtils
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import android.widget.Chronometer import android.widget.Chronometer
import android.widget.Chronometer.OnChronometerTickListener import android.widget.Chronometer.OnChronometerTickListener
import android.widget.ImageView import android.widget.ImageView
@ -58,9 +56,7 @@ class TimerControlSet : TaskEditControlFragment() {
private lateinit var dialogView: View private lateinit var dialogView: View
private lateinit var callback: TimerControlSetCallback private lateinit var callback: TimerControlSetCallback
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
val elapsedSeconds: Int val elapsedSeconds: Int
val estimatedSeconds: Int val estimatedSeconds: Int
if (savedInstanceState == null) { if (savedInstanceState == null) {
@ -72,13 +68,12 @@ class TimerControlSet : TaskEditControlFragment() {
elapsedSeconds = savedInstanceState.getInt(EXTRA_ELAPSED) elapsedSeconds = savedInstanceState.getInt(EXTRA_ELAPSED)
estimatedSeconds = savedInstanceState.getInt(EXTRA_ESTIMATED) estimatedSeconds = savedInstanceState.getInt(EXTRA_ESTIMATED)
} }
dialogView = inflater.inflate(R.layout.control_set_timers_dialog, null) dialogView = activity.layoutInflater.inflate(R.layout.control_set_timers_dialog, null)
estimated = TimeDurationControlSet(activity, dialogView, R.id.estimatedDuration, theme) estimated = TimeDurationControlSet(activity, dialogView, R.id.estimatedDuration, theme)
elapsed = TimeDurationControlSet(activity, dialogView, R.id.elapsedDuration, theme) elapsed = TimeDurationControlSet(activity, dialogView, R.id.elapsedDuration, theme)
estimated.setTimeDuration(estimatedSeconds) estimated.setTimeDuration(estimatedSeconds)
elapsed.setTimeDuration(elapsedSeconds) elapsed.setTimeDuration(elapsedSeconds)
refresh() refresh()
return view
} }
override fun onAttach(activity: Activity) { override fun onAttach(activity: Activity) {

@ -8,7 +8,6 @@ package com.todoroo.astrid.ui
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.* import android.widget.*
@ -71,9 +70,7 @@ class HideUntilControlSet : TaskEditControlFragment(), OnItemSelectedListener {
override val isClickable: Boolean override val isClickable: Boolean
get() = true get() = true
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
adapter = object : HiddenTopArrayAdapter<HideUntilValue>( adapter = object : HiddenTopArrayAdapter<HideUntilValue>(
activity, android.R.layout.simple_spinner_item, spinnerItems) { activity, android.R.layout.simple_spinner_item, spinnerItems) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
@ -81,7 +78,7 @@ class HideUntilControlSet : TaskEditControlFragment(), OnItemSelectedListener {
if (parent is AdapterView<*>) { if (parent is AdapterView<*>) {
selectedItemPosition = parent.selectedItemPosition selectedItemPosition = parent.selectedItemPosition
} }
val tv = inflater.inflate(android.R.layout.simple_spinner_item, parent, false) as TextView val tv = activity.layoutInflater.inflate(android.R.layout.simple_spinner_item, parent, false) as TextView
tv.setPadding(0, 0, 0, 0) tv.setPadding(0, 0, 0, 0)
val value = getItem(selectedItemPosition) val value = getItem(selectedItemPosition)
if (value!!.setting == Task.HIDE_UNTIL_NONE) { if (value!!.setting == Task.HIDE_UNTIL_NONE) {
@ -139,7 +136,6 @@ class HideUntilControlSet : TaskEditControlFragment(), OnItemSelectedListener {
spinner.setSelection(selection) spinner.setSelection(selection)
spinner.onItemSelectedListener = this spinner.onItemSelectedListener = this
refreshDisplayView() refreshDisplayView()
return view
} }
override val layout: Int override val layout: Int

@ -16,12 +16,14 @@ import android.view.ViewGroup
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.lifecycle.lifecycleScope
import butterknife.BindView import butterknife.BindView
import butterknife.OnClick import butterknife.OnClick
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.activities.DateAndTimePickerActivity import org.tasks.activities.DateAndTimePickerActivity
import org.tasks.data.Alarm import org.tasks.data.Alarm
@ -62,9 +64,7 @@ class ReminderControlSet : TaskEditControlFragment() {
private var whenDue = false private var whenDue = false
private var whenOverdue = false private var whenOverdue = false
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
mode.paintFlags = mode.paintFlags or Paint.UNDERLINE_TEXT_FLAG mode.paintFlags = mode.paintFlags or Paint.UNDERLINE_TEXT_FLAG
taskId = task.id taskId = task.id
if (savedInstanceState == null) { if (savedInstanceState == null) {
@ -76,10 +76,9 @@ class ReminderControlSet : TaskEditControlFragment() {
randomReminder = savedInstanceState.getLong(EXTRA_RANDOM_REMINDER) randomReminder = savedInstanceState.getLong(EXTRA_RANDOM_REMINDER)
setup(savedInstanceState.getLongArray(EXTRA_ALARMS)!!.toList()) setup(savedInstanceState.getLongArray(EXTRA_ALARMS)!!.toList())
} }
return view
} }
private fun currentAlarms(): List<Long> { private suspend fun currentAlarms(): List<Long> {
return if (taskId == Task.NO_ID) { return if (taskId == Task.NO_ID) {
emptyList() emptyList()
} else { } else {

@ -30,7 +30,7 @@ abstract class TagDao {
abstract suspend fun delete(tags: List<Tag>) abstract suspend fun delete(tags: List<Tag>)
@Transaction @Transaction
open suspend fun applyTags(task: Task, tagDataDao: TagDataDaoBlocking, current: List<TagData>): Boolean { open suspend fun applyTags(task: Task, tagDataDao: TagDataDao, current: List<TagData>): Boolean {
val taskId = task.id val taskId = task.id
val existing = HashSet(tagDataDao.getTagDataForTask(taskId)) val existing = HashSet(tagDataDao.getTagDataForTask(taskId))
val selected = HashSet<TagData>(current) val selected = HashSet<TagData>(current)

@ -39,7 +39,7 @@ class TagDaoBlocking @Inject constructor(private val dao: TagDao) {
} }
fun applyTags(task: Task, tagDataDao: TagDataDaoBlocking, current: List<TagData>): Boolean = runBlocking { fun applyTags(task: Task, tagDataDao: TagDataDaoBlocking, current: List<TagData>): Boolean = runBlocking {
dao.applyTags(task, tagDataDao, current) dao.applyTags(task, tagDataDao.dao, current)
} }
fun insert(task: Task, tags: Collection<TagData>) = runBlocking { fun insert(task: Task, tags: Collection<TagData>) = runBlocking {

@ -9,7 +9,7 @@ import org.tasks.time.DateTimeUtils.currentTimeMillis
import javax.inject.Inject import javax.inject.Inject
@Deprecated("use coroutines") @Deprecated("use coroutines")
class TagDataDaoBlocking @Inject constructor(private val dao: TagDataDao) { class TagDataDaoBlocking @Inject constructor(val dao: TagDataDao) {
fun subscribeToTags(): LiveData<List<TagData>> { fun subscribeToTags(): LiveData<List<TagData>> {
return dao.subscribeToTags() return dao.subscribeToTags()
} }

@ -62,6 +62,10 @@ class CommentBarFragment : TaskEditControlFragment() {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(layout, container, false) val view = inflater.inflate(layout, container, false)
ButterKnife.bind(this, view) ButterKnife.bind(this, view)
return view
}
override suspend fun createView(savedInstanceState: Bundle?) {
if (savedInstanceState != null) { if (savedInstanceState != null) {
val uri = savedInstanceState.getString(EXTRA_PICTURE) val uri = savedInstanceState.getString(EXTRA_PICTURE)
if (uri != null) { if (uri != null) {
@ -77,7 +81,6 @@ class CommentBarFragment : TaskEditControlFragment() {
} }
commentBar.setBackgroundColor(themeColor.primaryColor) commentBar.setBackgroundColor(themeColor.primaryColor)
resetPictureButton() resetPictureButton()
return view
} }
override val layout: Int override val layout: Int

@ -7,6 +7,7 @@ import androidx.work.WorkerParameters
import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.reminders.ReminderService import com.todoroo.astrid.reminders.ReminderService
import com.todoroo.astrid.timers.TimerPlugin import com.todoroo.astrid.timers.TimerPlugin
import kotlinx.coroutines.runBlocking
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.data.DeletionDaoBlocking import org.tasks.data.DeletionDaoBlocking
import org.tasks.data.LocationDaoBlocking import org.tasks.data.LocationDaoBlocking
@ -39,7 +40,9 @@ class CleanupWork @WorkerInject constructor(
return Result.failure() return Result.failure()
} }
tasks.forEach { task -> tasks.forEach { task ->
runBlocking {
alarmService.cancelAlarms(task) alarmService.cancelAlarms(task)
}
reminderService.cancelReminder(task) reminderService.cancelReminder(task)
notificationManager.cancel(task) notificationManager.cancel(task)
locationDao.getGeofencesForTask(task).forEach { locationDao.getGeofencesForTask(task).forEach {

@ -53,9 +53,7 @@ class CalendarControlSet : TaskEditControlFragment() {
private var calendarId: String? = null private var calendarId: String? = null
private var eventUri: String? = null private var eventUri: String? = null
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
val canAccessCalendars = permissionChecker.canAccessCalendars() val canAccessCalendars = permissionChecker.canAccessCalendars()
if (savedInstanceState != null) { if (savedInstanceState != null) {
eventUri = savedInstanceState.getString(EXTRA_URI) eventUri = savedInstanceState.getString(EXTRA_URI)
@ -81,7 +79,6 @@ class CalendarControlSet : TaskEditControlFragment() {
eventUri = null eventUri = null
} }
refreshDisplayView() refreshDisplayView()
return view
} }
override val layout: Int override val layout: Int

@ -3,9 +3,6 @@ package org.tasks.ui
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView import android.widget.TextView
import butterknife.BindView import butterknife.BindView
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
@ -40,12 +37,9 @@ class DeadlineControlSet : TaskEditControlFragment() {
callback = activity as DueDateChangeListener callback = activity as DueDateChangeListener
} }
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
date = savedInstanceState?.getLong(EXTRA_DATE) ?: task.dueDate date = savedInstanceState?.getLong(EXTRA_DATE) ?: task.dueDate
refreshDisplayView() refreshDisplayView()
return view
} }
override fun onRowClick() { override fun onRowClick() {

@ -1,9 +1,6 @@
package org.tasks.ui package org.tasks.ui
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText import android.widget.EditText
import butterknife.BindView import butterknife.BindView
import butterknife.OnTextChanged import butterknife.OnTextChanged
@ -25,9 +22,7 @@ class DescriptionControlSet : TaskEditControlFragment() {
private var description: String? = null private var description: String? = null
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
description = if (savedInstanceState == null) { description = if (savedInstanceState == null) {
stripCarriageReturns(task.notes) stripCarriageReturns(task.notes)
} else { } else {
@ -39,7 +34,6 @@ class DescriptionControlSet : TaskEditControlFragment() {
if (preferences.getBoolean(R.string.p_linkify_task_edit, false)) { if (preferences.getBoolean(R.string.p_linkify_task_edit, false)) {
linkify.linkify(editText) linkify.linkify(editText)
} }
return view
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {

@ -6,6 +6,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
import butterknife.BindView import butterknife.BindView
import com.google.android.material.chip.ChipGroup import com.google.android.material.chip.ChipGroup
import com.todoroo.astrid.api.CaldavFilter import com.todoroo.astrid.api.CaldavFilter
@ -14,6 +15,7 @@ import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskMover import com.todoroo.astrid.service.TaskMover
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.R import org.tasks.R
import org.tasks.activities.ListPicker import org.tasks.activities.ListPicker
import org.tasks.data.* import org.tasks.data.*
@ -25,9 +27,9 @@ class ListFragment : TaskEditControlFragment() {
@BindView(R.id.chip_group) @BindView(R.id.chip_group)
lateinit var chipGroup: ChipGroup lateinit var chipGroup: ChipGroup
@Inject lateinit var googleTaskListDao: GoogleTaskListDaoBlocking @Inject lateinit var googleTaskListDao: GoogleTaskListDao
@Inject lateinit var googleTaskDao: GoogleTaskDaoBlocking @Inject lateinit var googleTaskDao: GoogleTaskDao
@Inject lateinit var caldavDao: CaldavDaoBlocking @Inject lateinit var caldavDao: CaldavDao
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider @Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var taskMover: TaskMover @Inject lateinit var taskMover: TaskMover
@Inject lateinit var chipProvider: ChipProvider @Inject lateinit var chipProvider: ChipProvider
@ -45,13 +47,8 @@ class ListFragment : TaskEditControlFragment() {
callback = activity as OnListChanged callback = activity as OnListChanged
} }
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { if (savedInstanceState == null) {
val view = super.onCreateView(inflater, container, savedInstanceState)
if (savedInstanceState != null) {
originalList = savedInstanceState.getParcelable(EXTRA_ORIGINAL_LIST)
setSelected(savedInstanceState.getParcelable(EXTRA_SELECTED_LIST)!!)
} else {
if (task.isNew) { if (task.isNew) {
if (task.hasTransitory(GoogleTask.KEY)) { if (task.hasTransitory(GoogleTask.KEY)) {
val listId = task.getTransitory<String>(GoogleTask.KEY)!! val listId = task.getTransitory<String>(GoogleTask.KEY)!!
@ -84,8 +81,10 @@ class ListFragment : TaskEditControlFragment() {
originalList = defaultFilterProvider.defaultList originalList = defaultFilterProvider.defaultList
} }
setSelected(originalList!!) setSelected(originalList!!)
} else {
originalList = savedInstanceState.getParcelable(EXTRA_ORIGINAL_LIST)
setSelected(savedInstanceState.getParcelable(EXTRA_SELECTED_LIST)!!)
} }
return view
} }
private fun setSelected(filter: Filter) { private fun setSelected(filter: Filter) {

@ -14,18 +14,20 @@ import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.util.Pair import androidx.core.util.Pair
import androidx.lifecycle.lifecycleScope
import butterknife.BindView import butterknife.BindView
import butterknife.OnClick import butterknife.OnClick
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.data.SyncFlags import com.todoroo.astrid.data.SyncFlags
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.PermissionUtil.verifyPermissions import org.tasks.PermissionUtil.verifyPermissions
import org.tasks.R import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.data.Geofence import org.tasks.data.Geofence
import org.tasks.data.Location import org.tasks.data.Location
import org.tasks.data.LocationDaoBlocking import org.tasks.data.LocationDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.GeofenceDialog import org.tasks.dialogs.GeofenceDialog
@ -40,7 +42,7 @@ class LocationControlSet : TaskEditControlFragment() {
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
@Inject lateinit var dialogBuilder: DialogBuilder @Inject lateinit var dialogBuilder: DialogBuilder
@Inject lateinit var geofenceApi: GeofenceApi @Inject lateinit var geofenceApi: GeofenceApi
@Inject lateinit var locationDao: LocationDaoBlocking @Inject lateinit var locationDao: LocationDao
@Inject lateinit var device: Device @Inject lateinit var device: Device
@Inject lateinit var permissionRequestor: FragmentPermissionRequestor @Inject lateinit var permissionRequestor: FragmentPermissionRequestor
@Inject lateinit var permissionChecker: PermissionChecker @Inject lateinit var permissionChecker: PermissionChecker
@ -57,9 +59,7 @@ class LocationControlSet : TaskEditControlFragment() {
private var original: Location? = null private var original: Location? = null
private var location: Location? = null private var location: Location? = null
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
if (savedInstanceState == null) { if (savedInstanceState == null) {
if (task.isNew) { if (task.isNew) {
if (task.hasTransitory(Place.KEY)) { if (task.hasTransitory(Place.KEY)) {
@ -72,13 +72,12 @@ class LocationControlSet : TaskEditControlFragment() {
original = locationDao.getGeofences(task.id) original = locationDao.getGeofences(task.id)
} }
if (original != null) { if (original != null) {
location = Location(original!!.geofence, original!!.place) setLocation(Location(original!!.geofence, original!!.place))
} }
} else { } else {
original = savedInstanceState.getParcelable(EXTRA_ORIGINAL) original = savedInstanceState.getParcelable(EXTRA_ORIGINAL)
location = savedInstanceState.getParcelable(EXTRA_LOCATION) location = savedInstanceState.getParcelable(EXTRA_LOCATION)
} }
return view
} }
override fun onResume() { override fun onResume() {

@ -38,9 +38,7 @@ class PriorityControlSet : TaskEditControlFragment() {
priority = getPriority() priority = getPriority()
} }
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
priority = savedInstanceState?.getInt(EXTRA_PRIORITY) ?: task.priority priority = savedInstanceState?.getInt(EXTRA_PRIORITY) ?: task.priority
when (priority) { when (priority) {
0 -> priorityHigh.isChecked = true 0 -> priorityHigh.isChecked = true
@ -52,7 +50,6 @@ class PriorityControlSet : TaskEditControlFragment() {
tintRadioButton(priorityMedium, 1) tintRadioButton(priorityMedium, 1)
tintRadioButton(priorityLow, 2) tintRadioButton(priorityLow, 2)
tintRadioButton(priorityNone, 3) tintRadioButton(priorityNone, 3)
return view
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {

@ -15,6 +15,7 @@ import android.widget.EditText
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -28,13 +29,14 @@ import com.todoroo.astrid.activity.MainActivity
import com.todoroo.astrid.api.CaldavFilter import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter import com.todoroo.astrid.api.GtasksFilter
import com.todoroo.astrid.dao.TaskDaoBlocking import com.todoroo.astrid.dao.TaskDao
import com.todoroo.astrid.dao.TaskDao.TaskCriteria.activeAndVisible import com.todoroo.astrid.dao.TaskDao.TaskCriteria.activeAndVisible
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.service.TaskCompleter import com.todoroo.astrid.service.TaskCompleter
import com.todoroo.astrid.service.TaskCreator import com.todoroo.astrid.service.TaskCreator
import com.todoroo.astrid.ui.CheckableImageView import com.todoroo.astrid.ui.CheckableImageView
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
@ -57,11 +59,11 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks
@Inject lateinit var activity: Activity @Inject lateinit var activity: Activity
@Inject lateinit var taskCompleter: TaskCompleter @Inject lateinit var taskCompleter: TaskCompleter
@Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var googleTaskDao: GoogleTaskDaoBlocking @Inject lateinit var googleTaskDao: GoogleTaskDao
@Inject lateinit var toaster: Toaster @Inject lateinit var toaster: Toaster
@Inject lateinit var taskCreator: TaskCreator @Inject lateinit var taskCreator: TaskCreator
@Inject lateinit var caldavDao: CaldavDaoBlocking @Inject lateinit var caldavDao: CaldavDao
@Inject lateinit var taskDao: TaskDaoBlocking @Inject lateinit var taskDao: TaskDao
@Inject lateinit var locale: Locale @Inject lateinit var locale: Locale
@Inject lateinit var checkBoxProvider: CheckBoxProvider @Inject lateinit var checkBoxProvider: CheckBoxProvider
@Inject lateinit var chipProvider: ChipProvider @Inject lateinit var chipProvider: ChipProvider
@ -77,9 +79,7 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks
outState.putParcelableArrayList(EXTRA_NEW_SUBTASKS, newSubtasks) outState.putParcelableArrayList(EXTRA_NEW_SUBTASKS, newSubtasks)
} }
override fun onCreateView( override suspend fun createView(savedInstanceState: Bundle?) {
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = super.onCreateView(inflater, container, savedInstanceState)
viewModel = ViewModelProvider(this).get(TaskListViewModel::class.java) viewModel = ViewModelProvider(this).get(TaskListViewModel::class.java)
if (savedInstanceState != null) { if (savedInstanceState != null) {
for (task in savedInstanceState.getParcelableArrayList<Task>(EXTRA_NEW_SUBTASKS)!!) { for (task in savedInstanceState.getParcelableArrayList<Task>(EXTRA_NEW_SUBTASKS)!!) {
@ -96,7 +96,6 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks
viewModel.observe(this, Observer { list: List<TaskContainer?>? -> recyclerAdapter.submitList(list) }) viewModel.observe(this, Observer { list: List<TaskContainer?>? -> recyclerAdapter.submitList(list) })
recyclerView!!.adapter = recyclerAdapter recyclerView!!.adapter = recyclerAdapter
} }
return view
} }
override val layout: Int override val layout: Int
@ -162,9 +161,11 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
localBroadcastManager.registerRefreshReceiver(refreshReceiver) localBroadcastManager.registerRefreshReceiver(refreshReceiver)
lifecycleScope.launch {
googleTask = googleTaskDao.getByTaskId(task.id) googleTask = googleTaskDao.getByTaskId(task.id)
updateUI() updateUI()
} }
}
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
@ -254,9 +255,11 @@ class SubtaskControlSet : TaskEditControlFragment(), SubtaskViewHolder.Callbacks
} }
override fun toggleSubtask(taskId: Long, collapsed: Boolean) { override fun toggleSubtask(taskId: Long, collapsed: Boolean) {
lifecycleScope.launch {
taskDao.setCollapsed(taskId, collapsed) taskDao.setCollapsed(taskId, collapsed)
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
} }
}
override fun complete(task: Task, completed: Boolean) { override fun complete(task: Task, completed: Boolean) {
taskCompleter.setComplete(task, completed) taskCompleter.setComplete(task, completed)

@ -8,8 +8,10 @@ import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import butterknife.ButterKnife import butterknife.ButterKnife
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.tasks.R import org.tasks.R
@ -30,9 +32,16 @@ abstract class TaskEditControlFragment : Fragment() {
content.setOnClickListener { onRowClick() } content.setOnClickListener { onRowClick() }
} }
ButterKnife.bind(this, view) ButterKnife.bind(this, view)
lifecycleScope.launch {
createView(savedInstanceState)
}
return view return view
} }
protected abstract suspend fun createView(savedInstanceState: Bundle?)
override fun onAttach(activity: Activity) { override fun onAttach(activity: Activity) {
super.onAttach(activity) super.onAttach(activity)
val args = requireArguments() val args = requireArguments()

Loading…
Cancel
Save