Replace timestamps with alarms

pull/1742/merge
Alex Baker 4 years ago
parent f03e8d0b36
commit 7a365167c8

@ -94,7 +94,8 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
args.getParcelable(EXTRA_LIST)!!, args.getParcelable(EXTRA_LIST)!!,
args.getParcelable(EXTRA_LOCATION), args.getParcelable(EXTRA_LOCATION),
args.getParcelableArrayList(EXTRA_TAGS)!!, args.getParcelableArrayList(EXTRA_TAGS)!!,
args.getLongArray(EXTRA_ALARMS)!!) args.getParcelableArrayList(EXTRA_ALARMS)!!
)
} }
val activity = requireActivity() as MainActivity val activity = requireActivity() as MainActivity
editViewModel.cleared.observe(activity) { editViewModel.cleared.observe(activity) {
@ -385,7 +386,7 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener {
arguments.putParcelable(EXTRA_LIST, list) arguments.putParcelable(EXTRA_LIST, list)
arguments.putParcelable(EXTRA_LOCATION, location) arguments.putParcelable(EXTRA_LOCATION, location)
arguments.putParcelableArrayList(EXTRA_TAGS, tags) arguments.putParcelableArrayList(EXTRA_TAGS, tags)
arguments.putLongArray(EXTRA_ALARMS, alarms.map { it.time }.toLongArray()) arguments.putParcelableArrayList(EXTRA_ALARMS, alarms)
taskEditFragment.arguments = arguments taskEditFragment.arguments = arguments
return taskEditFragment return taskEditFragment
} }

@ -9,7 +9,6 @@ import org.tasks.data.Alarm
import org.tasks.data.AlarmDao 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 javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -27,13 +26,10 @@ class AlarmService @Inject constructor(
if (oldDueDate <= 0 || newDueDate <= 0) { if (oldDueDate <= 0 || newDueDate <= 0) {
return return
} }
val alarms: MutableSet<Long> = LinkedHashSet() getAlarms(taskId)
for (alarm in getAlarms(taskId)) { .takeIf { it.isNotEmpty() }
alarms.add(alarm.time + (newDueDate - oldDueDate)) ?.onEach { it.time += newDueDate - oldDueDate }
} ?.let { synchronizeAlarms(taskId, it.toMutableSet()) }
if (alarms.isNotEmpty()) {
synchronizeAlarms(taskId, alarms)
}
} }
private suspend fun getAlarms(taskId: Long): List<Alarm> = alarmDao.getAlarms(taskId) private suspend fun getAlarms(taskId: Long): List<Alarm> = alarmDao.getAlarms(taskId)
@ -43,17 +39,18 @@ class AlarmService @Inject constructor(
* *
* @return true if data was changed * @return true if data was changed
*/ */
suspend fun synchronizeAlarms(taskId: Long, timestamps: MutableSet<Long>): Boolean { suspend fun synchronizeAlarms(taskId: Long, alarms: MutableSet<Alarm>): Boolean {
var changed = false var changed = false
for (item in alarmDao.getAlarms(taskId)) { for (existing in alarmDao.getAlarms(taskId)) {
if (!timestamps.remove(item.time)) { if (!alarms.removeIf { it.time == existing.time }) {
jobs.cancelAlarm(item.id) jobs.cancelAlarm(existing.id)
alarmDao.delete(item) alarmDao.delete(existing)
changed = true changed = true
} }
} }
for (timestamp in timestamps) { for (alarm in alarms) {
alarmDao.insert(Alarm(taskId, timestamp)) alarm.task = taskId
alarmDao.insert(alarm)
changed = true changed = true
} }
if (changed) { if (changed) {

@ -19,6 +19,7 @@ import com.todoroo.andlib.utility.DateUtilities
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
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.databinding.ControlSetRemindersBinding import org.tasks.databinding.ControlSetRemindersBinding
import org.tasks.date.DateTimeUtils import org.tasks.date.DateTimeUtils
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
@ -141,8 +142,10 @@ class ReminderControlSet : TaskEditControlFragment() {
if (requestCode == REQUEST_NEW_ALARM) { if (requestCode == REQUEST_NEW_ALARM) {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
val timestamp = data!!.getLongExtra(MyTimePickerDialog.EXTRA_TIMESTAMP, 0L) val timestamp = data!!.getLongExtra(MyTimePickerDialog.EXTRA_TIMESTAMP, 0L)
if (viewModel.selectedAlarms?.add(timestamp) == true) { if (viewModel.selectedAlarms?.any { timestamp == it.time } == false) {
addAlarmRow(timestamp) val alarm = Alarm(viewModel.task?.id ?: 0, timestamp)
viewModel.selectedAlarms?.add(alarm)
addAlarmRow(alarm)
} }
} }
} else { } else {
@ -150,9 +153,9 @@ class ReminderControlSet : TaskEditControlFragment() {
} }
} }
private fun addAlarmRow(timestamp: Long) { private fun addAlarmRow(alarm: Alarm) {
addAlarmRow(DateUtilities.getLongDateStringWithTime(timestamp, locale.locale)) { addAlarmRow(DateUtilities.getLongDateStringWithTime(alarm.time, locale.locale)) {
viewModel.selectedAlarms?.remove(timestamp) viewModel.selectedAlarms?.removeIf { it.time == alarm.time }
} }
} }

@ -1,12 +1,14 @@
package org.tasks.data package org.tasks.data
import android.os.Parcel
import android.os.Parcelable
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity
import androidx.room.Ignore import androidx.room.Ignore
import androidx.room.PrimaryKey import androidx.room.PrimaryKey
@Entity(tableName = "alarms") @Entity(tableName = "alarms")
class Alarm { class Alarm : Parcelable {
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id") @ColumnInfo(name = "_id")
@Transient @Transient
@ -21,6 +23,13 @@ class Alarm {
constructor() constructor()
@Ignore
constructor(parcel: Parcel) {
id = parcel.readLong()
task = parcel.readLong()
time = parcel.readLong()
}
@Ignore @Ignore
constructor(task: Long, time: Long) { constructor(task: Long, time: Long) {
this.task = task this.task = task
@ -48,4 +57,18 @@ class Alarm {
result = 31 * result + time.hashCode() result = 31 * result + time.hashCode()
return result return result
} }
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeLong(id)
parcel.writeLong(task)
parcel.writeLong(time)
}
override fun describeContents() = 0
companion object CREATOR : Parcelable.Creator<Alarm> {
override fun createFromParcel(parcel: Parcel) = Alarm(parcel)
override fun newArray(size: Int): Array<Alarm?> = arrayOfNulls(size)
}
} }

@ -34,7 +34,16 @@ import org.tasks.Event
import org.tasks.R import org.tasks.R
import org.tasks.Strings import org.tasks.Strings
import org.tasks.calendars.CalendarEventProvider import org.tasks.calendars.CalendarEventProvider
import org.tasks.data.* import org.tasks.data.Alarm
import org.tasks.data.CaldavDao
import org.tasks.data.CaldavTask
import org.tasks.data.GoogleTask
import org.tasks.data.GoogleTaskDao
import org.tasks.data.Location
import org.tasks.data.LocationDao
import org.tasks.data.TagDao
import org.tasks.data.TagData
import org.tasks.data.TagDataDao
import org.tasks.date.DateTimeUtils.toDateTime import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.location.GeofenceApi import org.tasks.location.GeofenceApi
import org.tasks.preferences.PermissionChecker import org.tasks.preferences.PermissionChecker
@ -70,7 +79,12 @@ class TaskEditViewModel @Inject constructor(
val cleared = MutableLiveData<Event<Boolean>>() val cleared = MutableLiveData<Event<Boolean>>()
fun setup( fun setup(
task: Task, list: Filter, location: Location?, tags: List<TagData>, alarms: LongArray) { task: Task,
list: Filter,
location: Location?,
tags: List<TagData>,
alarms: List<Alarm>,
) {
this.task = task this.task = task
isNew = task.isNew isNew = task.isNew
originalList = list originalList = list
@ -228,13 +242,13 @@ class TaskEditViewModel @Inject constructor(
var reminderPeriod: Long? = null var reminderPeriod: Long? = null
get() = field ?: task?.reminderPeriod ?: 0 get() = field ?: task?.reminderPeriod ?: 0
var originalAlarms: ImmutableSet<Long>? = null var originalAlarms: ImmutableSet<Alarm>? = null
private set(value) { private set(value) {
field = value field = value
selectedAlarms = value?.let { HashSet(it) } selectedAlarms = value?.let { HashSet(it) }
} }
var selectedAlarms: HashSet<Long>? = null var selectedAlarms: HashSet<Alarm>? = null
var whenStart: Boolean? = null var whenStart: Boolean? = null
get() = field ?: (task?.reminderFlags?.and(Task.NOTIFY_AT_START) ?: 0 > 0) get() = field ?: (task?.reminderFlags?.and(Task.NOTIFY_AT_START) ?: 0 > 0)

Loading…
Cancel
Save