+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<SingleForecast> _forecastList = new ArrayList<SingleForecast>();
+ /** 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<SingleForecast> 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;
+ }
+}