mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-07-13 17:51:57 +00:00
Refactor weekly reminder scheduling logic for specific days intervals
Refactor weekly reminder scheduling logic to handle specific days and intervals correctly
This commit is contained in:
parent
7aac6eb6ac
commit
503271c440
2 changed files with 29 additions and 30 deletions
|
|
@ -5,6 +5,7 @@ import android.app.PendingIntent
|
|||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.habitrpg.android.habitica.data.TaskRepository
|
||||
import com.habitrpg.android.habitica.extensions.withImmutableFlag
|
||||
|
|
@ -128,7 +129,6 @@ class TaskAlarmManager(
|
|||
val now = ZonedDateTime.now().withZoneSameLocal(ZoneId.systemDefault())?.toInstant()
|
||||
val reminderZonedTime = remindersItem.getLocalZonedDateTimeInstant()
|
||||
|
||||
|
||||
if (reminderZonedTime == null || reminderZonedTime.isBefore(now)) {
|
||||
return
|
||||
}
|
||||
|
|
@ -253,6 +253,7 @@ class TaskAlarmManager(
|
|||
// For SDK >= Android 12, allows batching of reminders
|
||||
try {
|
||||
alarmManager?.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time, pendingIntent)
|
||||
Log.d("TaskAlarmManager", "setAlarm: Scheduling for $time using setAndAllowWhileIdle")
|
||||
} catch (ex: Exception) {
|
||||
when (ex) {
|
||||
is IllegalStateException, is SecurityException -> {
|
||||
|
|
|
|||
|
|
@ -375,40 +375,38 @@ open class Task : RealmObject, BaseMainObject, Parcelable, BaseTask {
|
|||
dateTimeOccurenceToSchedule
|
||||
}
|
||||
Frequency.WEEKLY -> {
|
||||
// Set to start date if current date is earlier
|
||||
if (dateTimeOccurenceToSchedule.isBefore(startDate)) {
|
||||
dateTimeOccurenceToSchedule = startDate
|
||||
} else {
|
||||
// Check if all days are selected
|
||||
if (repeatDays?.hasAnyDaySelected() == true) {
|
||||
// Simply increment by one day
|
||||
dateTimeOccurenceToSchedule = dateTimeOccurenceToSchedule.plusDays(1)
|
||||
} else {
|
||||
// Logic for specific days selected
|
||||
var nextDueDate = dateTimeOccurenceToSchedule
|
||||
while (!nextDueDate.matchesRepeatDays(repeatDays)) {
|
||||
nextDueDate = nextDueDate.plusDays(1)
|
||||
}
|
||||
|
||||
val weeksSinceStart = ChronoUnit.WEEKS.between(startDate.toLocalDate(), nextDueDate.toLocalDate())
|
||||
if (weeksSinceStart % everyX != 0L) {
|
||||
val weeksToNextValidInterval = everyX - (weeksSinceStart % everyX)
|
||||
nextDueDate = nextDueDate.plusWeeks(weeksToNextValidInterval)
|
||||
while (!nextDueDate.matchesRepeatDays(repeatDays)) {
|
||||
nextDueDate = nextDueDate.plusDays(1)
|
||||
}
|
||||
}
|
||||
|
||||
val now = ZonedDateTime.now().withZoneSameInstant(ZoneId.systemDefault())
|
||||
if (nextDueDate.isBefore(now)) {
|
||||
nextDueDate = nextDueDate.plusWeeks(everyX.toLong())
|
||||
while (!nextDueDate.matchesRepeatDays(repeatDays)) {
|
||||
nextDueDate = nextDueDate.plusDays(1)
|
||||
}
|
||||
}
|
||||
|
||||
dateTimeOccurenceToSchedule = nextDueDate
|
||||
var nextDueDate = dateTimeOccurenceToSchedule.withHour(reminderTime.hour).withMinute(reminderTime.minute)
|
||||
while (!nextDueDate.matchesRepeatDays(repeatDays)) {
|
||||
nextDueDate = nextDueDate.plusDays(1).withHour(reminderTime.hour).withMinute(reminderTime.minute)
|
||||
}
|
||||
// Calculate weeks since start and adjust for the correct interval
|
||||
val weeksSinceStart = ChronoUnit.WEEKS.between(startDate.toLocalDate(), nextDueDate.toLocalDate())
|
||||
if (weeksSinceStart % everyX != 0L) {
|
||||
val weeksToNextValidInterval = everyX - (weeksSinceStart % everyX)
|
||||
nextDueDate = nextDueDate.plusWeeks(weeksToNextValidInterval)
|
||||
// Find the exact next due day within the valid interval
|
||||
while (!nextDueDate.matchesRepeatDays(repeatDays)) {
|
||||
nextDueDate = nextDueDate.plusDays(1).withHour(reminderTime.hour).withMinute(reminderTime.minute)
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure the next due date is in the future
|
||||
val now = ZonedDateTime.now().withZoneSameInstant(ZoneId.systemDefault())
|
||||
if (nextDueDate.isBefore(now)) {
|
||||
nextDueDate = nextDueDate.plusWeeks(everyX.toLong())
|
||||
// Find the next due day in the future
|
||||
while (!nextDueDate.matchesRepeatDays(repeatDays)) {
|
||||
nextDueDate = nextDueDate.plusDays(1).withHour(reminderTime.hour).withMinute(reminderTime.minute)
|
||||
}
|
||||
}
|
||||
|
||||
dateTimeOccurenceToSchedule = nextDueDate
|
||||
}
|
||||
// Set time to the reminder time
|
||||
dateTimeOccurenceToSchedule = dateTimeOccurenceToSchedule.withHour(reminderTime.hour).withMinute(reminderTime.minute)
|
||||
dateTimeOccurenceToSchedule
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue