Replace timestamps with alarms

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

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

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

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

@ -1,12 +1,14 @@
package org.tasks.data
import android.os.Parcel
import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
@Entity(tableName = "alarms")
class Alarm {
class Alarm : Parcelable {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id")
@Transient
@ -21,6 +23,13 @@ class Alarm {
constructor()
@Ignore
constructor(parcel: Parcel) {
id = parcel.readLong()
task = parcel.readLong()
time = parcel.readLong()
}
@Ignore
constructor(task: Long, time: Long) {
this.task = task
@ -48,4 +57,18 @@ class Alarm {
result = 31 * result + time.hashCode()
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.Strings
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.location.GeofenceApi
import org.tasks.preferences.PermissionChecker
@ -70,7 +79,12 @@ class TaskEditViewModel @Inject constructor(
val cleared = MutableLiveData<Event<Boolean>>()
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
isNew = task.isNew
originalList = list
@ -228,13 +242,13 @@ class TaskEditViewModel @Inject constructor(
var reminderPeriod: Long? = null
get() = field ?: task?.reminderPeriod ?: 0
var originalAlarms: ImmutableSet<Long>? = null
var originalAlarms: ImmutableSet<Alarm>? = null
private set(value) {
field = value
selectedAlarms = value?.let { HashSet(it) }
}
var selectedAlarms: HashSet<Long>? = null
var selectedAlarms: HashSet<Alarm>? = null
var whenStart: Boolean? = null
get() = field ?: (task?.reminderFlags?.and(Task.NOTIFY_AT_START) ?: 0 > 0)

Loading…
Cancel
Save