diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/DownloadActivity.java b/app/src/main/java/de/apps4ics/mountainnavigation/DownloadActivity.java index e1d364d..e413753 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/DownloadActivity.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/DownloadActivity.java @@ -24,11 +24,15 @@ Button startDownload; int nrOfForecastDays; String currentSelected; + OnWeatherRetrievedCallback weatherListCallback; + OnSingleWeatherRetrievedCallback weatherCallback; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download); + weatherListCallback = new OnWeatherRetrievedCallback(); + weatherCallback = new OnSingleWeatherRetrievedCallback(MainActivity.getWeatherHandler()); dayLayout = (LinearLayout) findViewById(R.id.forecastNrOfDaysLayout); dayPicker = (SeekBar) findViewById(R.id.forecastNrOfDaysSeek); dayDisplay = (TextView) findViewById(R.id.forecastNrOfDays); @@ -56,9 +60,9 @@ public void onClick(View v) { WeatherHandler weatherHandler = MainActivity.getWeatherHandler(); if(currentSelected.equals(getString(R.string.download_forecast_key))) { - weatherHandler.getForecast(nrOfForecastDays); + weatherHandler.getForecast(nrOfForecastDays, weatherListCallback); } else if(currentSelected.equals(getString(R.string.download_current_key))) { - weatherHandler.getCurrentWeather(); + weatherHandler.getCurrentWeather(weatherCallback); } else if(currentSelected.equals(getString(R.string.download_day_key))) { //TODO } diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java index bdcdd76..0612d16 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/MainActivity.java @@ -88,6 +88,7 @@ private DatabaseHandler dbHandler; private PoiHandler poiHandler; private static WeatherHandler weatherHandler; + private OnSingleWeatherRetrievedCallback callback; private long lastWeatherInformation; private long lastPoiInformation; @@ -144,6 +145,7 @@ dbHandler = new DatabaseHandler(this); poiHandler = new PoiHandler(this, res, mapView); weatherHandler = new WeatherHandler(this); + callback = new OnSingleWeatherRetrievedCallback(weatherHandler); lastWeatherInformation = lastPoiInformation = 0; @@ -472,7 +474,7 @@ if(currentTime - lastWeatherInformation >= MIN_WEATHER_RELOAD_TIME || distance >= MIN_WEATHER_RELOAD_DIST) { lastWeatherInformation = currentTime; - weatherHandler.getCurrentWeather(location); + weatherHandler.getCurrentWeather(location, callback); } if(currentTime - lastPoiInformation >= MIN_POI_RELOAD_TIME || distance >= MIN_POI_RELOAD_DIST) { //5 minutes lastPoiInformation = currentTime; diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/OnSingleWeatherRetrieved.java b/app/src/main/java/de/apps4ics/mountainnavigation/OnSingleWeatherRetrieved.java new file mode 100644 index 0000000..decdaa3 --- /dev/null +++ b/app/src/main/java/de/apps4ics/mountainnavigation/OnSingleWeatherRetrieved.java @@ -0,0 +1,8 @@ +package de.apps4ics.mountainnavigation; + +/** + * Created by Vinz on 18.03.2016. + */ +public interface OnSingleWeatherRetrieved { + public MyWeather postRetrieve(MyWeather weather); +} diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/OnSingleWeatherRetrievedCallback.java b/app/src/main/java/de/apps4ics/mountainnavigation/OnSingleWeatherRetrievedCallback.java new file mode 100644 index 0000000..756644a --- /dev/null +++ b/app/src/main/java/de/apps4ics/mountainnavigation/OnSingleWeatherRetrievedCallback.java @@ -0,0 +1,21 @@ +package de.apps4ics.mountainnavigation; + +import de.apps4ics.mountainnavigation.handlers.WeatherHandler; + +/** + * Created by Vinz on 18.03.2016. + */ +public class OnSingleWeatherRetrievedCallback implements OnSingleWeatherRetrieved { + WeatherHandler weatherHandler; + + public OnSingleWeatherRetrievedCallback(WeatherHandler weatherHandler) { + this.weatherHandler = weatherHandler; + } + + @Override + public MyWeather postRetrieve(MyWeather weather) { + weatherHandler.displayHints(weather); + weatherHandler.displaySevereWeather(weather); + return null; + } +} diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/OnWeatherRetrieved.java b/app/src/main/java/de/apps4ics/mountainnavigation/OnWeatherRetrieved.java new file mode 100644 index 0000000..31ec697 --- /dev/null +++ b/app/src/main/java/de/apps4ics/mountainnavigation/OnWeatherRetrieved.java @@ -0,0 +1,10 @@ +package de.apps4ics.mountainnavigation; + +import java.util.List; + +/** + * Created by Vinz on 18.03.2016. + */ +public interface OnWeatherRetrieved { + public List postRetrieve(List weathers); +} diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/OnWeatherRetrievedCallback.java b/app/src/main/java/de/apps4ics/mountainnavigation/OnWeatherRetrievedCallback.java new file mode 100644 index 0000000..54e53a2 --- /dev/null +++ b/app/src/main/java/de/apps4ics/mountainnavigation/OnWeatherRetrievedCallback.java @@ -0,0 +1,19 @@ +package de.apps4ics.mountainnavigation; + +import android.util.Log; + +import java.util.Date; +import java.util.List; + +/** + * Created by Vinz on 18.03.2016. + */ +public class OnWeatherRetrievedCallback implements OnWeatherRetrieved { + @Override + public List postRetrieve(List weathers) { + for(MyWeather mw : weathers) { + Log.d(MainActivity.TAG, mw.getCity() + " (" + MainActivity.df_full.format(new Date(mw.getTimestamp()*1000)) + ")"); + } + return null; + } +} diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java index 14b9d74..cbcd2a2 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java @@ -12,6 +12,7 @@ import com.survivingwithandroid.weather.lib.WeatherConfig; import com.survivingwithandroid.weather.lib.exception.WeatherLibException; import com.survivingwithandroid.weather.lib.exception.WeatherProviderInstantiationException; +import com.survivingwithandroid.weather.lib.model.CurrentWeather; import com.survivingwithandroid.weather.lib.model.DayForecast; import com.survivingwithandroid.weather.lib.model.HistoricalHourWeather; import com.survivingwithandroid.weather.lib.model.HistoricalWeather; @@ -28,6 +29,8 @@ import de.apps4ics.mountainnavigation.InformListDialog; import de.apps4ics.mountainnavigation.MainActivity; import de.apps4ics.mountainnavigation.MyWeather; +import de.apps4ics.mountainnavigation.OnSingleWeatherRetrieved; +import de.apps4ics.mountainnavigation.OnWeatherRetrieved; import de.apps4ics.mountainnavigation.R; import de.apps4ics.mountainnavigation.WeatherDatabase; import de.apps4ics.mountainnavigation.adapters.WarningListAdapter; @@ -40,6 +43,7 @@ private Context context; private WeatherDatabase weatherDb; private WeatherClient weatherClient; + private WeatherConfig weatherConfig; private HistoricalWeather histWeather; private DayForecast[] forecasts; private Weather[] weathers; @@ -72,7 +76,7 @@ res.getString(R.string.settings_weather_days_forecast), String.valueOf(MAX_DAYS_FORECAST_DEFAULT))); WeatherClient.ClientBuilder weatherBuilder = new WeatherClient.ClientBuilder(); - WeatherConfig weatherConfig = new WeatherConfig(); + weatherConfig = new WeatherConfig(); weatherConfig.unitSystem = WeatherConfig.UNIT_SYSTEM.M; weatherConfig.ApiKey = API_KEY; weatherConfig.lang = res.getString(R.string.lang_identifier); @@ -99,60 +103,77 @@ } } - public MyWeather getCurrentWeather() { - return getCurrentWeather(MainActivity.getLocation()); + public void getCurrentWeather(OnSingleWeatherRetrieved callback) { + getCurrentWeather(MainActivity.getLocation(), callback); } - public MyWeather getCurrentWeather(Location l) { - return getCurrentWeather(l.getLatitude(), l.getLongitude()); + public void getCurrentWeather(Location l, OnSingleWeatherRetrieved callback) { + getCurrentWeather(l.getLatitude(), l.getLongitude(), callback); } - public MyWeather getCurrentWeather(double lat, double lon) { - if(MainActivity.hasInternet()) return getCurrentWeatherOnline(lat, lon); - else return getCurrentWeatherCached(lat, lon, 0); + public void getCurrentWeather(double lat, double lon, OnSingleWeatherRetrieved callback) { + if(MainActivity.hasInternet()) getCurrentWeatherOnline(lat, lon, callback); + else getCurrentWeatherCached(lat, lon, 0, callback); } //TODO - private MyWeather getCurrentWeatherOnline(double lat, double lon) { + private void getCurrentWeatherOnline(double lat, double lon, final OnSingleWeatherRetrieved callback) { + //return new MyWeather(); + weatherClient.getCurrentCondition(new WeatherRequest(lon, lat), new WeatherClient.WeatherEventListener() { + @Override + public void onWeatherRetrieved(CurrentWeather weather) { + MyWeather myWeather = new MyWeather(weather.weather, System.currentTimeMillis()); + callback.postRetrieve(myWeather); + } + @Override + public void onWeatherError(WeatherLibException wle) { + } + + @Override + public void onConnectionError(Throwable t) { + } + }); + } + + //TODO + private MyWeather getCurrentWeatherCached(double lat, double lon, int offset, OnSingleWeatherRetrieved callback) { //return new MyWeather(); return null; } - //TODO - private MyWeather getCurrentWeatherCached(double lat, double lon, int offset) { - //return new MyWeather(); - return null; + public void getForecast(int days, OnWeatherRetrieved callback) { + getForecast(MainActivity.getLocation(), days, callback); } - public List getForecast(int days) { - return getForecast(MainActivity.getLocation(), days); + public void getForecast(Location l, OnWeatherRetrieved callback) { + if(l == null) return; + getForecast(l.getLatitude(), l.getLongitude(), callback); } - public List getForecast(Location l) { - return getForecast(l.getLatitude(), l.getLongitude()); + public void getForecast(Location l, int days, OnWeatherRetrieved callback) { + if(l == null) return; + getForecast(l.getLatitude(), l.getLongitude(), days, callback); } - public List getForecast(Location l, int days) { - return getForecast(l.getLatitude(), l.getLongitude(), days); + public void getForecast(double lat, double lon, OnWeatherRetrieved callback) { + getForecast(lat, lon, MAX_DAYS_FORECAST, callback); } - public List getForecast(double lat, double lon) { - return getForecast(lat, lon, MAX_DAYS_FORECAST); + public void getForecast(double lat, double lon, int days, OnWeatherRetrieved callback) { + if(MainActivity.hasInternet()) getForecastOnline(lat, lon, days, callback); + else getForecastCached(lat, lon, days, 0, callback); } - public List getForecast(double lat, double lon, int days) { - if(MainActivity.hasInternet()) return getForecastOnline(lat, lon, days); - else return getForecastCached(lat, lon, days, 0); - } - - public List getForecastOnline(double lat, double lon, final int days) { - final List weatherList = new ArrayList<>(); + public void getForecastOnline(double lat, double lon, final int days, final OnWeatherRetrieved callback) { + weatherConfig.numDays = days; + weatherClient.updateWeatherConfig(weatherConfig); weatherClient.getForecastWeather(new WeatherRequest(lon, lat), new WeatherClient.ForecastWeatherEventListener() { @Override public void onWeatherRetrieved(WeatherForecast forecast) { + List weatherList = new ArrayList<>(); List foundForecasts = forecast.getForecast(); - if(foundForecasts.size() == 0) return; int dayCount = Math.min(foundForecasts.size(), days); + if(dayCount == 0) return; forecasts = new DayForecast[dayCount]; weathers = new Weather[dayCount]; for(int i=0; i getForecastCached(double lat, double lon, int days, int offset) { - return null; + public void getForecastCached(double lat, double lon, int days, int offset, OnWeatherRetrieved callback) { + return; } - public List getHistoricalWeather(long start, long end) { - return getHistoricalWeather(MainActivity.getLocation(), start, end); + public void getHistoricalWeather(long start, long end, OnWeatherRetrieved callback) { + getHistoricalWeather(MainActivity.getLocation(), start, end, callback); } - public List getHistoricalWeather(Location l, long start, long end) { - return getHistoricalWeather(l.getLatitude(), l.getLongitude(), start, end); + public void getHistoricalWeather(Location l, long start, long end, OnWeatherRetrieved callback) { + if(l == null) return; + getHistoricalWeather(l.getLatitude(), l.getLongitude(), start, end, callback); } - public List getHistoricalWeather(double lat, double lon, long start, long end){ - if(MainActivity.hasInternet()) return getHistoricalWeatherOnline(lat, lon, start, end); - else return getHistoricalWeatherCached(lat, lon, start, end); + public void getHistoricalWeather(double lat, double lon, long start, long end, OnWeatherRetrieved callback){ + if(MainActivity.hasInternet()) getHistoricalWeatherOnline(lat, lon, start, end, callback); + else getHistoricalWeatherCached(lat, lon, start, end, callback); } - public List getHistoricalWeatherOnline(double lat, double lon, long start, long end) { + public void getHistoricalWeatherOnline(double lat, double lon, long start, long end, OnWeatherRetrieved callback) { ArrayList weathers = new ArrayList<>(); Date startDate = new Date(start / 1000); //OWM uses seconds instead of milliseconds Date endDate = new Date(end / 1000); @@ -244,11 +266,11 @@ insertIntoDatabase(curr); weathers.add(curr); } - return weathers; + callback.postRetrieve(weathers); } - private List getHistoricalWeatherCached(double lat, double lon, long start, long end) { - return null; + private void getHistoricalWeatherCached(double lat, double lon, long start, long end, OnWeatherRetrieved callback) { + return; } private void insertIntoDatabase(Weather weather) { @@ -263,7 +285,7 @@ weatherDb.insertWeather(weather); } - private void displayHints(MyWeather weather) { + public void displayHints(MyWeather weather) { //TODO add more hints if (MainActivity.showWeatherHints()) { Resources res = MainActivity.getRes(); @@ -309,7 +331,7 @@ } } - private void displaySevereWeather(MyWeather weather) { + public void displaySevereWeather(MyWeather weather) { if (weather.isSevereWeather(weather.getWeatherCode())) { Log.d(MainActivity.TAG, "It is severe weather! :("); Resources res = context.getResources();