diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/model/domain/weather/Weather.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/model/domain/weather/Weather.kt index 6940ba0bb..91d306092 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/model/domain/weather/Weather.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/model/domain/weather/Weather.kt @@ -102,13 +102,13 @@ data class WeatherDaily( val visibility: Int?, // NOTE: ALWAYS METERS (Minimum) val humidity: Double?, // (Average) val dewPoint: Double?, // (Average) - val sunrise: Long, // NOTE: ALWAYS MILLISECONDS - val sunset: Long, // NOTE: ALWAYS MILLISECONDS - val moonrise: Long, // NOTE: ALWAYS MILLISECONDS - val moonset: Long, // NOTE: ALWAYS MILLISECONDS + val sunrise: Long?, // NOTE: ALWAYS MILLISECONDS + val sunset: Long?, // NOTE: ALWAYS MILLISECONDS + val moonrise: Long?, // NOTE: ALWAYS MILLISECONDS + val moonset: Long?, // NOTE: ALWAYS MILLISECONDS val moonPhase: MoonPhase, - val dawn: Long, - val dusk: Long + val dawn: Long?, + val dusk: Long? ) { fun isWindSpeedValid(): Boolean { @@ -143,4 +143,12 @@ data class WeatherDaily( return pressureMsl != null && pressureMsl != -1.0 } + fun isMoonTimesValid(): Boolean { + return moonrise != null && moonset != null + } + + + fun isSunTimesValid(): Boolean { + return sunrise != null && sunset != null + } } diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/aemet/AemetRepository.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/aemet/AemetRepository.kt index e2ab253ce..62adee461 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/aemet/AemetRepository.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/aemet/AemetRepository.kt @@ -30,7 +30,9 @@ import retrofit2.HttpException import retrofit2.Response import javax.inject.Inject - +/** + * Initial AEMET integration implemented by https://github.com/reveler-hub + */ class AemetRepository @Inject constructor( val dao: LocationsDao, val weatherDao: WeatherDao, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/cwa/CwaRepository.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/cwa/CwaRepository.kt index 48c7446c5..ac71e6925 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/cwa/CwaRepository.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/cwa/CwaRepository.kt @@ -28,6 +28,11 @@ import kotlinx.coroutines.withContext import retrofit2.Response import javax.inject.Inject + +/** + * Initial CWA integration implemented by https://github.com/reveler-hub + */ + // The cached "city key" for this source packs two values CWA needs into one delimited string, // since LocationKeyEntity only has a single cityKey column: "{shortRangeEndpointId}|{townshipName}". private const val CACHE_KEY_DELIMITER = "|" diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/inmet/InmetRepository.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/inmet/InmetRepository.kt index f3926051a..fe5bb3e10 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/inmet/InmetRepository.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/inmet/InmetRepository.kt @@ -41,7 +41,9 @@ import kotlin.math.cos import kotlin.math.sin import kotlin.math.sqrt - +/** + * Initial INMET integration implemented by https://github.com/altendorfme + */ class InmetRepository @Inject constructor( val dao: LocationsDao, val weatherDao: WeatherDao, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/jma/JmaRepository.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/jma/JmaRepository.kt index 4896ea68e..144f8ff2f 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/jma/JmaRepository.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/jma/JmaRepository.kt @@ -35,6 +35,12 @@ import java.time.ZonedDateTime import java.time.format.DateTimeFormatter import javax.inject.Inject + +/** + * Initial JMA integration implemented by https://github.com/reveler-hub + */ + + // The cached "city key" packs three values into one delimited string (LocationKeyEntity only // has a single cityKey column), so a warm-cache read needs zero extra network calls: // "{class10Code}|{officeCode}|{amedasId}". @@ -204,7 +210,8 @@ class JmaRepository @Inject constructor( for (bucket in listOf(boundary, boundary.minusHours(3))) { val path = bucket.format(DateTimeFormatter.ofPattern("yyyyMMdd_HH")) try { - val result = api.getAmedasCurrent(amedasId, path).entries.maxByOrNull { it.key }?.value + val result = + api.getAmedasCurrent(amedasId, path).entries.maxByOrNull { it.key }?.value if (result != null) return result } catch (e: Exception) { // try the previous bucket diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/nws/NwsRepository.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/nws/NwsRepository.kt index 2bcba79a1..8fdeefeff 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/nws/NwsRepository.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/nws/NwsRepository.kt @@ -205,6 +205,10 @@ class NwsRepository @Inject constructor( } } + + /** + * Initial NWS alerts integration implemented by https://github.com/reveler-hub + */ override suspend fun getAlerts( location: Location, isManualRefresh: Boolean, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/pirateweather/PirateWeatherRepository.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/pirateweather/PirateWeatherRepository.kt index 8ccecb43a..c8db97d22 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/pirateweather/PirateWeatherRepository.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/network/sources/weather/pirateweather/PirateWeatherRepository.kt @@ -33,6 +33,10 @@ import kotlinx.coroutines.withContext import java.net.UnknownHostException import javax.inject.Inject +/** + * Initial Pirate Weather integration implemented by https://github.com/altendorfme + */ + class PirateWeatherRepository @Inject constructor( val dao: LocationsDao, val weatherDao: WeatherDao, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/entity/weather/DailyWeatherEntity.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/entity/weather/DailyWeatherEntity.kt index c4d5426de..3a5756381 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/entity/weather/DailyWeatherEntity.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/entity/weather/DailyWeatherEntity.kt @@ -38,11 +38,11 @@ data class DailyWeatherEntity( val visibility: Int?, val humidity: Double?, val dewPoint: Double?, - val sunrise: Long, - val sunset: Long, - val moonrise: Long, - val moonset: Long, + val sunrise: Long?, + val sunset: Long?, + val moonrise: Long?, + val moonset: Long?, val moonPhase: MoonPhase, - val dawn: Long, - val dusk: Long + val dawn: Long?, + val dusk: Long? ) \ No newline at end of file diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/accu/AccuJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/accu/AccuJsonMapper.kt index 68afaea73..33a26e814 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/accu/AccuJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/accu/AccuJsonMapper.kt @@ -128,13 +128,13 @@ fun AccuWeatherBundle.toDomain(location: Location): Weather { visibility = null, humidity = humidity, dewPoint = null, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: -0L, - dusk = sunTimings[index].dusk ?: -0L + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk ) }, ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/aemet/AemetJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/aemet/AemetJsonMapper.kt index 1eb111679..32a86e75e 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/aemet/AemetJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/aemet/AemetJsonMapper.kt @@ -24,6 +24,9 @@ import java.time.LocalDate // AEMET reports wind speed in km/h already, matching this app's canonical unit - no conversion needed. +/** + * Initial AEMET integration implemented by https://github.com/reveler-hub + */ private data class AemetHourPoint( val time: Long, val condition: WeatherCondition, @@ -139,14 +142,14 @@ fun AemetForecastJson.toDomain(location: Location): Weather { visibility = null, humidity = humidityAvg, dewPoint = null, - sunrise = sunTimings.getOrNull(index)?.sunrise ?: 0L, - sunset = sunTimings.getOrNull(index)?.sunset ?: 0L, - moonrise = moonTimings.getOrNull(index)?.moonrise ?: 0L, - moonset = moonTimings.getOrNull(index)?.moonset ?: 0L, + sunrise = sunTimings.getOrNull(index)?.sunrise, + sunset = sunTimings.getOrNull(index)?.sunset, + moonrise = moonTimings.getOrNull(index)?.moonrise, + moonset = moonTimings.getOrNull(index)?.moonset, moonPhase = moonTimings.getOrNull(index)?.phase ?: com.pranshulgg.weather_master_app.core.model.astro.MoonPhase.NEW_MOON, - dawn = sunTimings.getOrNull(index)?.dawn ?: 0L, - dusk = sunTimings.getOrNull(index)?.dusk ?: 0L + dawn = sunTimings.getOrNull(index)?.dawn, + dusk = sunTimings.getOrNull(index)?.dusk ) } ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/bmkg/BmkgJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/bmkg/BmkgJsonMapper.kt index c060a478a..db39cfa69 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/bmkg/BmkgJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/bmkg/BmkgJsonMapper.kt @@ -144,13 +144,13 @@ private fun computeDaily( visibility = visibilityMin?.toInt(), humidity = humidityAvg, dewPoint = null, - sunrise = sunTimings[index].sunrise ?: -1L, - sunset = sunTimings[index].sunset ?: -1L, - moonrise = moonTimings[index].moonrise ?: -1L, - moonset = moonTimings[index].moonset ?: -1L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: -1L, - dusk = sunTimings[index].dusk ?: -1L + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk ) } diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/china/ChinaJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/china/ChinaJsonMapper.kt index f31921306..3c038b77e 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/china/ChinaJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/china/ChinaJsonMapper.kt @@ -121,13 +121,13 @@ fun ChinaForecastJson.toDomain(location: Location): Weather { visibility = null, humidity = null, dewPoint = null, - sunrise = sunTimings[it].sunrise ?: -1L, - sunset = sunTimings[it].sunset ?: -1L, - moonrise = moonTimings[it].moonrise ?: -1L, - moonset = moonTimings[it].moonset ?: -1L, + sunrise = sunTimings[it].sunrise, + sunset = sunTimings[it].sunset, + moonrise = moonTimings[it].moonrise, + moonset = moonTimings[it].moonset, moonPhase = moonTimings[it].phase, - dawn = sunTimings[it].dawn ?: -1L, - dusk = sunTimings[it].dusk ?: -1L + dawn = sunTimings[it].dawn, + dusk = sunTimings[it].dusk ) } diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/cwa/CwaJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/cwa/CwaJsonMapper.kt index aea2a3274..41bc242fe 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/cwa/CwaJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/cwa/CwaJsonMapper.kt @@ -22,6 +22,10 @@ import com.pranshulgg.weather_master_app.core.utils.weather.computing.computeDai import com.pranshulgg.weather_master_app.core.utils.weather.forecast.findHourlyIndexForTime import java.time.OffsetDateTime +/** + * Initial CWA integration implemented by https://github.com/reveler-hub + */ + // CWA reports wind speed in m/s - needs converting to this app's canonical km/h. // Temperature is already Celsius. CWA's forecast product has no rain-amount-in-mm field at all // (only probability + a text description), so rain/snowfall are always 0.0/null here, same @@ -144,13 +148,13 @@ fun CwaForecastBundle.toDomain(location: Location): Weather { visibility = null, humidity = humidityAvg, dewPoint = dewPointAvg, - sunrise = sunTimings.getOrNull(index)?.sunrise ?: 0L, - sunset = sunTimings.getOrNull(index)?.sunset ?: 0L, - moonrise = moonTimings.getOrNull(index)?.moonrise ?: 0L, - moonset = moonTimings.getOrNull(index)?.moonset ?: 0L, + sunrise = sunTimings.getOrNull(index)?.sunrise, + sunset = sunTimings.getOrNull(index)?.sunset, + moonrise = moonTimings.getOrNull(index)?.moonrise, + moonset = moonTimings.getOrNull(index)?.moonset, moonPhase = moonTimings.getOrNull(index)?.phase ?: MoonPhase.NEW_MOON, - dawn = sunTimings.getOrNull(index)?.dawn ?: 0L, - dusk = sunTimings.getOrNull(index)?.dusk ?: 0L + dawn = sunTimings.getOrNull(index)?.dawn, + dusk = sunTimings.getOrNull(index)?.dusk ) } ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/dwd/DwdJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/dwd/DwdJsonMapper.kt index 8458ed8c0..4771867c1 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/dwd/DwdJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/dwd/DwdJsonMapper.kt @@ -154,13 +154,13 @@ private fun computeDaily( weatherCondition = condition, time = time, precipitationProbabilityMax = precipitationProbabilityMax, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, humidity = avgHumidity, pressureMsl = avgPressure, visibility = minVisibility.roundToInt(), diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/eccc/EcccJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/eccc/EcccJsonMapper.kt index fed22ffeb..13a9279ae 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/eccc/EcccJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/eccc/EcccJsonMapper.kt @@ -125,13 +125,13 @@ fun EcccWeatherJson.toDomain(location: Location): Weather { time = time, precipitationProbabilityMax = it.precipProbability?.toSafeDouble()?.roundToInt() ?: getMaxPrecipitationProbability(hourly, time), - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, pressureMsl = null, visibility = null, humidity = null, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/fmi/FmiXmlMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/fmi/FmiXmlMapper.kt index f8c1816c2..33553c844 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/fmi/FmiXmlMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/fmi/FmiXmlMapper.kt @@ -262,13 +262,13 @@ private fun computeDaily( weatherCondition = condition, time = dailyIt.key, precipitationProbabilityMax = precipitationProbabilityMax, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, pressureMsl = avgPressure, visibility = minVisibility?.roundToInt(), humidity = avgHumidity, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/gismeteo/GismeteoJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/gismeteo/GismeteoJsonMapper.kt index 61236a7a7..82a9bd82f 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/gismeteo/GismeteoJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/gismeteo/GismeteoJsonMapper.kt @@ -134,13 +134,13 @@ fun GismeteoModel.toDomain(location: Location): Weather { visibility = null, humidity = humidityMin, dewPoint = null, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, ) } diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/imd/ImdJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/imd/ImdJsonMapper.kt index da28f1216..5d6ae2b14 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/imd/ImdJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/imd/ImdJsonMapper.kt @@ -212,13 +212,13 @@ fun ImdForecastModel.toDomain(location: Location): Weather { visibility = null, humidity = humidityAvg, dewPoint = null, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, ) }, ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/inmet/InmetJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/inmet/InmetJsonMapper.kt index 2696b3b3f..a39b39de5 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/inmet/InmetJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/inmet/InmetJsonMapper.kt @@ -25,6 +25,10 @@ import java.time.ZoneId import java.time.format.DateTimeFormatter +/** + * Initial INMET integration implemented by https://github.com/altendorfme + */ + data class InmetWeatherBundle( val forecast: Map>, val hourlyObservations: List? @@ -164,13 +168,13 @@ fun InmetWeatherBundle.toDomain(location: Location): Weather { val sun = sunTimings[index] val moon = moonTimings[index] dailyEntries[index] = day.copy( - sunrise = sun.sunrise ?: -1L, - sunset = sun.sunset ?: -1L, - moonrise = moon.moonrise ?: -1L, - moonset = moon.moonset ?: -1L, + sunrise = sun.sunrise, + sunset = sun.sunset, + moonrise = moon.moonrise, + moonset = moon.moonset, moonPhase = moon.phase, - dawn = sun.dawn ?: -1L, - dusk = sun.dusk ?: -1L + dawn = sun.dawn, + dusk = sun.dusk ) } } diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/ipma/IpmaJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/ipma/IpmaJsonMapper.kt index 779c05011..0e4057979 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/ipma/IpmaJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/ipma/IpmaJsonMapper.kt @@ -119,13 +119,13 @@ fun List.toDomain(location: Location): Weather { visibility = null, humidity = it.humidity.toSafeDouble(), dewPoint = null, - sunrise = sunTimings[index].sunrise ?: -1L, - sunset = sunTimings[index].sunset ?: -1L, - moonrise = moonTimings[index].moonrise ?: -1L, - moonset = moonTimings[index].moonset ?: -1L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: -1L, - dusk = sunTimings[index].dusk ?: -1L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, ) } ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/jma/JmaJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/jma/JmaJsonMapper.kt index 7c854b178..8b0e5242a 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/jma/JmaJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/jma/JmaJsonMapper.kt @@ -21,6 +21,11 @@ import com.pranshulgg.weather_master_app.core.utils.weather.astronomy.getSunTimi import com.pranshulgg.weather_master_app.core.utils.weather.forecast.findHourlyIndexForTime import java.time.OffsetDateTime + +/** + * Initial JMA integration implemented by https://github.com/reveler-hub + */ + // JMA reports wind speed as a level+range in m/s (converted to km/h below) and temperature // already in Celsius. The forecast product has no rain/snow-amount field at all (only // probability), so rain/snowfall are always 0.0/null here, same treatment IPMA/AEMET/CWA use @@ -58,7 +63,8 @@ fun JmaForecastBundle.toDomain(location: Location): Weather { fun popAt(targetMillis: Long): Int? { val index = popTimeDefines.indexOfLast { it <= targetMillis } if (index == -1) return null - val blockEnd = popTimeDefines.getOrNull(index + 1) ?: (popTimeDefines[index] + 6 * 3_600_000L) + val blockEnd = + popTimeDefines.getOrNull(index + 1) ?: (popTimeDefines[index] + 6 * 3_600_000L) if (targetMillis >= blockEnd) return null return pops.getOrNull(index)?.toSafeProbability() } @@ -169,13 +175,13 @@ fun JmaForecastBundle.toDomain(location: Location): Weather { visibility = null, humidity = null, dewPoint = null, - sunrise = sunTimings.getOrNull(index)?.sunrise ?: 0L, - sunset = sunTimings.getOrNull(index)?.sunset ?: 0L, - moonrise = moonTimings.getOrNull(index)?.moonrise ?: 0L, - moonset = moonTimings.getOrNull(index)?.moonset ?: 0L, + sunrise = sunTimings.getOrNull(index)?.sunrise, + sunset = sunTimings.getOrNull(index)?.sunset, + moonrise = moonTimings.getOrNull(index)?.moonrise, + moonset = moonTimings.getOrNull(index)?.moonset, moonPhase = moonTimings.getOrNull(index)?.phase ?: MoonPhase.NEW_MOON, - dawn = sunTimings.getOrNull(index)?.dawn ?: 0L, - dusk = sunTimings.getOrNull(index)?.dusk ?: 0L + dawn = sunTimings.getOrNull(index)?.dawn, + dusk = sunTimings.getOrNull(index)?.dusk ) } ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteoam/MeteoamJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteoam/MeteoamJsonMapper.kt index 8d5914ee3..3a084d0b0 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteoam/MeteoamJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteoam/MeteoamJsonMapper.kt @@ -198,13 +198,13 @@ private fun computeDaily( visibility = null, humidity = humidityMin, dewPoint = null, - sunrise = sunTimings[index].sunrise ?: -1L, - sunset = sunTimings[index].sunset ?: -1L, - moonrise = moonTimings[index].moonrise ?: -1L, - moonset = moonTimings[index].moonset ?: -1L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: -1L, - dusk = sunTimings[index].dusk ?: -1L + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk ) }.take(4) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteofrance/MeteFranceJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteofrance/MeteFranceJsonMapper.kt index 625030c22..a27731c2d 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteofrance/MeteFranceJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/meteofrance/MeteFranceJsonMapper.kt @@ -161,13 +161,13 @@ private fun computeDaily( weatherCondition = condition, time = time, precipitationProbabilityMax = null, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, pressureMsl = avgPressure, visibility = null, humidity = avgHumidity, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metnorway/MetNorwayJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metnorway/MetNorwayJsonMapper.kt index 120b66a9e..1052b09fa 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metnorway/MetNorwayJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metnorway/MetNorwayJsonMapper.kt @@ -191,13 +191,13 @@ private fun computeDaily(data: MetNorwayForecastJson, location: Location): List< weatherCondition = condition, time = time, precipitationProbabilityMax = null, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, pressureMsl = avgPressure, visibility = null, humidity = avgHumidity, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metoffice/MetOfficeJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metoffice/MetOfficeJsonMapper.kt index 677f29ab6..e0413090a 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metoffice/MetOfficeJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/metoffice/MetOfficeJsonMapper.kt @@ -156,13 +156,13 @@ fun MetOfficeForecastJson.toDomain(location: Location): Weather { .takeIf { it != -1 }, humidity = humidityAvg, dewPoint = dewPointAvg, - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, ) } ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/NwsJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/NwsJsonMapper.kt index 2fd702fe6..658111de9 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/NwsJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/NwsJsonMapper.kt @@ -210,13 +210,13 @@ fun NwsWeatherJsonBundle.toDomain(location: Location): Weather { weatherCondition = condition, time = time, precipitationProbabilityMax = precipitationProbabilityMax.roundToInt(), // item.probabilityOfPrecipitation.value from daily is wrong? - sunrise = sunTimings[index].sunrise ?: -0L, - sunset = sunTimings[index].sunset ?: -0L, - moonrise = moonTimings[index].moonrise ?: -0L, - moonset = moonTimings[index].moonset ?: -0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, pressureMsl = null, visibility = minVisibility?.roundToInt(), humidity = avgHumidity, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/alerts/NwsAlertsMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/alerts/NwsAlertsMapper.kt index fc3c611e6..36504aebe 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/alerts/NwsAlertsMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/nws/alerts/NwsAlertsMapper.kt @@ -5,6 +5,11 @@ import com.pranshulgg.weather_master_app.core.model.weather.alerts.AlertSeverity import com.pranshulgg.weather_master_app.core.network.sources.weather.nws.json.NwsAlertsJson import java.time.OffsetDateTime + +/** + * Initial NWS alerts integration implemented by https://github.com/reveler-hub + */ + fun NwsAlertsJson.toDomain(locationId: String): List { return features.orEmpty().mapNotNull { feature -> val properties = feature.properties ?: return@mapNotNull null diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openmeteo/OpenMeteoJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openmeteo/OpenMeteoJsonMapper.kt index 805920071..628c7f950 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openmeteo/OpenMeteoJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openmeteo/OpenMeteoJsonMapper.kt @@ -103,13 +103,13 @@ fun OpenMeteoWeatherJson.toDomain(location: Location): Weather { weatherCondition = condition, time = daily.time[it].secondsToMilliseconds(), // Open-Meteo returns in seconds precipitationProbabilityMax = daily.precipitationProbabilityMax[it], - sunrise = sunTimings[it].sunrise ?: -0L, - sunset = sunTimings[it].sunset ?: -0L, - moonrise = moonTimings[it].moonrise ?: -0L, - moonset = moonTimings[it].moonset ?: -0L, + sunrise = sunTimings[it].sunrise, + sunset = sunTimings[it].sunset, + moonrise = moonTimings[it].moonrise, + moonset = moonTimings[it].moonset, moonPhase = moonTimings[it].phase, - dawn = sunTimings[it].dawn ?: 0L, - dusk = sunTimings[it].dusk ?: 0L, + dawn = sunTimings[it].dawn, + dusk = sunTimings[it].dusk, pressureMsl = daily.pressureMsl[it], visibility = daily.visibility[it], humidity = daily.humidity[it]?.toDouble(), diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openweather/OpenWeatherJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openweather/OpenWeatherJsonMapper.kt index 358cea321..1ab4420b0 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openweather/OpenWeatherJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/openweather/OpenWeatherJsonMapper.kt @@ -146,13 +146,13 @@ fun OpenWeatherJsonBundle.toDomain(location: Location): Weather { visibility = minVisibility?.toInt(), humidity = humidityAvg, dewPoint = avgDewPoint, - sunrise = sunTimings.sunrise ?: -1L, - sunset = sunTimings.sunset ?: -1L, - moonrise = moonTimings.moonrise ?: -1L, - moonset = moonTimings.moonset ?: -1L, + sunrise = sunTimings.sunrise, + sunset = sunTimings.sunset, + moonrise = moonTimings.moonrise, + moonset = moonTimings.moonset, moonPhase = moonTimings.phase, - dawn = sunTimings.dawn ?: -1L, - dusk = sunTimings.dusk ?: -1L, + dawn = sunTimings.dawn, + dusk = sunTimings.dusk, ) } ) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/pirateweather/PirateWeatherMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/pirateweather/PirateWeatherMapper.kt index b46b6db6d..12acb5dad 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/pirateweather/PirateWeatherMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/pirateweather/PirateWeatherMapper.kt @@ -18,6 +18,11 @@ import com.pranshulgg.weather_master_app.core.utils.weather.astronomy.getMoonTim import com.pranshulgg.weather_master_app.core.utils.weather.astronomy.getSunTimings import kotlin.math.roundToInt + +/** + * Initial Pirate Weather integration implemented by https://github.com/altendorfme + */ + fun PirateWeatherJson.toDomain(location: Location): Weather { val utcOffsetSeconds = (offset * 3600).toLong() @@ -106,13 +111,13 @@ private fun PirateWeatherDailyDataJson.toWeatherDaily( weatherCondition = PirateWeatherConditionMap.getCondition(icon), time = time.secondsToMilliseconds(), precipitationProbabilityMax = (precipProbability?.times(100))?.roundToInt(), - sunrise = sunTimings[index].sunrise ?: 0L, - sunset = sunTimings[index].sunset ?: 0L, - moonrise = moonTimings[index].moonrise ?: 0L, - moonset = moonTimings[index].moonset ?: 0L, + sunrise = sunTimings[index].sunrise, + sunset = sunTimings[index].sunset, + moonrise = moonTimings[index].moonrise, + moonset = moonTimings[index].moonset, moonPhase = moonTimings[index].phase, - dawn = sunTimings[index].dawn ?: 0L, - dusk = sunTimings[index].dusk ?: 0L, + dawn = sunTimings[index].dawn, + dusk = sunTimings[index].dusk, pressureMsl = pressure, visibility = visibility?.let { (it * 1000).roundToInt() }, humidity = (humidity?.times(100)), diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/smhi/SmhiJsonMapper.kt b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/smhi/SmhiJsonMapper.kt index 50d49bc78..7a1ddc99a 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/smhi/SmhiJsonMapper.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/data/local/mapper/weather/sources/smhi/SmhiJsonMapper.kt @@ -169,13 +169,13 @@ private fun computeDaily(data: SmhiForecastJson, location: Location): List