mirror of
https://github.com/PranshulGG/WeatherMaster.git
synced 2026-10-22 02:52:37 -05:00
nullable sun/moon and add attributions
This commit is contained in:
1 parent
7303979d93
commit
1d39ddd941
31 files changed
+207
-148
No files matched your search
+14
-6
@@ -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
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -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,
|
||||
|
||||
+5
@@ -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 = "|"
|
||||
|
||||
+3
-1
@@ -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,
|
||||
|
||||
+8
-1
@@ -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
|
||||
|
||||
+4
@@ -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,
|
||||
|
||||
+4
@@ -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,
|
||||
|
||||
+6
-6
@@ -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?
|
||||
)
|
||||
+6
-6
@@ -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
|
||||
)
|
||||
},
|
||||
)
|
||||
|
||||
+9
-6
@@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+6
-6
@@ -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
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
+6
-6
@@ -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
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
+10
-6
@@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+6
-6
@@ -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(),
|
||||
|
||||
+6
-6
@@ -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,
|
||||
|
||||
+6
-6
@@ -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,
|
||||
|
||||
+6
-6
@@ -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,
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
+6
-6
@@ -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,
|
||||
)
|
||||
},
|
||||
)
|
||||
|
||||
+10
-6
@@ -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<String, Map<String, InmetDayJson>>,
|
||||
val hourlyObservations: List<InmetHourlyEntryJson>?
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -119,13 +119,13 @@ fun List<IpmaForecastJson>.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,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+13
-7
@@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+6
-6
@@ -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)
|
||||
|
||||
+6
-6
@@ -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,
|
||||
|
||||
+6
-6
@@ -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,
|
||||
|
||||
+6
-6
@@ -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,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+6
-6
@@ -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,
|
||||
|
||||
+5
@@ -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<Alert> {
|
||||
return features.orEmpty().mapNotNull { feature ->
|
||||
val properties = feature.properties ?: return@mapNotNull null
|
||||
|
||||
+6
-6
@@ -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(),
|
||||
|
||||
+6
-6
@@ -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,
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
+11
-6
@@ -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)),
|
||||
|
||||
+6
-6
@@ -169,13 +169,13 @@ private fun computeDaily(data: SmhiForecastJson, location: Location): List<Weath
|
||||
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,
|
||||
pressureMsl = avgPressure,
|
||||
visibility = DistanceUnit.KM.convert(minVisibility, DistanceUnit.M)?.roundToInt(),
|
||||
humidity = avgHumidity,
|
||||
|
||||
Reference in new issue
Block a user