X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fweather%2FWeatherResults.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fweather%2FWeatherResults.java;h=10fd3635fd5474326dbc1ba6b3ba527f59cd132b;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/weather/WeatherResults.java b/src/tim/prune/function/weather/WeatherResults.java new file mode 100644 index 0000000..10fd363 --- /dev/null +++ b/src/tim/prune/function/weather/WeatherResults.java @@ -0,0 +1,166 @@ +package tim.prune.function.weather; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.TimeZone; + +import tim.prune.gui.DisplayUtils; + + +/** + * Model for results of weather forecast from openweathermap.org + */ +public class WeatherResults +{ + /** List of forecasts */ + private ArrayList _forecastList = new ArrayList(); + /** Flag whether the units are metric (Celsius) or not (Fahrenheit) */ + private boolean _tempsCelsius = true; + /** Location name */ + private String _locationName = null; + /** Last update timestamp */ + private String _updateTime = null; + /** Sunrise and sunset times as HH:MM */ + private String _sunriseTime = null, _sunsetTime = null; + + + /** + * Add a single forecast to this model (for the current weather) + * @param inResults current results + */ + public void setForecast(SingleForecast inResults) + { + _forecastList.clear(); + if (inResults != null) { + _forecastList.add(inResults); + } + } + + /** + * Add a list of forecasts to this model + * @param inList list of forecasts to add + */ + public void setForecasts(ArrayList inList) + { + _forecastList.clear(); + if (inList != null && inList.size() > 0) { + _forecastList.addAll(inList); + } + } + + /** @return the number of forecasts */ + public int getNumForecasts() + { + return _forecastList.size(); + } + + /** + * @param inIndex index of forecast starting from 0 + * @return the specified forecast + */ + public SingleForecast getForecast(int inIndex) + { + if (inIndex < 0 || inIndex >= getNumForecasts()) { + return null; + } + return _forecastList.get(inIndex); + } + + /** + * Clear the list of forecasts + */ + public void clear() + { + _forecastList.clear(); + _sunriseTime = _sunsetTime = null; + _updateTime = null; + } + + /** + * @param inCelsius true for celsius, false for fahrenheit + */ + public void setTempsCelsius(boolean inCelsius) + { + _tempsCelsius = inCelsius; + } + + /** @return true if this forecast uses Celsius */ + public boolean isCelsius() { + return _tempsCelsius; + } + + /** + * Set the sunrise and sunset times (only from current weather, not from forecast) + * @param inRiseTime sunrise time as YYYY-MM-DDThh:mm:ss + * @param inSetTime sunset time as YYYY-MM-DDThh:mm:ss + */ + public void setSunriseSunsetTimes(String inRiseTime, String inSetTime) + { + _sunriseTime = _sunsetTime = null; + if (inRiseTime != null && inRiseTime.length() == 19 + && inSetTime != null && inSetTime.length() == 19) + { + // Convert from UTC to system's time zone (not necessarily target's time zone!) + _sunriseTime = convertToLocalTimezone(inRiseTime.substring(11, 16)); + _sunsetTime = convertToLocalTimezone(inSetTime.substring(11, 16)); + } + } + + /** @return sunrise time as HH:MM */ + public String getSunriseTime() { + return _sunriseTime; + } + /** @return sunset time as HH:MM */ + public String getSunsetTime() { + return _sunsetTime; + } + + /** @param inName location name */ + public void setLocationName(String inName) { + _locationName = inName; + } + + /** @return location name */ + public String getLocationName() { + return _locationName; + } + + /** @param inTime timestamp of forecast */ + public void setUpdateTime(String inTime) { + _updateTime = inTime; + } + + /** @return timestamp of last update */ + public String getUpdateTime() + { + return _updateTime; + } + + /** + * Convert the given UTC time (HH:MM) into current timezone of computer + * @param inTimeString sunrise/sunset time in UTC (HH:MM) + * @return time in this timezone (HH:MM) + */ + private static String convertToLocalTimezone(String inTimeString) + { + if (inTimeString != null && inTimeString.length() == 5) + { + try + { + final int hour = Integer.parseInt(inTimeString.substring(0, 2)); + final int min = Integer.parseInt(inTimeString.substring(3)); + Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + utcCal.set(Calendar.HOUR_OF_DAY, hour); + utcCal.set(Calendar.MINUTE, min); + // Make a second calendar in the current time zone and apply values + Calendar currCal = Calendar.getInstance(); + currCal.setTimeInMillis(utcCal.getTimeInMillis()); + return DisplayUtils.makeTimeString(currCal.get(Calendar.HOUR_OF_DAY), + currCal.get(Calendar.MINUTE)); + } + catch (NumberFormatException e) {} // ignore, just drop through + } + // Couldn't be parsed / converted + return inTimeString; + } +}