Connect weather.gov api
This commit is contained in:
@ -3,10 +3,13 @@ package com.tommasoberlose.anotherwidget.network
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import com.google.gson.internal.LinkedTreeMap
|
||||
import com.haroldadmin.cnradapter.NetworkResponse
|
||||
import com.haroldadmin.cnradapter.executeWithRetry
|
||||
import com.kwabenaberko.openweathermaplib.constants.Units
|
||||
import com.kwabenaberko.openweathermaplib.implementation.OpenWeatherMapHelper
|
||||
import com.kwabenaberko.openweathermaplib.implementation.callbacks.CurrentWeatherCallback
|
||||
import com.kwabenaberko.openweathermaplib.models.currentweather.CurrentWeather
|
||||
import com.tommasoberlose.anotherwidget.R
|
||||
import com.tommasoberlose.anotherwidget.global.Constants
|
||||
import com.tommasoberlose.anotherwidget.global.Preferences
|
||||
import com.tommasoberlose.anotherwidget.helpers.WeatherHelper
|
||||
@ -22,6 +25,9 @@ import java.lang.Exception
|
||||
|
||||
class WeatherNetworkApi(val context: Context) {
|
||||
fun updateWeather() {
|
||||
Preferences.weatherProviderError = ""
|
||||
Preferences.weatherProviderLocationError = ""
|
||||
|
||||
if (Preferences.showWeather && Preferences.customLocationLat != "" && Preferences.customLocationLon != "") {
|
||||
when (Constants.WeatherProvider.fromInt(Preferences.weatherProvider)) {
|
||||
Constants.WeatherProvider.OPEN_WEATHER -> useOpenWeatherMap(context)
|
||||
@ -56,6 +62,9 @@ class WeatherNetworkApi(val context: Context) {
|
||||
|
||||
})
|
||||
} else {
|
||||
Preferences.weatherProviderError = context.getString(R.string.weather_provider_error_missing_key)
|
||||
Preferences.weatherProviderLocationError = ""
|
||||
|
||||
WeatherHelper.removeWeather(
|
||||
context
|
||||
)
|
||||
@ -65,23 +74,65 @@ class WeatherNetworkApi(val context: Context) {
|
||||
private fun useWeatherGov(context: Context) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
val repository = WeatherGovRepository()
|
||||
try {
|
||||
val points = repository.getGridPoints(
|
||||
val pointsResponse = executeWithRetry(times = 5) {
|
||||
repository.getGridPoints(
|
||||
Preferences.customLocationLat,
|
||||
Preferences.customLocationLon
|
||||
)
|
||||
|
||||
val pp = points["properties"] as LinkedTreeMap<*,*>
|
||||
val gridId = pp["gridId"] as String
|
||||
val gridX = pp["gridX"] as Double
|
||||
val gridY = pp["gridY"] as Double
|
||||
|
||||
val weather = repository.getWeather(gridId, gridX, gridY)
|
||||
|
||||
Log.d("ciao", weather.toString())
|
||||
} catch (ex: Exception) {
|
||||
Log.d("ciao", ex.localizedMessage)
|
||||
}
|
||||
|
||||
when (pointsResponse) {
|
||||
is NetworkResponse.Success -> {
|
||||
try {
|
||||
val pp = pointsResponse.body["properties"] as LinkedTreeMap<*, *>
|
||||
val gridId = pp["gridId"] as String
|
||||
val gridX = pp["gridX"] as Double
|
||||
val gridY = pp["gridY"] as Double
|
||||
|
||||
when (val weatherResponse = repository.getWeather(
|
||||
gridId,
|
||||
gridX,
|
||||
gridY,
|
||||
if (Preferences.weatherTempUnit == "F") "us" else "si"
|
||||
)) {
|
||||
is NetworkResponse.Success -> {
|
||||
try {
|
||||
val props =
|
||||
weatherResponse.body["properties"] as LinkedTreeMap<*, *>
|
||||
val periods = props["periods"] as List<*>
|
||||
val now = periods[0] as LinkedTreeMap<*, *>
|
||||
|
||||
val temp = now["temperature"] as Double
|
||||
val fullIcon = now["icon"] as String
|
||||
val isDaytime = now["isDaytime"] as Boolean
|
||||
|
||||
Preferences.weatherTemp = temp.toFloat()
|
||||
Preferences.weatherIcon = WeatherHelper.getWeatherGovIcon(fullIcon, isDaytime)
|
||||
Preferences.weatherRealTempUnit = Preferences.weatherTempUnit
|
||||
|
||||
MainWidget.updateWidget(context)
|
||||
|
||||
EventBus.getDefault().post(MainFragment.UpdateUiMessageEvent())
|
||||
} catch (ex: Exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(ex: Exception) {
|
||||
|
||||
}
|
||||
}
|
||||
is NetworkResponse.ServerError -> {
|
||||
if (pointsResponse.body?.containsKey("status") == true && (pointsResponse.body?.get("status") as Double).toInt() == 404) {
|
||||
Preferences.weatherProviderError = ""
|
||||
Preferences.weatherProviderLocationError = context.getString(R.string.weather_provider_error_wrong_location)
|
||||
|
||||
WeatherHelper.removeWeather(
|
||||
context
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +1,13 @@
|
||||
package com.tommasoberlose.anotherwidget.network.api
|
||||
|
||||
import retrofit2.http.GET
|
||||
import retrofit2.http.Path
|
||||
import com.haroldadmin.cnradapter.NetworkResponse
|
||||
import retrofit2.http.*
|
||||
|
||||
interface WeatherGovApiService {
|
||||
@GET("points/{latitude},{longitude}")
|
||||
suspend fun getGridPoints(@Path("latitude") latitude: String, @Path("longitude") longitude: String): HashMap<String, Any>
|
||||
suspend fun getGridPoints(@Path("latitude") latitude: String, @Path("longitude") longitude: String): NetworkResponse<HashMap<String, Any>, HashMap<String, Any>>
|
||||
|
||||
@Headers("User-Agent: (Another Widget, tommaso.berlose@gmail.com)")
|
||||
@GET("gridpoints/{gridId}/{gridX},{gridY}/forecast")
|
||||
suspend fun getWeather(@Path("gridId") gridId: String, @Path("gridX") gridX: Int, @Path("gridY") gridY: Int): HashMap<String, Any>
|
||||
suspend fun getWeather(@Path("gridId") gridId: String, @Path("gridX") gridX: Int, @Path("gridY") gridY: Int, @Query("units") unit: String): NetworkResponse<HashMap<String, Any>, HashMap<String, Any>>
|
||||
}
|
@ -1,15 +1,16 @@
|
||||
package com.tommasoberlose.anotherwidget.network.repository
|
||||
|
||||
import com.haroldadmin.cnradapter.NetworkResponseAdapterFactory
|
||||
import com.tommasoberlose.anotherwidget.network.api.WeatherGovApiService
|
||||
import retrofit2.Retrofit
|
||||
import retrofit2.converter.gson.GsonConverterFactory
|
||||
|
||||
class WeatherGovRepository() {
|
||||
class WeatherGovRepository {
|
||||
|
||||
private val apiService: WeatherGovApiService = getRetrofit().create(WeatherGovApiService::class.java)
|
||||
|
||||
suspend fun getGridPoints(latitude: String, longitude: String) = apiService.getGridPoints(latitude, longitude)
|
||||
suspend fun getWeather(gridId: String, gridX: Double, gridY: Double) = apiService.getWeather(gridId, gridX.toInt(), gridY.toInt())
|
||||
suspend fun getWeather(gridId: String, gridX: Double, gridY: Double, unit: String) = apiService.getWeather(gridId, gridX.toInt(), gridY.toInt(), unit)
|
||||
|
||||
companion object {
|
||||
private const val BASE_URL = "https://api.weather.gov/"
|
||||
@ -17,6 +18,7 @@ class WeatherGovRepository() {
|
||||
return Retrofit.Builder()
|
||||
.baseUrl(BASE_URL)
|
||||
.addConverterFactory(GsonConverterFactory.create())
|
||||
.addCallAdapterFactory(NetworkResponseAdapterFactory())
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user