From 47848a5fa2f28dde31bb1b858f4bca5195b4fa87 Mon Sep 17 00:00:00 2001 From: PranshulGG Date: Wed, 12 Aug 2026 22:02:39 +0530 Subject: [PATCH] keep past hour in the forecast --- .../core/utils/weather/forecast/ForecastMatching.kt | 9 ++++----- .../mapper/weather/sources/bmkg/BmkgJsonMapper.kt | 2 +- .../mapper/weather/sources/dwd/DwdJsonMapper.kt | 2 +- .../mapper/weather/sources/eccc/EcccJsonMapper.kt | 3 +-- .../mapper/weather/sources/fmi/FmiXmlMapper.kt | 2 +- .../weather/sources/gismeteo/GismeteoJsonMapper.kt | 1 - .../weather/sources/meteoam/MeteoamJsonMapper.kt | 2 +- .../sources/meteofrance/MeteFranceJsonMapper.kt | 2 +- .../sources/metnorway/MetNorwayJsonMapper.kt | 2 +- .../mapper/weather/sources/nws/NwsJsonMapper.kt | 2 +- .../sources/openmeteo/OpenMeteoJsonMapper.kt | 1 - .../mapper/weather/sources/smhi/SmhiJsonMapper.kt | 2 +- .../weather_master_app/feature/daily/DailyScreen.kt | 3 ++- .../feature/shared/ui/HourlyCard.kt | 13 ++++--------- 14 files changed, 19 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/core/utils/weather/forecast/ForecastMatching.kt b/app/src/main/java/com/pranshulgg/weather_master_app/core/utils/weather/forecast/ForecastMatching.kt index 103a691d1..647428d51 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/core/utils/weather/forecast/ForecastMatching.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/core/utils/weather/forecast/ForecastMatching.kt @@ -35,15 +35,14 @@ fun findMatchingHourly( currentMilli: Long, source: WeatherSource, zoneId: String, - alwaysReturn24Hrs: Boolean = false + alwaysReturn24Hrs: Boolean = false, + keepPastHour: Boolean = false ): List { - val startIndex = data.indexOfFirst { it.time >= currentMilli }.minus(1) + val startIndex = data.indexOfFirst { it.time >= currentMilli }.takeIf { it >= 0 } + ?.minus(if (keepPastHour) 1 else 0) ?: return emptyList() - if (startIndex == -1) { - return emptyList() - } val startDay = data[startIndex].time return if (alwaysReturn24Hrs) { 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 916ad79ce..7d3027ee6 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 @@ -164,7 +164,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.indexOfFirst { it.datetime.iso8601TimestampToMilliseconds() >= time }.minus(1) + data.indexOfFirst { it.datetime.iso8601TimestampToMilliseconds() >= time } .takeIf { it != -1 } ?: 0 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 f89b4595a..42830700b 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 @@ -174,7 +174,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.indexOfFirst { it.timestamp.iso8601TimestampToMilliseconds() >= time }.minus(1) + data.indexOfFirst { it.timestamp.iso8601TimestampToMilliseconds() >= time } .takeIf { it != -1 } ?: 0 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 a41613d9c..c276a0519 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 @@ -159,8 +159,7 @@ private fun getMaxPrecipitationProbability( time: Long ): Int? { val startIndex = - hourly.indexOfFirst { it.epochTime.secondsToMilliseconds() >= time }.minus(1) - .takeIf { it != -1 } + hourly.indexOfFirst { it.epochTime.secondsToMilliseconds() >= time }.takeIf { it != -1 } ?: 0 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 9bde21797..005e6a420 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 @@ -282,7 +282,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.indexOfFirst { it.time!!.iso8601TimestampToMilliseconds() >= time }.minus(1) + data.indexOfFirst { it.time!!.iso8601TimestampToMilliseconds() >= time } .takeIf { it != -1 } ?: 0 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 da4c2ac73..d76f3ae95 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 @@ -150,7 +150,6 @@ fun GismeteoModel.toDomain(location: Location): Weather { private fun hourlyForDay(data: List, time: Long): List { val startIndex = data.indexOfFirst { fixTimeString(it.time).iso8601TimestampToMilliseconds() >= time } - .minus(1) .takeIf { it != -1 } ?: 0 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 0fc78f01b..ec89fe2a3 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 @@ -219,7 +219,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.indexOfFirst { it.time.iso8601TimestampToMilliseconds() >= time }.minus(1) + data.indexOfFirst { it.time.iso8601TimestampToMilliseconds() >= time } .takeIf { it != -1 } ?: 0 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 042cfc5be..410ba4875 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 @@ -181,7 +181,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.indexOfFirst { it.time >= time }.minus(1) + data.indexOfFirst { it.time >= time } .takeIf { it != -1 } ?: 0 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 e987cd397..2736d95f7 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 @@ -199,7 +199,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.indexOfFirst { it.time.iso8601TimestampToMilliseconds() >= time }.minus(1) + data.indexOfFirst { it.time.iso8601TimestampToMilliseconds() >= time } .takeIf { it != -1 } ?: 0 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 ba0d11362..771bef247 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 @@ -397,7 +397,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.periods.indexOfFirst { it.startTime.iso8601TimestampToMilliseconds() >= time }.minus(1) + data.periods.indexOfFirst { it.startTime.iso8601TimestampToMilliseconds() >= time } .takeIf { it != -1 } ?: 0 val conditions = data.periods.drop(maxOf(0, startIndex - 1)) 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 3a5671e01..5c78e8198 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 @@ -127,7 +127,6 @@ private fun getHourlyConditionsForDay( val startIndex = data.time.indexOfFirst { it.secondsToMilliseconds() >= time.secondsToMilliseconds() } - .minus(1) .takeIf { it != -1 } ?: 0 val conditions = data.weatherCode.drop(maxOf(0, startIndex)).take(24) 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 34a3843b5..f43b9ada3 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 @@ -190,7 +190,7 @@ private fun getHourlyConditionsForDay( time: Long ): List { val startIndex = - data.indexOfFirst { it.time.iso8601TimestampToMilliseconds() >= time }.minus(1) + data.indexOfFirst { it.time.iso8601TimestampToMilliseconds() >= time } .takeIf { it != -1 } ?: 0 diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/feature/daily/DailyScreen.kt b/app/src/main/java/com/pranshulgg/weather_master_app/feature/daily/DailyScreen.kt index 4f49333d1..74d96aeb9 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/feature/daily/DailyScreen.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/feature/daily/DailyScreen.kt @@ -111,7 +111,8 @@ fun DailyScreen(navController: NavController, index: Int = 0, locationId: String HourlyCard( weather, units, - if (selectedIndex != 0) selectedDaily.time else weather.current.time + if (selectedIndex != 0) selectedDaily.time else weather.current.time, + isDaily = true ) WeatherBlocks( weather, diff --git a/app/src/main/java/com/pranshulgg/weather_master_app/feature/shared/ui/HourlyCard.kt b/app/src/main/java/com/pranshulgg/weather_master_app/feature/shared/ui/HourlyCard.kt index b625a7850..9666d5c98 100644 --- a/app/src/main/java/com/pranshulgg/weather_master_app/feature/shared/ui/HourlyCard.kt +++ b/app/src/main/java/com/pranshulgg/weather_master_app/feature/shared/ui/HourlyCard.kt @@ -1,6 +1,5 @@ package com.pranshulgg.weather_master_app.feature.shared.ui -import android.util.Log import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -9,7 +8,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @@ -34,8 +32,6 @@ import com.pranshulgg.weather_master_app.core.prefs.LocalAppPrefs import com.pranshulgg.weather_master_app.core.ui.components.Gap import com.pranshulgg.weather_master_app.core.ui.components.WeatherIconBox import com.pranshulgg.weather_master_app.core.ui.theme.ShadowElevation -import com.pranshulgg.weather_master_app.core.utils.extensions.DateTimeExtensions.secondsToMilliseconds -import com.pranshulgg.weather_master_app.core.utils.formatters.safeZoneId import com.pranshulgg.weather_master_app.core.utils.formatters.to12HourTimeString import com.pranshulgg.weather_master_app.core.utils.formatters.to24HourTimeString import com.pranshulgg.weather_master_app.core.utils.weather.cache.isWeatherHourlyDomainSafe @@ -44,16 +40,14 @@ import com.pranshulgg.weather_master_app.core.utils.weather.forecast.findMatchin import com.pranshulgg.weather_master_app.core.utils.weather.forecast.isSameDay import com.pranshulgg.weather_master_app.feature.blocks.components.NoHourlyDataAvailable import com.pranshulgg.weather_master_app.feature.shared.components.CardsHeader -import java.time.ZoneId -import java.time.ZonedDateTime -import kotlin.math.max import kotlin.math.roundToInt @Composable fun HourlyCard( weather: Weather, units: WeatherUnits, - currentMilli: Long = weather.current.time + currentMilli: Long = weather.current.time, + isDaily: Boolean = false ) { if (!isWeatherHourlyDomainSafe(weather)) return @@ -66,7 +60,8 @@ fun HourlyCard( currentMilli, weather.location.source, weather.location.timezone, - alwaysReturn24Hrs = true + alwaysReturn24Hrs = true, + keepPastHour = !isDaily )