diff --git a/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt index 10a6c12a..17bb838b 100644 --- a/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt @@ -45,13 +45,7 @@ class MainActivity : SimpleActivity() { updateWidgets() migrateFirstDayOfWeek() - getEnabledAlarms { enabledAlarms -> - if (enabledAlarms.isNullOrEmpty()) { - ensureBackgroundThread { - rescheduleEnabledAlarms() - } - } - } + rescheduleEnabledAlarms() } override fun onResume() { diff --git a/app/src/main/kotlin/org/fossify/clock/extensions/Context.kt b/app/src/main/kotlin/org/fossify/clock/extensions/Context.kt index 8ab7a47b..2ed0fddb 100644 --- a/app/src/main/kotlin/org/fossify/clock/extensions/Context.kt +++ b/app/src/main/kotlin/org/fossify/clock/extensions/Context.kt @@ -14,6 +14,7 @@ import android.os.Looper import android.os.PowerManager import android.text.SpannableString import android.text.style.RelativeSizeSpan +import android.util.Log import android.widget.Toast import androidx.core.app.AlarmManagerCompat import androidx.core.app.NotificationCompat @@ -257,7 +258,7 @@ fun Context.formatTo12HourFormat(showSeconds: Boolean, hours: Int, minutes: Int, fun Context.getClosestEnabledAlarmString(callback: (result: String) -> Unit) { getEnabledAlarms { enabledAlarms -> - if (enabledAlarms.isNullOrEmpty()) { + if (enabledAlarms.isEmpty()) { callback("") return@getEnabledAlarms } @@ -286,7 +287,7 @@ fun Context.getClosestEnabledAlarmString(callback: (result: String) -> Unit) { } } -fun Context.getEnabledAlarms(callback: (result: List?) -> Unit) { +fun Context.getEnabledAlarms(callback: (result: List) -> Unit) { ensureBackgroundThread { val alarms = dbHelper.getEnabledAlarms() Handler(Looper.getMainLooper()).post { @@ -296,9 +297,17 @@ fun Context.getEnabledAlarms(callback: (result: List?) -> Unit) { } fun Context.rescheduleEnabledAlarms() { - dbHelper.getEnabledAlarms().forEach { - if (it.days != TODAY_BIT || it.timeInMinutes > getCurrentDayMinutes()) { - scheduleNextAlarm(it, false) + Log.d("rescheduleEnabledAlarms", "Rescheduling enabled alarms.") + getEnabledAlarms { alarms -> + val now = Calendar.getInstance(); + alarms.forEach { + val nextTime = getTimeOfNextAlarm(it) + val isInFuture = nextTime?.after(now) + Log.d("rescheduleEnabledAlarms", "Alarm: ${it.label}, nextTIme: ${nextTime?.time}, isInFuture: $isInFuture") + if (isInFuture == true) { + Log.d("rescheduleEnabledAlarms", "Scheduling: $it"); + scheduleNextAlarm(it, false) + } } } } diff --git a/app/src/main/kotlin/org/fossify/clock/fragments/AlarmFragment.kt b/app/src/main/kotlin/org/fossify/clock/fragments/AlarmFragment.kt index 6b8c516d..ebef3831 100644 --- a/app/src/main/kotlin/org/fossify/clock/fragments/AlarmFragment.kt +++ b/app/src/main/kotlin/org/fossify/clock/fragments/AlarmFragment.kt @@ -106,7 +106,7 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface { } } context?.getEnabledAlarms { enabledAlarms -> - if (enabledAlarms.isNullOrEmpty()) { + if (enabledAlarms.isEmpty()) { val removedAlarms = mutableListOf() alarms.forEach { if (it.days == TODAY_BIT && it.isEnabled && it.timeInMinutes <= getCurrentDayMinutes()) { @@ -115,6 +115,7 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface { if (it.oneShot) { it.isEnabled = false context?.dbHelper?.deleteAlarms(arrayListOf(it)) + // TODO: Fix race condition. `alarms.removeAll(removedAlarms)` could be called before this removedAlarms.add(it) } else { context?.dbHelper?.updateAlarmEnabledState(it.id, false) diff --git a/app/src/main/kotlin/org/fossify/clock/receivers/AlarmReceiver.kt b/app/src/main/kotlin/org/fossify/clock/receivers/AlarmReceiver.kt index b06459c0..9846ed98 100644 --- a/app/src/main/kotlin/org/fossify/clock/receivers/AlarmReceiver.kt +++ b/app/src/main/kotlin/org/fossify/clock/receivers/AlarmReceiver.kt @@ -23,6 +23,8 @@ import org.fossify.commons.helpers.isOreoPlus class AlarmReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { + Thread(context::rescheduleEnabledAlarms).start() + val id = intent.getIntExtra(ALARM_ID, -1) val alarm = context.dbHelper.getAlarmWithId(id) ?: return