Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ dependencies {
def OKHTTP_VERSION = "4.2.2"
def OKIO_VERSION = "2.6.0"
def OSMDROID_VERSION = "6.1.2"
def PERMISSIONS_DISPATCHER_VERSION = "4.7.0"
def PERMISSIONS_DISPATCHER_VERSION = "4.8.0"
def PREFERENCE_VERSION = "1.1.1"
def RETROFIT_VERSION = "2.9.0"
def ROOM_VERSION = "2.2.5"
Expand Down Expand Up @@ -234,8 +234,8 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${KOTLIN_STDLIB_VERSION}"
implementation "org.osmdroid:osmdroid-android:${OSMDROID_VERSION}"
implementation "io.github.sphrak:either:${EITHER_VERSION}"
implementation "org.permissionsdispatcher:permissionsdispatcher:${PERMISSIONS_DISPATCHER_VERSION}"
kapt "org.permissionsdispatcher:permissionsdispatcher-processor:${PERMISSIONS_DISPATCHER_VERSION}"
implementation "com.github.permissions-dispatcher:permissionsdispatcher:${PERMISSIONS_DISPATCHER_VERSION}"
kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:${PERMISSIONS_DISPATCHER_VERSION}"

// Datetime
implementation "com.jakewharton.threetenabp:threetenabp:${THREETEN_ABP_VERSION}"
Expand Down Expand Up @@ -275,3 +275,12 @@ tasks.register("ktlintFormat", JavaExec) {
repositories {
mavenCentral()
}

// The google-services plugin is applied unconditionally but only the google
// flavor actually uses Firebase. Disable the processing task for all other
// flavors so contributors can build without a google-services.json file.
tasks.configureEach { task ->
if (task.name ==~ /process(Fdroid|Github).*GoogleServices/) {
task.enabled = false
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ data class Geometry(
@SerialName(value = "type")
val type: String = "Point",
@SerialName(value = "coordinates")
val coordinates: List<List<Double>>
val coordinates: List<Double>
)

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import kotlinx.serialization.Serializable

@Serializable
data class TimeSerie(
@SerialName(value = "validTime")
val validTime: String,
@SerialName(value = "parameters")
val parameters: List<Parameter> = emptyList()
)
@SerialName(value = "time")
val time: String,
@SerialName(value = "data")
val data: WeatherData
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import kotlinx.serialization.Serializable
@Serializable
data class Weather(

@SerialName(value = "approvedTime")
val approvedTime: String,
@SerialName(value = "createdTime")
val createdTime: String,

@SerialName(value = "referenceTime")
val referenceTime: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package fi.kroon.vadret.data.weatherforecast.model

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class WeatherData(

@SerialName(value = "air_temperature")
val airTemperature: Double,

@SerialName(value = "wind_from_direction")
val windFromDirection: Double,

@SerialName(value = "wind_speed")
val windSpeed: Double,

@SerialName(value = "relative_humidity")
val relativeHumidity: Int,

@SerialName(value = "thunderstorm_probability")
val thunderstormProbability: Int,

@SerialName(value = "predominant_precipitation_type_at_surface")
val precipitationType: Int,

@SerialName(value = "probability_of_precipitation")
val probabilityOfPrecipitation: Int,

@SerialName(value = "precipitation_amount_min")
val precipitationAmountMin: Double,

@SerialName(value = "precipitation_amount_max")
val precipitationAmountMax: Double,

@SerialName(value = "symbol_code")
val symbolCode: Int
)
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package fi.kroon.vadret.data.weatherforecast.model

import android.os.Parcelable
import fi.kroon.vadret.util.PMP3G_CATEGORY
import fi.kroon.vadret.util.POINT_GEOTYPE
import fi.kroon.vadret.util.SMHI_BASE_API_VERSION
import fi.kroon.vadret.util.SNOW1G_API_VERSION
import fi.kroon.vadret.util.SNOW1G_CATEGORY
import kotlinx.android.parcel.Parcelize

@Parcelize
data class WeatherOut(
val localityName: String? = null,
val version: Int = SMHI_BASE_API_VERSION,
val category: String = PMP3G_CATEGORY,
val version: Int = SNOW1G_API_VERSION,
val category: String = SNOW1G_CATEGORY,
val geotype: String = POINT_GEOTYPE,
val longitude: Double,
val latitude: Double
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,6 @@ class WeatherForecastAdapter @Inject constructor() : RecyclerView.Adapter<Recycl
val humidityPercentString = "${item.humidityPercent}$percentSymbol"
itemView.humidityPercent.text = humidityPercentString

item.precipitationCode?.let { precipitationCodeInt: Int ->
itemView.precipitationCode.setText(getPrecipitationResourceId(precipitationCodeInt))
} ?: itemView.precipitationCode.toGone()

if (item.sunriseDateTime != null && item.sunsetDateTime != null) {
val format = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
itemView.sunriseDateTime.text = item.sunriseDateTime.toLocalTime().format(format)
Expand All @@ -143,10 +139,9 @@ class WeatherForecastAdapter @Inject constructor() : RecyclerView.Adapter<Recycl
itemView.sunsetDateTime.setText(R.string.sun_wont_set_today)
}

item.precipitationCode?.let { intCode ->
if (intCode > 0) {
itemView.precipitationCode.setText(getPrecipitationResourceId(intCode))
}
item.precipitationCode?.takeIf { it > 0 }?.let { intCode ->
itemView.precipitationCode.setText(getPrecipitationResourceId(intCode))
itemView.precipitationCode.toVisible()
} ?: itemView.precipitationCode.toGone()
}
}
Expand All @@ -172,9 +167,9 @@ class WeatherForecastAdapter @Inject constructor() : RecyclerView.Adapter<Recycl
itemView.feelsLikeTemperature.toVisible()
itemView.feelsLikeTempUnit.toVisible()
} ?: run {
itemView.feelsLikeTemperature.toInvisible()
itemView.feelsLike.toInvisible()
itemView.feelsLikeTempUnit.toInvisible()
itemView.feelsLikeTemperature.toGone()
itemView.feelsLike.toGone()
itemView.feelsLikeTempUnit.toGone()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package fi.kroon.vadret.presentation.weatherforecast

import fi.kroon.vadret.data.location.model.Location
import fi.kroon.vadret.data.weatherforecast.model.Parameter
import fi.kroon.vadret.data.weatherforecast.model.TimeSerie
import fi.kroon.vadret.data.weatherforecast.model.WeatherData
import fi.kroon.vadret.presentation.weatherforecast.model.IWeatherForecastModel
import fi.kroon.vadret.presentation.weatherforecast.model.WeatherForecastDateItemModel
import fi.kroon.vadret.presentation.weatherforecast.model.WeatherForecastHeadlineModel
Expand Down Expand Up @@ -41,7 +41,7 @@ object WeatherForecastMapper {
for (timeSerie: TimeSerie in timeSerieList) {

if (weatherForecastHeadlineModel == null) {
weatherForecastHeadlineModel = getWeatherForecastHeadlineModel(timeSerie.parameters)
weatherForecastHeadlineModel = getWeatherForecastHeadlineModel(timeSerie.data)
weatherForecastModelList.add(weatherForecastHeadlineModel)
}

Expand All @@ -52,7 +52,7 @@ object WeatherForecastMapper {

if (weatherForecastDateItemModel == null) {
weatherForecastDateItemModel = WeatherForecastDateItemModel(
timeSerieList.first().validTime.parseToLocalDate()
timeSerieList.first().time.parseToLocalDate()
)
}

Expand All @@ -67,37 +67,25 @@ object WeatherForecastMapper {
temp = null
}

if (timeSerie.validTime.parseToLocalDate() == weatherForecastDateItemModel.date) {
if (timeSerie.time.parseToLocalDate() == weatherForecastDateItemModel.date) {
val weatherForecastItemModel = getWeatherForecastItemModel(timeSerie)
weatherForecastModelList.add(weatherForecastItemModel)
} else {
temp = timeSerie
weatherForecastDateItemModel = WeatherForecastDateItemModel(
timeSerie.validTime.parseToLocalDate()
timeSerie.time.parseToLocalDate()
)
}
}
return weatherForecastModelList.toList()
}

private fun getWeatherForecastHeadlineModel(parameters: List<Parameter>): WeatherForecastHeadlineModel {
var weatherDescription: Int? = null
var windDirection: Double? = null
var windSpeed: Double? = null

parameters.forEach { parameter: Parameter ->
when (parameter.name) {
"wd" -> windDirection = parameter.values.first()
"ws" -> windSpeed = parameter.values.first()
"Wsymb2" -> weatherDescription = parameter.values.first().toInt()
}
}
return WeatherForecastHeadlineModel(
headline = weatherDescription,
windSpeed = windSpeed,
windDirection = windDirection
private fun getWeatherForecastHeadlineModel(data: WeatherData): WeatherForecastHeadlineModel =
WeatherForecastHeadlineModel(
headline = data.symbolCode,
windSpeed = data.windSpeed,
windDirection = data.windFromDirection
)
}

private fun getWeatherForecastSplashItemModel(timeSerie: TimeSerie, location: Location): WeatherForecastSplashItemModel {

Expand All @@ -114,62 +102,33 @@ object WeatherForecastMapper {
sunsetDateTime = OffsetDateTime.ofInstant(sunsetDateTimeInstant, ZoneId.systemDefault())
}

var humidityPercent: Int = 0
var temperature: Double = 0.0
var windSpeed: Double = 0.0
var windDirection: Double? = null
var feelsLikeTemperature: String? = null
var weatherIcon: Int = 0
var weatherDescription: Int = 0
var precipitationCode: Int? = 0
var thunderRisk: Int = 0

for (param in timeSerie.parameters) {
when (param.name) {
"t" -> temperature = param.values.first()
"r" -> humidityPercent = param.values.first().toInt()
"wd" -> windDirection = param.values.first()
"ws" -> windSpeed = param.values.first()
"tstm" -> thunderRisk = param.values.first().toInt()
"pcat" -> precipitationCode = param.values.first().toInt()
"Wsymb2" -> weatherIcon = param.values.first().toInt()
}
}
weatherDescription = weatherIcon
val data: WeatherData = timeSerie.data
val temperature: Double = data.airTemperature
val windSpeed: Double = data.windSpeed
val weatherIcon: Int = data.symbolCode

return WeatherForecastSplashItemModel(
sunriseDateTime = sunriseDateTime,
sunsetDateTime = sunsetDateTime,
humidityPercent = humidityPercent,
humidityPercent = data.relativeHumidity,
temperature = temperature,
windSpeed = windSpeed,
windDirection = windDirection,
windDirection = data.windFromDirection,
feelsLikeTemperature = WindChill.calculate(temperature, windSpeed),
weatherIcon = weatherIcon,
weatherDescription = weatherDescription,
precipitationCode = precipitationCode,
thunderRisk = thunderRisk
weatherDescription = weatherIcon,
precipitationCode = data.precipitationType,
thunderRisk = data.thunderstormProbability
)
}

private fun getWeatherForecastItemModel(timeSerie: TimeSerie): WeatherForecastItemModel {
var temperature: Double = 0.0
val time: String = Instant.parse(timeSerie.validTime).atZone(ZoneId.systemDefault()).toLocalTime().toString()
var feelsLikeTemperature: String? = null
var windSpeed: Double = 0.0
val data: WeatherData = timeSerie.data
val time: String = Instant.parse(timeSerie.time).atZone(ZoneId.systemDefault()).toLocalTime().toString()
val temperature: Double = data.airTemperature
val windSpeed: Double = data.windSpeed
val weatherIcon: Int = data.symbolCode
val precipitationType: Int = 0
var weatherIcon: Int = 0
var weatherDescription: Int = 0

for (param in timeSerie.parameters) {
when (param.name) {
"t" -> temperature = param.values.first()
"ws" -> windSpeed = param.values.first()
"Wsymb2" -> weatherIcon = param.values.first().toInt()
}
}

weatherDescription = weatherIcon

return WeatherForecastItemModel(
temperature = temperature,
Expand All @@ -178,7 +137,7 @@ object WeatherForecastMapper {
precipitationType = precipitationType,
windSpeed = windSpeed,
weatherIcon = weatherIcon,
weatherDescription = weatherDescription
weatherDescription = weatherIcon
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import retrofit2.converter.moshi.MoshiConverterFactory
object WeatherForecastModule {

private val contentType: MediaType = "application/json".toMediaType()
private val json: Json = Json { ignoreUnknownKeys = true }

@Provides
@WeatherForecastScope
Expand All @@ -52,7 +53,7 @@ object WeatherForecastModule {
assertNoInitMainThread()
return Retrofit.Builder()
.baseUrl(SMHI_API_FORECAST_URL)
.addConverterFactory(Json.asConverterFactory(contentType))
.addConverterFactory(json.asConverterFactory(contentType))
.delegatingCallFactory(okHttpClient)
.build()
}
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/java/fi/kroon/vadret/util/Constant.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package fi.kroon.vadret.util

// SMHI API REQUEST PARAMS
const val PMP3G_CATEGORY = "pmp3g"
const val SNOW1G_CATEGORY = "snow1g"
const val POINT_GEOTYPE = "point"
const val DEFAULT_TIME_ZONE = "GMT"
const val SMHI_BASE_API_VERSION = 2
const val SNOW1G_API_VERSION = 1

// NOMINATIM API REQEUST PARAMS
const val NOMINATIM_DATA_FORMAT = "json"
Expand Down
Loading