From 9d57bfde6ff892e052c509b0876d91f31d7ed480 Mon Sep 17 00:00:00 2001 From: Tim Kluge Date: Sun, 8 Dec 2024 11:45:57 +0100 Subject: [PATCH] Add weather data field (shows icon indicating weather conditions) --- README.md | 4 +- .../de/timklge/karoowinddir/Extensions.kt | 10 +-- ...eExtension.kt => KarooWinddirExtension.kt} | 6 +- .../de/timklge/karoowinddir/OpenMeteoData.kt | 22 ++++- .../karoowinddir/datatypes/BaseDataType.kt | 39 +++++++++ .../datatypes/CloudCoverDataType.kt | 2 +- .../datatypes/PrecipitationDataType.kt | 2 +- .../datatypes/RelativeHumidityDataType.kt | 2 +- ...pe.kt => RelativeWindDirectionDataType.kt} | 23 +++--- ...ection.kt => RelativeWindDirectionView.kt} | 0 .../datatypes/SurfacePressureDataType.kt | 2 +- .../karoowinddir/datatypes/WeatherDataType.kt | 77 +++++++++++++++--- .../karoowinddir/datatypes/WeatherView.kt | 75 +++++++++++++++++ .../datatypes/WindDirectionDataType.kt | 7 +- .../datatypes/WindGustsDataType.kt | 2 +- .../datatypes/WindSpeedDataType.kt | 2 +- app/src/main/res/drawable/bx_clear.png | Bin 0 -> 11829 bytes app/src/main/res/drawable/bx_cloud.png | Bin 0 -> 12252 bytes .../main/res/drawable/bx_cloud_drizzle.png | Bin 0 -> 12793 bytes .../main/res/drawable/bx_cloud_light_rain.png | Bin 0 -> 12788 bytes .../main/res/drawable/bx_cloud_lightning.png | Bin 0 -> 14002 bytes app/src/main/res/drawable/bx_cloud_rain.png | Bin 0 -> 12792 bytes app/src/main/res/drawable/bx_cloud_snow.png | Bin 0 -> 14223 bytes .../drawable/question_mark_regular_240.png | Bin 0 -> 8659 bytes app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/extension_info.xml | 7 ++ 26 files changed, 239 insertions(+), 47 deletions(-) rename app/src/main/kotlin/de/timklge/karoowinddir/{KarooWindroseExtension.kt => KarooWinddirExtension.kt} (95%) create mode 100644 app/src/main/kotlin/de/timklge/karoowinddir/datatypes/BaseDataType.kt rename app/src/main/kotlin/de/timklge/karoowinddir/datatypes/{WindroseDataType.kt => RelativeWindDirectionDataType.kt} (85%) rename app/src/main/kotlin/de/timklge/karoowinddir/datatypes/{RelativeWindDirection.kt => RelativeWindDirectionView.kt} (100%) create mode 100644 app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherView.kt create mode 100644 app/src/main/res/drawable/bx_clear.png create mode 100644 app/src/main/res/drawable/bx_cloud.png create mode 100644 app/src/main/res/drawable/bx_cloud_drizzle.png create mode 100644 app/src/main/res/drawable/bx_cloud_light_rain.png create mode 100644 app/src/main/res/drawable/bx_cloud_lightning.png create mode 100644 app/src/main/res/drawable/bx_cloud_rain.png create mode 100644 app/src/main/res/drawable/bx_cloud_snow.png create mode 100644 app/src/main/res/drawable/question_mark_regular_240.png diff --git a/README.md b/README.md index be04670..cd5d76d 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,11 @@ Currently, Hammerhead has not yet released an on-device app store for easy insta After installing this app on your Karoo, you can add a data field showing the relative wind direction or one of the auxiliary fields to your data pages. The relative wind direction will be shown as an arrow image, with an optional overlay of the wind speed in your chosen unit of measurement (default is kilometers per hour). -The app will automatically attempt to download weather data for your current approximate location from the [open-meteo.com](https://open-meteo.com) API once your device has acquired a GPS fix. The API service is free for non-commercial use. Your location is rounded to approximately two kilometers to maintain privacy. The data is updated when you ride more than two kilometers from the location where the weather data was downloaded or after one hour at the latest. If the app cannot connect to the weather service, it will retry the download every minute. Downloading weather data should work on Karoo 2 if you have a SIM card inserted or on Karoo 3 via the companion app. +The app will automatically attempt to download weather data for your current approximate location from the [open-meteo.com](https://open-meteo.com) API once your device has acquired a GPS fix. The API service is free for non-commercial use. Your location is rounded to approximately two kilometers to maintain privacy. The data is updated when you ride more than two kilometers from the location where the weather data was downloaded or after one hour at the latest. If the app cannot connect to the weather service, it will retry the download every minute. Downloading weather data should work on Karoo 2 if you have a SIM card inserted or on Karoo 3 via your phone's internet connection if you have the Karoo companion app installed. ## Credits -- Icons are from [boxicons.com](https://boxicons.com) (MIT-licensed). +- Icons are from [boxicons.com](https://boxicons.com) (MIT-licensed) - Made possible by the generous usage terms of [open-meteo.com](https://open-meteo.com) ## Links diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/Extensions.kt b/app/src/main/kotlin/de/timklge/karoowinddir/Extensions.kt index 25780ae..536d6b3 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/Extensions.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/Extensions.kt @@ -80,7 +80,7 @@ fun Context.streamCurrentWeatherData(): Flow { Log.e(KarooWinddirExtension.TAG, "Failed to read preferences", e) null } - }.filterNotNull().distinctUntilChanged().filter { it.current.time * 1000 >= System.currentTimeMillis() - (1000 * 60 * 60 * 3) } + }.filterNotNull().distinctUntilChanged().filter { it.current.time * 1000 >= System.currentTimeMillis() - (1000 * 60 * 60 * 12) } } fun Context.streamSettings(): Flow { @@ -112,8 +112,8 @@ fun Context.streamStats(): Flow { @OptIn(FlowPreview::class) suspend fun KarooSystemService.makeOpenMeteoHttpRequest(gpsCoordinates: GpsCoordinates, settings: WinddirSettings): HttpResponseState.Complete { return callbackFlow { - // https://open-meteo.com/en/docs#current=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,cloud_cover,wind_speed_10m,wind_direction_10m,wind_gusts_10m&hourly=&daily=&location_mode=csv_coordinates&timeformat=unixtime&forecast_days=3 - val url = "https://api.open-meteo.com/v1/forecast?latitude=${gpsCoordinates.lat}&longitude=${gpsCoordinates.lon}¤t=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,cloud_cover,wind_speed_10m,wind_direction_10m,wind_gusts_10m,surface_pressure&timeformat=unixtime&wind_speed_unit=${settings.windUnit.id}&precipitation_unit=${settings.precipitationUnit.id}" + // https://open-meteo.com/en/docs#current=temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,cloud_cover,wind_speed_10m,wind_direction_10m,wind_gusts_10m&hourly=&daily=&location_mode=csv_coordinates&timeformat=unixtime&forecast_days=3 + val url = "https://api.open-meteo.com/v1/forecast?latitude=${gpsCoordinates.lat}&longitude=${gpsCoordinates.lon}¤t=weather_code,temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,cloud_cover,wind_speed_10m,wind_direction_10m,wind_gusts_10m,surface_pressure&timeformat=unixtime&wind_speed_unit=${settings.windUnit.id}&precipitation_unit=${settings.precipitationUnit.id}" Log.d(KarooWinddirExtension.TAG, "Http request to ${url}...") @@ -143,7 +143,7 @@ suspend fun KarooSystemService.makeOpenMeteoHttpRequest(gpsCoordinates: GpsCoord } fun KarooSystemService.getHeadingFlow(): Flow { - // return flowOf(2) + return flowOf(2) return streamDataFlow(DataType.Type.HEADING) .mapNotNull { (it as? StreamState.Streaming)?.dataPoint?.singleValue } @@ -153,7 +153,7 @@ fun KarooSystemService.getHeadingFlow(): Flow { @OptIn(FlowPreview::class) fun KarooSystemService.getGpsCoordinateFlow(): Flow { - // return flowOf(GpsCoordinates(52.5164069,13.3784)) + return flowOf(GpsCoordinates(52.5164069,13.3784)) return streamDataFlow("TYPE_LOCATION_ID") .mapNotNull { (it as? StreamState.Streaming)?.dataPoint?.values } diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/KarooWindroseExtension.kt b/app/src/main/kotlin/de/timklge/karoowinddir/KarooWinddirExtension.kt similarity index 95% rename from app/src/main/kotlin/de/timklge/karoowinddir/KarooWindroseExtension.kt rename to app/src/main/kotlin/de/timklge/karoowinddir/KarooWinddirExtension.kt index cd950c7..ee8e369 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/KarooWindroseExtension.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/KarooWinddirExtension.kt @@ -9,7 +9,8 @@ import de.timklge.karoowinddir.datatypes.SurfacePressureDataType import de.timklge.karoowinddir.datatypes.WindDirectionDataType import de.timklge.karoowinddir.datatypes.WindGustsDataType import de.timklge.karoowinddir.datatypes.WindSpeedDataType -import de.timklge.karoowinddir.datatypes.WinddirDataType +import de.timklge.karoowinddir.datatypes.RelativeWindDirectionDataType +import de.timklge.karoowinddir.datatypes.WeatherDataType import de.timklge.karoowinddir.screens.WinddirStats import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.extension.KarooExtension @@ -39,7 +40,8 @@ class KarooWinddirExtension : KarooExtension("karoo-winddir", "1.0.0-beta1") { override val types by lazy { listOf( - WinddirDataType(karooSystem, applicationContext), + RelativeWindDirectionDataType(karooSystem, applicationContext), + WeatherDataType(karooSystem, applicationContext), RelativeHumidityDataType(applicationContext), CloudCoverDataType(applicationContext), WindSpeedDataType(applicationContext), diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/OpenMeteoData.kt b/app/src/main/kotlin/de/timklge/karoowinddir/OpenMeteoData.kt index be01dff..ffbd148 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/OpenMeteoData.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/OpenMeteoData.kt @@ -13,9 +13,29 @@ data class OpenMeteoData( @SerialName("surface_pressure") val surfacePressure: Double, @SerialName("wind_speed_10m") val windSpeed: Double, @SerialName("wind_direction_10m") val windDirection: Double, - @SerialName("wind_gusts_10m") val windGusts: Double + @SerialName("wind_gusts_10m") val windGusts: Double, + @SerialName("weather_code") val weatherCode: Int, ) +enum class WeatherInterpretation { + CLEAR, CLOUDY, RAINY, SNOWY, DRIZZLE, THUNDERSTORM, UNKNOWN; + + companion object { + // WMO weather interpretation codes (WW) + fun fromWeatherCode(code: Int): WeatherInterpretation { + return when(code){ + 0 -> CLEAR + 1, 2, 3 -> CLOUDY + 45, 48, 61, 63, 65, 66, 67, 80, 81, 82 -> RAINY + 71, 73, 75, 77, 85, 86 -> SNOWY + 51, 53, 55, 56, 57 -> DRIZZLE + 95, 96, 99 -> THUNDERSTORM + else -> UNKNOWN + } + } + } +} + @Serializable data class OpenMeteoCurrentWeatherResponse( val current: OpenMeteoData, diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/BaseDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/BaseDataType.kt new file mode 100644 index 0000000..2b67915 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/BaseDataType.kt @@ -0,0 +1,39 @@ +package de.timklge.karoowinddir.datatypes + +import android.content.Context +import android.util.Log +import de.timklge.karoowinddir.KarooWinddirExtension +import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse +import de.timklge.karoowinddir.streamCurrentWeatherData +import io.hammerhead.karooext.extension.DataTypeImpl +import io.hammerhead.karooext.internal.Emitter +import io.hammerhead.karooext.models.DataPoint +import io.hammerhead.karooext.models.DataType +import io.hammerhead.karooext.models.StreamState +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +abstract class BaseDataType( + private val applicationContext: Context, + dataTypeId: String +) : DataTypeImpl("karoo-winddir", dataTypeId) { + abstract fun getValue(data: OpenMeteoCurrentWeatherResponse): Double + + override fun startStream(emitter: Emitter) { + Log.d(KarooWinddirExtension.TAG, "start $dataTypeId stream") + val job = CoroutineScope(Dispatchers.IO).launch { + val currentWeatherData = applicationContext.streamCurrentWeatherData() + + currentWeatherData.collect { data -> + val value = getValue(data) + Log.d(KarooWinddirExtension.TAG, "$dataTypeId: $value") + emitter.onNext(StreamState.Streaming(DataPoint(dataTypeId, mapOf(DataType.Field.SINGLE to value)))) + } + } + emitter.setCancellable { + Log.d(KarooWinddirExtension.TAG, "stop $dataTypeId stream") + job.cancel() + } + } +} diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/CloudCoverDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/CloudCoverDataType.kt index 380efdb..9139a73 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/CloudCoverDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/CloudCoverDataType.kt @@ -3,7 +3,7 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse -class CloudCoverDataType(context: Context) : WeatherDataType(context, "cloudCover"){ +class CloudCoverDataType(context: Context) : BaseDataType(context, "cloudCover"){ override fun getValue(data: OpenMeteoCurrentWeatherResponse): Double { return data.current.cloudCover.toDouble() } diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/PrecipitationDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/PrecipitationDataType.kt index 5320913..af27566 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/PrecipitationDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/PrecipitationDataType.kt @@ -3,7 +3,7 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse -class PrecipitationDataType(context: Context) : WeatherDataType(context, "precipitation"){ +class PrecipitationDataType(context: Context) : BaseDataType(context, "precipitation"){ override fun getValue(data: OpenMeteoCurrentWeatherResponse): Double { return data.current.precipitation } diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeHumidityDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeHumidityDataType.kt index 5d55fd6..e6c7642 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeHumidityDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeHumidityDataType.kt @@ -3,7 +3,7 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse -class RelativeHumidityDataType(context: Context) : WeatherDataType(context, "relativeHumidity"){ +class RelativeHumidityDataType(context: Context) : BaseDataType(context, "relativeHumidity"){ override fun getValue(data: OpenMeteoCurrentWeatherResponse): Double { return data.current.relativeHumidity.toDouble() } diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindroseDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeWindDirectionDataType.kt similarity index 85% rename from app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindroseDataType.kt rename to app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeWindDirectionDataType.kt index 6cdbc4c..d8a7b95 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindroseDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeWindDirectionDataType.kt @@ -1,7 +1,7 @@ package de.timklge.karoowinddir.datatypes -import android.util.Log import android.content.Context +import android.util.Log import androidx.compose.ui.unit.DpSize import androidx.glance.appwidget.ExperimentalGlanceRemoteViewsApi import androidx.glance.appwidget.GlanceRemoteViews @@ -23,7 +23,6 @@ import io.hammerhead.karooext.models.UpdateGraphicConfig import io.hammerhead.karooext.models.ViewConfig import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ObsoleteCoroutinesApi import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter @@ -31,10 +30,11 @@ import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.launch import kotlin.math.abs +import kotlin.math.cos import kotlin.math.roundToInt @OptIn(ExperimentalGlanceRemoteViewsApi::class) -class WinddirDataType( +class RelativeWindDirectionDataType( private val karooSystem: KarooSystemService, private val applicationContext: Context ) : DataTypeImpl("karoo-winddir", "winddir") { @@ -59,7 +59,6 @@ class WinddirDataType( } override fun startStream(emitter: Emitter) { - Log.d(KarooWinddirExtension.TAG, "start winddir stream") val job = CoroutineScope(Dispatchers.IO).launch { val currentWeatherData = applicationContext.streamCurrentWeatherData() @@ -72,19 +71,17 @@ class WinddirDataType( val windBearing = data.current.windDirection + 180 val diff = (signedAngleDifference(bearing, windBearing) + 360) % 360 - Log.d(KarooWinddirExtension.TAG, "wind bearing: $bearing vs $windBearing => $diff") + Log.d(KarooWinddirExtension.TAG, "Wind bearing: $bearing vs $windBearing => $diff") emitter.onNext(StreamState.Streaming(DataPoint(dataTypeId, mapOf(DataType.Field.SINGLE to diff)))) } } emitter.setCancellable { - Log.d(KarooWinddirExtension.TAG, "stop winddir stream") job.cancel() } } - @OptIn(ObsoleteCoroutinesApi::class) override fun startView(context: Context, config: ViewConfig, emitter: ViewEmitter) { - Log.d(KarooWinddirExtension.TAG, "Starting winddir view with $emitter") + Log.d(KarooWinddirExtension.TAG, "Starting relative wind direction view with $emitter") val configJob = CoroutineScope(Dispatchers.IO).launch { emitter.onNext(UpdateGraphicConfig(showHeader = false)) awaitCancellation() @@ -98,15 +95,19 @@ class WinddirDataType( .combine(context.streamCurrentWeatherData()) { value, data -> value to data } .combine(context.streamSettings()) { (value, data), settings -> StreamData(value, data, settings) } .onCompletion { + // Clear view on completion val result = glance.compose(context, DpSize.Unspecified) { } emitter.updateView(result.remoteViews) } .collect { streamData -> - Log.d(KarooWinddirExtension.TAG, "Updating view") - val windSpeedText = if(streamData.settings.showWindspeedOverlay) "${streamData.data.current.windSpeed.roundToInt()}" else null + Log.d(KarooWinddirExtension.TAG, "Updating relative wind direction view") + val windSpeed = streamData.data.current.windSpeed + val windDirection = streamData.value + val headwindSpeed = cos( (windDirection + 180) * Math.PI / 180.0) * windSpeed + val windSpeedText = if(streamData.settings.showWindspeedOverlay) "${headwindSpeed.roundToInt()}" else null val result = glance.compose(context, DpSize.Unspecified) { - RelativeWindDirection(streamData.value.roundToInt(), config.textSize, windSpeedText) + RelativeWindDirection(windDirection.roundToInt(), config.textSize, windSpeedText) } emitter.updateView(result.remoteViews) diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeWindDirection.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeWindDirectionView.kt similarity index 100% rename from app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeWindDirection.kt rename to app/src/main/kotlin/de/timklge/karoowinddir/datatypes/RelativeWindDirectionView.kt diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/SurfacePressureDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/SurfacePressureDataType.kt index 4f8a932..e8c3a11 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/SurfacePressureDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/SurfacePressureDataType.kt @@ -3,7 +3,7 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse -class SurfacePressureDataType(context: Context) : WeatherDataType(context, "surfacePressure"){ +class SurfacePressureDataType(context: Context) : BaseDataType(context, "surfacePressure"){ override fun getValue(data: OpenMeteoCurrentWeatherResponse): Double { return data.current.surfacePressure } diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherDataType.kt index b5b8f81..d0c3247 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherDataType.kt @@ -2,38 +2,89 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import android.util.Log +import androidx.compose.ui.unit.DpSize +import androidx.glance.appwidget.ExperimentalGlanceRemoteViewsApi +import androidx.glance.appwidget.GlanceRemoteViews import de.timklge.karoowinddir.KarooWinddirExtension import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse +import de.timklge.karoowinddir.WeatherInterpretation +import de.timklge.karoowinddir.getHeadingFlow +import de.timklge.karoowinddir.screens.WinddirSettings import de.timklge.karoowinddir.streamCurrentWeatherData +import de.timklge.karoowinddir.streamSettings +import io.hammerhead.karooext.KarooSystemService import io.hammerhead.karooext.extension.DataTypeImpl import io.hammerhead.karooext.internal.Emitter +import io.hammerhead.karooext.internal.ViewEmitter import io.hammerhead.karooext.models.DataPoint import io.hammerhead.karooext.models.DataType import io.hammerhead.karooext.models.StreamState +import io.hammerhead.karooext.models.UpdateGraphicConfig +import io.hammerhead.karooext.models.ViewConfig import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.launch +import kotlin.math.roundToInt -abstract class WeatherDataType( - private val applicationContext: Context, - dataTypeId: String -) : DataTypeImpl("karoo-winddir", dataTypeId) { - abstract fun getValue(data: OpenMeteoCurrentWeatherResponse): Double +@OptIn(ExperimentalGlanceRemoteViewsApi::class) +class WeatherDataType( + private val karooSystem: KarooSystemService, + private val applicationContext: Context +) : DataTypeImpl("karoo-winddir", "weather") { + private val glance = GlanceRemoteViews() + // FIXME: Remove. Currently, the data field will permanently show "no sensor" if no data stream is provided override fun startStream(emitter: Emitter) { - Log.d(KarooWinddirExtension.TAG, "start $dataTypeId stream") val job = CoroutineScope(Dispatchers.IO).launch { val currentWeatherData = applicationContext.streamCurrentWeatherData() - currentWeatherData.collect { data -> - val value = getValue(data) - Log.d(KarooWinddirExtension.TAG, "$dataTypeId: $value") - emitter.onNext(StreamState.Streaming(DataPoint(dataTypeId, mapOf(DataType.Field.SINGLE to value)))) - } + currentWeatherData + .collect { data -> + Log.d(KarooWinddirExtension.TAG, "Wind code: ${data.current.weatherCode}") + emitter.onNext(StreamState.Streaming(DataPoint(dataTypeId, mapOf(DataType.Field.SINGLE to data.current.weatherCode.toDouble())))) + } } emitter.setCancellable { - Log.d(KarooWinddirExtension.TAG, "stop $dataTypeId stream") job.cancel() } } -} + + override fun startView(context: Context, config: ViewConfig, emitter: ViewEmitter) { + Log.d(KarooWinddirExtension.TAG, "Starting weather view with $emitter") + val configJob = CoroutineScope(Dispatchers.IO).launch { + emitter.onNext(UpdateGraphicConfig(showHeader = false)) + awaitCancellation() + } + + data class StreamData(val data: OpenMeteoCurrentWeatherResponse, val settings: WinddirSettings) + + val viewJob = CoroutineScope(Dispatchers.IO).launch { + context.streamCurrentWeatherData() + .combine(context.streamSettings()) { data, settings -> StreamData(data, settings) } + .onCompletion { + // Clear view on completion + val result = glance.compose(context, DpSize.Unspecified) { } + emitter.updateView(result.remoteViews) + } + .collect { (data, settings) -> + Log.d(KarooWinddirExtension.TAG, "Updating weather view") + val interpretation = WeatherInterpretation.fromWeatherCode(data.current.weatherCode) + + val result = glance.compose(context, DpSize.Unspecified) { + Weather(interpretation, data.current.windDirection.roundToInt(), data.current.windSpeed.roundToInt(), data.current.windGusts.roundToInt()) + } + + emitter.updateView(result.remoteViews) + } + } + emitter.setCancellable { + Log.d(KarooWinddirExtension.TAG, "Stopping winddir view with $emitter") + configJob.cancel() + viewJob.cancel() + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherView.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherView.kt new file mode 100644 index 0000000..fc94026 --- /dev/null +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WeatherView.kt @@ -0,0 +1,75 @@ +package de.timklge.karoowinddir.datatypes + +import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.TextUnitType +import androidx.compose.ui.unit.dp +import androidx.glance.ColorFilter +import androidx.glance.GlanceModifier +import androidx.glance.Image +import androidx.glance.ImageProvider +import androidx.glance.color.ColorProvider +import androidx.glance.layout.Alignment +import androidx.glance.layout.Column +import androidx.glance.layout.ContentScale +import androidx.glance.layout.Row +import androidx.glance.layout.fillMaxSize +import androidx.glance.layout.fillMaxWidth +import androidx.glance.layout.height +import androidx.glance.layout.padding +import androidx.glance.layout.width +import androidx.glance.preview.ExperimentalGlancePreviewApi +import androidx.glance.preview.Preview +import androidx.glance.text.FontFamily +import androidx.glance.text.Text +import androidx.glance.text.TextStyle +import de.timklge.karoowinddir.R +import de.timklge.karoowinddir.WeatherInterpretation +import de.timklge.karoowinddir.screens.WinddirSettings + +fun getWeatherIcon(interpretation: WeatherInterpretation): Int { + return when (interpretation){ + WeatherInterpretation.CLEAR -> R.drawable.bx_clear + WeatherInterpretation.CLOUDY -> R.drawable.bx_cloud + WeatherInterpretation.RAINY -> R.drawable.bx_cloud_rain + WeatherInterpretation.SNOWY -> R.drawable.bx_cloud_snow + WeatherInterpretation.DRIZZLE -> R.drawable.bx_cloud_drizzle + WeatherInterpretation.THUNDERSTORM -> R.drawable.bx_cloud_lightning + WeatherInterpretation.UNKNOWN -> R.drawable.question_mark_regular_240 + } +} + +@OptIn(ExperimentalGlancePreviewApi::class) +@Preview(widthDp = 200, heightDp = 150) +@Composable +fun Weather(current: WeatherInterpretation, windBearing: Int, windSpeed: Int, windGusts: Int) { + Column(modifier = GlanceModifier.fillMaxSize(), horizontalAlignment = Alignment.End) { + Row(modifier = GlanceModifier.defaultWeight(), horizontalAlignment = Alignment.End) { + val imageW = 70 + val imageH = (imageW * (280.0 / 400)).toInt() + Image( + modifier = GlanceModifier.height(imageH.dp).width(imageW.dp), + provider = ImageProvider(getWeatherIcon(current)), + contentDescription = "Current weather information", + contentScale = ContentScale.FillBounds, + colorFilter = ColorFilter.tint(ColorProvider(Color.Black, Color.White)) + ) + } + + Row(horizontalAlignment = Alignment.CenterHorizontally, verticalAlignment = Alignment.CenterVertically) { + Image( + modifier = GlanceModifier.height(20.dp).width(12.dp), + provider = ImageProvider(getArrowResourceByBearing(windBearing)), + contentDescription = "Current wind direction", + contentScale = ContentScale.Fit, + colorFilter = ColorFilter.tint(ColorProvider(Color.Black, Color.White)) + ) + + Text( + text = "$windSpeed,$windGusts", + style = TextStyle(color = ColorProvider(Color.Black, Color.White), fontFamily = FontFamily.Monospace, fontSize = TextUnit(18f, TextUnitType.Sp)) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindDirectionDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindDirectionDataType.kt index 2807712..cbe125e 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindDirectionDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindDirectionDataType.kt @@ -3,22 +3,17 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import android.util.Log import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnitType -import androidx.compose.ui.unit.dp import androidx.glance.GlanceModifier import androidx.glance.appwidget.ExperimentalGlanceRemoteViewsApi import androidx.glance.appwidget.GlanceRemoteViews -import androidx.glance.background import androidx.glance.color.ColorProvider import androidx.glance.layout.Alignment import androidx.glance.layout.Box import androidx.glance.layout.fillMaxSize -import androidx.glance.layout.padding import androidx.glance.text.FontFamily -import androidx.glance.text.FontStyle import androidx.glance.text.Text import androidx.glance.text.TextStyle import de.timklge.karoowinddir.KarooWinddirExtension @@ -36,7 +31,7 @@ import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.launch import kotlin.math.roundToInt -class WindDirectionDataType(val karooSystem: KarooSystemService, context: Context) : WeatherDataType(context, "windDirection"){ +class WindDirectionDataType(val karooSystem: KarooSystemService, context: Context) : BaseDataType(context, "windDirection"){ @OptIn(ExperimentalGlanceRemoteViewsApi::class) private val glance = GlanceRemoteViews() diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindGustsDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindGustsDataType.kt index f42b60e..c61cf39 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindGustsDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindGustsDataType.kt @@ -3,7 +3,7 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse -class WindGustsDataType(context: Context) : WeatherDataType(context, "windGusts"){ +class WindGustsDataType(context: Context) : BaseDataType(context, "windGusts"){ override fun getValue(data: OpenMeteoCurrentWeatherResponse): Double { return data.current.windGusts } diff --git a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindSpeedDataType.kt b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindSpeedDataType.kt index c100807..ce6f4c9 100644 --- a/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindSpeedDataType.kt +++ b/app/src/main/kotlin/de/timklge/karoowinddir/datatypes/WindSpeedDataType.kt @@ -3,7 +3,7 @@ package de.timklge.karoowinddir.datatypes import android.content.Context import de.timklge.karoowinddir.OpenMeteoCurrentWeatherResponse -class WindSpeedDataType(context: Context) : WeatherDataType(context, "windSpeed"){ +class WindSpeedDataType(context: Context) : BaseDataType(context, "windSpeed"){ override fun getValue(data: OpenMeteoCurrentWeatherResponse): Double { return data.current.windSpeed } diff --git a/app/src/main/res/drawable/bx_clear.png b/app/src/main/res/drawable/bx_clear.png new file mode 100644 index 0000000000000000000000000000000000000000..b678517184ee4ca1229e947e30f7ee07b4b954a6 GIT binary patch literal 11829 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 MW9fjbHup{WKf8M9EdT%j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bx_cloud_drizzle.png b/app/src/main/res/drawable/bx_cloud_drizzle.png new file mode 100644 index 0000000000000000000000000000000000000000..85473c0364e2f8956c32cfefad26417b76c69a74 GIT binary patch literal 12793 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%0D32>3=Xc$aVxN2S<@s-pH* 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 Cee$mW literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bx_cloud_lightning.png b/app/src/main/res/drawable/bx_cloud_lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..c3aed00a8bebfaf4821eff01d579939963149ffc GIT binary patch literal 14002 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 Xh_Hue{~U1e3}m2din^)o68C=qnNY(N literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bx_cloud_rain.png b/app/src/main/res/drawable/bx_cloud_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..37741b23c854c75be8790287062c0255011ba665 GIT binary patch literal 12792 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bx_cloud_snow.png b/app/src/main/res/drawable/bx_cloud_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..947dab520eee80d17dcffe5a7f14cda611395adc GIT binary patch literal 14223 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 - Winddir + WindDir winddir Wind direction Current wind direction relative to the riding direction @@ -17,4 +17,6 @@ Current precipitation (rainfall / snowfall) Surface pressure Atmospheric pressure at surface in configured unit + Weather + Current weather conditions \ No newline at end of file diff --git a/app/src/main/res/xml/extension_info.xml b/app/src/main/res/xml/extension_info.xml index a587ff5..98dfb02 100644 --- a/app/src/main/res/xml/extension_info.xml +++ b/app/src/main/res/xml/extension_info.xml @@ -11,6 +11,13 @@ icon="@drawable/ic_launcher" typeId="winddir" /> + +