diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt index 490149de6..adaedd412 100755 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt @@ -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 } diff --git a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt index 8bd925df4..e1922d9bd 100644 --- a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt +++ b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt @@ -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 = 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 = alarmDao.getAlarms(taskId) @@ -43,17 +39,18 @@ class AlarmService @Inject constructor( * * @return true if data was changed */ - suspend fun synchronizeAlarms(taskId: Long, timestamps: MutableSet): Boolean { + suspend fun synchronizeAlarms(taskId: Long, alarms: MutableSet): 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) { diff --git a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt index 80db07622..71f8c12eb 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt @@ -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 } } } diff --git a/app/src/main/java/org/tasks/data/Alarm.kt b/app/src/main/java/org/tasks/data/Alarm.kt index ccf6deee0..97bf6d8c3 100644 --- a/app/src/main/java/org/tasks/data/Alarm.kt +++ b/app/src/main/java/org/tasks/data/Alarm.kt @@ -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 { + override fun createFromParcel(parcel: Parcel) = Alarm(parcel) + + override fun newArray(size: Int): Array = arrayOfNulls(size) + } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt index cfb1a1121..d878cc0a6 100644 --- a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt @@ -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>() fun setup( - task: Task, list: Filter, location: Location?, tags: List, alarms: LongArray) { + task: Task, + list: Filter, + location: Location?, + tags: List, + alarms: List, + ) { 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? = null + var originalAlarms: ImmutableSet? = null private set(value) { field = value selectedAlarms = value?.let { HashSet(it) } } - var selectedAlarms: HashSet? = null + var selectedAlarms: HashSet? = null var whenStart: Boolean? = null get() = field ?: (task?.reminderFlags?.and(Task.NOTIFY_AT_START) ?: 0 > 0)