Only fire interval reminders in riding state (#45)

* Only fire interval reminders in riding state

* Update release notes
This commit is contained in:
timklge 2025-03-20 17:18:14 +01:00 committed by GitHub
parent c8d77009fb
commit f6085b09fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 15 additions and 13 deletions

View File

@ -71,9 +71,9 @@ tasks.register("generateManifest") {
"latestVersionCode" to android.defaultConfig.versionCode, "latestVersionCode" to android.defaultConfig.versionCode,
"developer" to "timklge", "developer" to "timklge",
"description" to "Shows in-ride alerts after a given time interval, distance or HR / power / speed / cadence out of range", "description" to "Shows in-ride alerts after a given time interval, distance or HR / power / speed / cadence out of range",
"releaseNotes" to "* Use imperial units for temperature and tire pressure if selected\n" + "releaseNotes" to "* Only show reminders while riding\n" +
"* Add additional trigger types for ambient and CORE temperature, gradient and tire pressure\n" + "* Limit reminder title length in list\n" +
"* Add additional beep patterns for Karoo 3" "* Use imperial units for temperature and tire pressure if selected\n"
) )
val gson = groovy.json.JsonBuilder(manifest).toPrettyString() val gson = groovy.json.JsonBuilder(manifest).toPrettyString()

View File

@ -13,6 +13,7 @@ import io.hammerhead.karooext.models.DataType
import io.hammerhead.karooext.models.HardwareType import io.hammerhead.karooext.models.HardwareType
import io.hammerhead.karooext.models.InRideAlert import io.hammerhead.karooext.models.InRideAlert
import io.hammerhead.karooext.models.PlayBeepPattern import io.hammerhead.karooext.models.PlayBeepPattern
import io.hammerhead.karooext.models.RideState
import io.hammerhead.karooext.models.StreamState import io.hammerhead.karooext.models.StreamState
import io.hammerhead.karooext.models.TurnScreenOn import io.hammerhead.karooext.models.TurnScreenOn
import io.hammerhead.karooext.models.UserProfile import io.hammerhead.karooext.models.UserProfile
@ -277,8 +278,6 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS
} }
} }
data class StreamData(val value: Double, val reminders: MutableList<Reminder>? = null, val distanceImperial: Boolean = false, val temperatureImperial: Boolean = false)
private fun startRangeExceededJob(triggerType: ReminderTrigger): Job { private fun startRangeExceededJob(triggerType: ReminderTrigger): Job {
return CoroutineScope(Dispatchers.IO).launch { return CoroutineScope(Dispatchers.IO).launch {
val preferences = applicationContext.dataStore.data.map { remindersJson -> val preferences = applicationContext.dataStore.data.map { remindersJson ->
@ -306,7 +305,7 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS
ReminderTrigger.DISTANCE, ReminderTrigger.ELAPSED_TIME, ReminderTrigger.ENERGY_OUTPUT -> error("Unsupported trigger type: $triggerType") ReminderTrigger.DISTANCE, ReminderTrigger.ELAPSED_TIME, ReminderTrigger.ENERGY_OUTPUT -> error("Unsupported trigger type: $triggerType")
} }
karooSystem.streamDataFlow(dataType) val valueStream = karooSystem.streamDataFlow(dataType)
.mapNotNull { .mapNotNull {
val dataPoint = (it as? StreamState.Streaming)?.dataPoint val dataPoint = (it as? StreamState.Streaming)?.dataPoint
@ -326,12 +325,15 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS
} }
} }
.filter { it != 0.0 } .filter { it != 0.0 }
.combine(preferences) { value, reminders -> StreamData(value, reminders) }
.combine(karooSystem.streamUserProfile()) { streamData, profile -> streamData.copy( data class StreamData(val value: Double, val reminders: MutableList<Reminder>, val distanceImperial: Boolean, val temperatureImperial: Boolean, val rideState: RideState)
distanceImperial = profile.preferredUnit.distance == UserProfile.PreferredUnit.UnitType.IMPERIAL,
temperatureImperial = profile.preferredUnit.temperature == UserProfile.PreferredUnit.UnitType.IMPERIAL combine(valueStream, preferences, karooSystem.streamUserProfile(), karooSystem.streamRideState()) { value, reminders, profile, rideState ->
) } StreamData(distanceImperial = profile.preferredUnit.distance == UserProfile.PreferredUnit.UnitType.IMPERIAL, temperatureImperial = profile.preferredUnit.temperature == UserProfile.PreferredUnit.UnitType.IMPERIAL,
.let { value = value, reminders = reminders, rideState = rideState)
}.filter {
it.rideState is RideState.Recording
}.let {
@Suppress("KotlinConstantConditions") @Suppress("KotlinConstantConditions")
when (triggerType){ when (triggerType){
// Tire pressure, gradient and temperature triggers do not require ongoing measurements, as measurement rate is unknown // Tire pressure, gradient and temperature triggers do not require ongoing measurements, as measurement rate is unknown
@ -350,7 +352,7 @@ class KarooReminderExtension : KarooExtension("karoo-reminder", BuildConfig.VERS
} }
} }
.map { (actualValue, reminders, distanceImperial, temperatureImperial) -> .map { (actualValue, reminders, distanceImperial, temperatureImperial) ->
val triggered = reminders?.filter { reminder -> val triggered = reminders.filter { reminder ->
val triggerThreshold = when(triggerType) { val triggerThreshold = when(triggerType) {
ReminderTrigger.SPEED_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.SPEED_LIMIT_MAXIMUM_EXCEEDED -> { ReminderTrigger.SPEED_LIMIT_MINIMUM_EXCEEDED, ReminderTrigger.SPEED_LIMIT_MAXIMUM_EXCEEDED -> {
if (distanceImperial) reminder.interval?.times(0.44704) else reminder.interval?.times(0.277778) if (distanceImperial) reminder.interval?.times(0.44704) else reminder.interval?.times(0.277778)