]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - src/tim/prune/function/weather/WeatherResults.java
Moved source into separate src directory due to popular request
[GpsPrune.git] / src / tim / prune / function / weather / WeatherResults.java
diff --git a/src/tim/prune/function/weather/WeatherResults.java b/src/tim/prune/function/weather/WeatherResults.java
new file mode 100644 (file)
index 0000000..10fd363
--- /dev/null
@@ -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<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;
+       }
+}