X-Git-Url: http://gitweb.fperrin.net/?p=GpsPrune.git;a=blobdiff_plain;f=src%2Ftim%2Fprune%2Ffunction%2Fweather%2FSingleForecast.java;fp=src%2Ftim%2Fprune%2Ffunction%2Fweather%2FSingleForecast.java;h=cfc1947d2fd00e98947b79fb7eb7e9d9ccf0c58a;hp=0000000000000000000000000000000000000000;hb=ce6f2161b8596f7018d6a76bff79bc9e571f35fd;hpb=2d8cb72e84d5cc1089ce77baf1e34ea3ea2f8465 diff --git a/src/tim/prune/function/weather/SingleForecast.java b/src/tim/prune/function/weather/SingleForecast.java new file mode 100644 index 0000000..cfc1947 --- /dev/null +++ b/src/tim/prune/function/weather/SingleForecast.java @@ -0,0 +1,185 @@ +package tim.prune.function.weather; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +/** + * Class to represent a weather forecast + * for a single day or a 3-hour period + */ +public class SingleForecast +{ + private String _date = null; + private String _dayDescKey = null; + private String _timeFrom = null, _timeTo = null; + private String _imageName = null; + private String _desc = null; + private String _tempString = null; + private String _humidity = null; + private String _windDesc = null; + + /** For getting today's and tomorrow's dates */ + private static SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); + + /** Set the time of the forecast */ + public void setTime(String inDate, String inTimeFrom, String inTimeTo) + { + _date = inDate; + if (inTimeFrom != null && inTimeFrom.length() > 10 + && inTimeTo != null && inTimeTo.length() > 10) + { + _date = inTimeFrom.substring(0, 10); + _timeFrom = inTimeFrom.substring(11, 16); + _timeTo = inTimeTo.substring(11, 16); + } + _dayDescKey = getDayDescriptionKey(_date); + // System.out.println(_date + " is " + _dayDescKey); + } + + /** + * Set the symbol details + */ + public void setSymbol(String inNumber, String inImageCode, String inDesc) + { + _imageName = getIconName(inNumber, inImageCode); + // System.out.println("For number " + inNumber + "(" + inDesc + ") and code " + inImageCode + ", the symbol is " + _imageName); + _desc = inDesc; + } + + /** + * Set the minimum and maximum temperatures (will be rounded to nearest int) + */ + public void setTemps(String inMin, String inMax) + { + String tempMin = null, tempMax = null; + try { + tempMin = "" + Math.round(Double.parseDouble(inMin)); + } catch (Exception e) {}; // tempMin stays null if temp can't be parsed + try { + tempMax = "" + Math.round(Double.parseDouble(inMax)); + } catch (Exception e) {}; // tempMax stays null if temp can't be parsed + + _tempString = tempMin; + if (tempMin != null && tempMax != null) { + if (!tempMin.equals(tempMax)) + { + if (tempMin.charAt(0) == '-' && tempMax.charAt(0) != '-' && tempMax.charAt(0) != '0') { + // min temp is negative, max is positive, so add a + to the max + tempMax = "+" + tempMax; + } + _tempString = tempMin + " — " + tempMax; + } + } + else if (tempMax != null) { + _tempString = tempMax; + } + } + + /** Set humidity */ + public void setHumidity(String inHumidity) { + _humidity = inHumidity; + } + + /** Set description of wind */ + public void setWindDesc(String inDesc) { + _windDesc = inDesc; + } + + /** + * Get the name of the image file for the given weather report + * @param inCode numeric three-digit code, as string + * @param inImage filename as given by openweather (just used for day/night) + * @return image file using GpsPrune's icons + */ + public static String getIconName(String inCode, String inImage) + { + final boolean daytime = inImage == null || inImage.length() != 3 || inImage.charAt(2) != 'n'; + final char leadDigit = (inCode == null || inCode.equals("")) ? '0' : inCode.charAt(0); + String iconName = null; + switch (leadDigit) + { + case '2': return "storm.png"; + case '3': return "lightrain.png"; + case '5': + iconName = "rain.png"; + if (inCode.equals("500")) {iconName = "lightrain.png";} + else if (inCode.equals("511")) {iconName = "hail.png";} + break; + case '6': return "snow.png"; + case '7': return "fog.png"; + case '8': + iconName = daytime ? "clouds-day.png" : "clouds-night.png"; + if (inCode.equals("800")) {iconName = daytime ? "clear-day.png" : "clear-night.png";} + else if (inCode.equals("804")) {iconName = "clouds.png";} + break; + case '9': + iconName = "extreme.png"; + if (inCode.equals("906")) {iconName = "hail.png";} + break; + } + return iconName; + } + + /** + * MAYBE: Maybe split off into separate DateFunctions class? + * @param inDate date + * @return day description, such as "today" or "saturday" + */ + private static String getDayDescriptionKey(String inDate) + { + if (inDate == null || inDate.length() != 10) {return null;} + Calendar cal = Calendar.getInstance(); + String todaysDate = DATE_FORMATTER.format(cal.getTime()); + if (inDate.equals(todaysDate)) {return "today";} + cal.add(Calendar.DATE, 1); + String tomorrowsDate = DATE_FORMATTER.format(cal.getTime()); + if (inDate.equals(tomorrowsDate)) {return "tomorrow";} + // Construct a date with this string and find out its day + try + { + cal.setTime(DATE_FORMATTER.parse(inDate)); + switch (cal.get(Calendar.DAY_OF_WEEK)) + { + case Calendar.MONDAY : return "monday"; + case Calendar.TUESDAY : return "tuesday"; + case Calendar.WEDNESDAY : return "wednesday"; + case Calendar.THURSDAY : return "thursday"; + case Calendar.FRIDAY : return "friday"; + case Calendar.SATURDAY : return "saturday"; + case Calendar.SUNDAY : return "sunday"; + } + } + catch (ParseException pe) {} + + return "other"; + } + + /** @return true if there are times present, not just a date */ + public boolean hasTimes() { + return _timeFrom != null && _timeTo != null; + } + /** @return temperature range */ + public String getTemps() { + return _tempString; + } + + /** @return date */ + public String getDate() {return _date;} + /** @return time from */ + public String getTimeFrom() {return _timeFrom;} + /** @return time to */ + public String getTimeTo() {return _timeTo;} + /** @return day description */ + public String getDayDesc() {return _dayDescKey;} + + /** @return image name */ + public String getImageName() {return _imageName;} + /** @return description */ + public String getDescription() {return _desc;} + + /** @return humidity */ + public String getHumidity() {return _humidity;} + /** @return wind description */ + public String getWindDescription() {return _windDesc;} +}