diff --git a/app/build.gradle b/app/build.gradle index b1c1496..747bd85 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "com.odiousapps.weewxweather" minSdkVersion 19 targetSdkVersion 28 - versionCode 8010 - versionName "0.8.10" + versionCode 8011 + versionName "0.8.11" } buildTypes { release { diff --git a/app/src/main/java/com/odiousapps/weewxweather/Common.java b/app/src/main/java/com/odiousapps/weewxweather/Common.java index ad7d389..9642509 100644 --- a/app/src/main/java/com/odiousapps/weewxweather/Common.java +++ b/app/src/main/java/com/odiousapps/weewxweather/Common.java @@ -769,8 +769,8 @@ String[] processBOM2(String data, boolean showHeader) boolean metric = GetBoolPref("metric", true); boolean use_icons = GetBoolPref("use_icons", false); String desc; - String tmp; - StringBuilder out = new StringBuilder(); + String pubDate; + List days = new ArrayList<>(); try { @@ -795,7 +795,7 @@ String[] processBOM2(String data, boolean showHeader) //String DOW = obs.substring(i, j); i = j + 1; j = obs.indexOf(" ", i); - String day = obs.substring(i, j); + String date = obs.substring(i, j); i = j + 1; j = obs.indexOf(" ", i); String month = obs.substring(i, j); @@ -803,151 +803,100 @@ String[] processBOM2(String data, boolean showHeader) j = obs.length(); String year = obs.substring(i, j); - obs = hour + ":" + minute + " " + ampm + " " + day + " " + month + " " + year; + obs = hour + ":" + minute + " " + ampm + " " + date + " " + month + " " + year; SimpleDateFormat sdf = new SimpleDateFormat("h:mm aa d MMMM yyyy", Locale.getDefault()); long mdate = sdf.parse(obs).getTime(); sdf = new SimpleDateFormat("dd MMM yyyy HH:mm", Locale.getDefault()); - obs = sdf.format(mdate); - - tmp = "
" + obs + "
"; - out.append(tmp); - tmp = "\n"; - out.append(tmp); + pubDate = sdf.format(mdate); String[] bits = fcdiv.split("
"); String bit = bits[1]; - day = bit.split("", 2)[1].split("", 2)[0].trim(); - String icon = "http://www.bom.gov.au" + bit.split("\"",", 2)[1].split("", 2)[0].trim(); + day.icon = "http://www.bom.gov.au" + bit.split("\"",")) - max = bit.split("
")[1].split("
")[0].trim(); + day.max = bit.split("
")[1].split("
")[0].trim(); if(bit.contains("
")) - min = bit.split("
")[1].split("
")[0].trim(); + day.min = bit.split("
")[1].split("
")[0].trim(); String text = bit.split("
")[1].split("
")[0].trim(); - String fileName = icon.substring(icon.lastIndexOf('/') + 1, icon.length() - 4); + String fileName = day.icon.substring(day.icon.lastIndexOf('/') + 1, day.icon.length() - 4); if(!use_icons) { if(!fileName.equals("frost")) - tmp = "
"; + day.icon = "wi wi-bom-" + fileName; else - tmp = ""; + day.icon = "flaticon-thermometer"; } else { - fileName = "bom2" + icon.substring(icon.lastIndexOf('/') + 1, icon.length()).replaceAll("-", "_"); - fileName = checkImage(fileName, icon); - tmp = ""; + fileName = "bom2" + day.icon.substring(day.icon.lastIndexOf('/') + 1, day.icon.length()).replaceAll("-", "_"); + fileName = checkImage(fileName, day.icon); + day.icon = "file://" + fileName; } - out.append(tmp); - tmp = ""; - out.append(tmp); - - max = max.replaceAll("°C", "").trim(); - min = min.replaceAll("°C", "").trim(); + day.max = day.max.replaceAll("°C", "").trim(); + day.min = day.min.replaceAll("°C", "").trim(); if(metric) { - max = max + "°C"; - min = min + "°C"; + day.max += "°C"; + day.min = "°C"; } else { - max = round((Double.parseDouble(max) * 9.0 / 5.0) + 32.0) + "°F"; - min = round((Double.parseDouble(min) * 9.0 / 5.0) + 32.0) + "°F"; + day.max = round((Double.parseDouble(day.max) * 9.0 / 5.0) + 32.0) + "°F"; + day.min = round((Double.parseDouble(day.min) * 9.0 / 5.0) + 32.0) + "°F"; } - if(!max.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); - - tmp = ""; - out.append(tmp); - - if(!min.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); - - if(showHeader) - { - tmp = ""; - out.append(tmp); - } + days.add(day); for(i = 2; i < bits.length; i++) { + day = new Day(); bit = bits[i]; - day = bit.split("", 2)[1].split("", 2)[0].trim(); - icon = "http://www.bom.gov.au" + bit.split("\"",")[1].split("")[0].trim(); - min = bit.split("
")[1].split("
")[0].trim(); - text = bit.split("
")[1].split("
")[0].trim(); + day.day = bit.split("", 2)[1].split("", 2)[0].trim(); + day.icon = "http://www.bom.gov.au" + bit.split("\"",")[1].split("")[0].trim(); + day.min = bit.split("
")[1].split("
")[0].trim(); + day.text = bit.split("
")[1].split("
")[0].trim(); - fileName = icon.substring(icon.lastIndexOf('/') + 1, icon.length() - 4); + fileName = day.icon.substring(day.icon.lastIndexOf('/') + 1, day.icon.length() - 4); if(!use_icons) { if(!fileName.equals("frost")) - tmp = ""; + day.icon = "wi wi-bom-" + fileName; else - tmp = ""; + day.icon = "flaticon-thermometer"; } else { - fileName = "bom2" + icon.substring(icon.lastIndexOf('/') + 1, icon.length()).replaceAll("-", "_"); - fileName = checkImage(fileName, icon); - tmp = ""; + fileName = "bom2" + day.icon.substring(day.icon.lastIndexOf('/') + 1, day.icon.length()).replaceAll("-", "_"); + fileName = checkImage(fileName, day.icon); + day.icon = "file://" + fileName; } - out.append(tmp); - - tmp = ""; - out.append(tmp); - max = max.replaceAll("°C", "").trim(); - min = min.replaceAll("°C", "").trim(); + day.max = day.max.replaceAll("°C", "").trim(); + day.min = day.min.replaceAll("°C", "").trim(); if(metric) { - max = max + "°C"; - min = min + "°C"; + day.max = day.max + "°C"; + day.min = day.min + "°C"; } else { - max = round((Double.parseDouble(max) * 9.0 / 5.0) + 32.0) + "°F"; - min = round((Double.parseDouble(min) * 9.0 / 5.0) + 32.0) + "°F"; + day.max = round((Double.parseDouble(day.max) * 9.0 / 5.0) + 32.0) + "°F"; + day.min = round((Double.parseDouble(day.min) * 9.0 / 5.0) + 32.0) + "°F"; } - if(!max.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); - - tmp = ""; - out.append(tmp); - - if(!min.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); - - if(showHeader) - { - tmp = ""; - out.append(tmp); - } + days.add(day); } - - out.append("
" + day + "" + max + "
 
" + text + "" + min + "
 
 
" + day + "" + max + "
 
" + text + "" + min + "
 
 
"); } catch (Exception e) { e.printStackTrace(); return null; } - return new String[]{out.toString(), desc}; + return new String[]{generateForecast(days, pubDate, showHeader), desc}; } String[] processMET(String data) @@ -955,82 +904,70 @@ String[] processMET(String data) return processMET(data, false); } + @SuppressWarnings("StringConcatenationInLoop") String[] processMET(String data, boolean showHeader) { if(data == null || data.equals("")) return null; - //boolean metric = GetBoolPref("metric", true); + boolean metric = GetBoolPref("metric", true); boolean use_icons = GetBoolPref("use_icons", false); long mdate = (long)GetIntPref("rssCheck", 0) * 1000; SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy HH:mm", Locale.getDefault()); String lastupdate = sdf.format(mdate); - - String tmp; - StringBuilder out = new StringBuilder(); String desc; + List days = new ArrayList<>(); try { desc = data.split("", 2)[1].split(" weather - Met Office",2)[0].trim(); - tmp = "
" + lastupdate + "
"; - out.append(tmp); - tmp = "\n"; - out.append(tmp); - String[] forecasts = data.split(""; + day.icon = "wi wi-metoffice-" + fileName.substring(0, fileName.lastIndexOf(".")); } else { fileName = checkImage("met" + fileName, null); - tmp = ""; + day.icon = "file://" + fileName; } - out.append(tmp); - - tmp = ""; - out.append(tmp); - - tmp = ""; - out.append(tmp); - - tmp = ""; - out.append(tmp); - tmp = ""; - out.append(tmp); - - if(showHeader) + if(metric) { - tmp = ""; - out.append(tmp); + day.max += "°C"; + day.min += "°C"; + } else { + day.max = round((Double.parseDouble(day.max) * 9.0 / 5.0) + 32.0) + "°F"; + day.min = round((Double.parseDouble(day.min) * 9.0 / 5.0) + 32.0) + "°F"; } - } - out.append("
" + date + "" + max + "
" + text + "" + min + "
 
"); + days.add(day); + } } catch (Exception e) { e.printStackTrace(); return null; } - return new String[]{out.toString(), desc}; + return new String[]{generateForecast(days, lastupdate, showHeader), desc}; } String[] processWCA(String data) @@ -1324,12 +1261,6 @@ else if(div.get(j).select("div").html().contains("Nuit")) else tmp = "" + pop + ""; out.append(tmp); - - if(showHeader) - { - tmp = " "; - out.append(tmp); - } } } @@ -1611,6 +1542,7 @@ String[] processBOM(String data) return processBOM(data, false); } + @SuppressWarnings("StringConcatenationInLoop") String[] processBOM(String data, boolean showHeader) { if(data == null || data.equals("")) @@ -1619,7 +1551,8 @@ String[] processBOM(String data, boolean showHeader) boolean metric = GetBoolPref("metric", true); boolean use_icons = GetBoolPref("use_icons", false); String desc; - StringBuilder out = new StringBuilder(); + String ftime; + List days = new ArrayList<>(); try { @@ -1630,26 +1563,20 @@ String[] processBOM(String data, boolean showHeader) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.getDefault()); long mdate = sdf.parse(tmp).getTime(); sdf = new SimpleDateFormat("dd MMM yyyy HH:mm", Locale.getDefault()); - String date = sdf.format(mdate); - - tmp = "
" + date + "
"; - out.append(tmp); - tmp = "\n"; - out.append(tmp); + ftime = sdf.format(mdate); JSONArray jarr = jobj.getJSONArray("forecast-period"); for(int i = 0; i < jarr.length(); i++) { - String text = ""; + Day day = new Day(); String code = ""; - String min = ""; - String max = ""; + JSONObject j = jarr.getJSONObject(i); for(int x = 0; x < j.getJSONArray("text").length(); x++) { if(j.getJSONArray("text").getJSONObject(x).getString("type").equals("precis")) { - text = j.getJSONArray("text").getJSONObject(x).getString("content"); + day.text = j.getJSONArray("text").getJSONObject(x).getString("content"); break; } } @@ -1663,74 +1590,52 @@ String[] processBOM(String data, boolean showHeader) code = jarr2.getJSONObject(x).getString("content"); if (jarr2.getJSONObject(x).getString("type").equals("air_temperature_minimum")) - min = jarr2.getJSONObject(x).getString("content"); + day.min = jarr2.getJSONObject(x).getString("content"); if (jarr2.getJSONObject(x).getString("type").equals("air_temperature_maximum")) - max = jarr2.getJSONObject(x).getString("content"); + day.max = jarr2.getJSONObject(x).getString("content"); } } catch (JSONException e) { code = j.getJSONObject("element").getString("content"); } - date = j.getString("start-time-local").trim(); + String date = j.getString("start-time-local").trim(); sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.getDefault()); mdate = sdf.parse(date).getTime(); sdf = new SimpleDateFormat("EEEE", Locale.getDefault()); - date = sdf.format(mdate); + day.day = sdf.format(mdate); if(!use_icons) { if(!code.equals("14")) - tmp = ""; + day.icon = "wi wi-bom-ftp-" + code; else - tmp = ""; + day.icon = "flaticon-thermometer"; } else { String fileName = checkImage("bom" + code + ".png", null); - tmp = ""; + day.icon = "file://" + fileName; } - out.append(tmp); - - tmp = ""; - out.append(tmp); if(metric) { - max = max + "°C"; - min = min + "°C"; + day.max += "°C"; + day.min += "°C"; } else { - max = round((Double.parseDouble(max) * 9.0 / 5.0) + 32.0) + "°F"; - min = round((Double.parseDouble(min) * 9.0 / 5.0) + 32.0) + "°F"; + day.max = round((Double.parseDouble(day.max) * 9.0 / 5.0) + 32.0) + "°F"; + day.min = round((Double.parseDouble(day.min) * 9.0 / 5.0) + 32.0) + "°F"; } - if(!max.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); - - tmp = ""; - out.append(tmp); - - if(!min.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); + if(day.max.equals("°C") || day.max.equals("°F")) + day.max = "N/A"; - if(showHeader) - { - tmp = ""; - out.append(tmp); - } + days.add(day); } - - out.append("
" + date + "" + max + "
 
" + text + "" + min + "
 
 
"); } catch (Exception e) { e.printStackTrace(); return null; } - return new String[]{out.toString(), desc}; + return new String[]{generateForecast(days, ftime, showHeader), desc}; } String[] processMetService(String data) @@ -1738,6 +1643,7 @@ String[] processMetService(String data) return processMetService(data, false); } + @SuppressWarnings("StringConcatenationInLoop") String[] processMetService(String data, boolean showHeader) { if (data == null || data.equals("")) @@ -1745,15 +1651,14 @@ String[] processMetService(String data, boolean showHeader) boolean metric = GetBoolPref("metric", true); boolean use_icons = GetBoolPref("use_icons", false); - StringBuilder out = new StringBuilder(); - String tmp; + List days = new ArrayList<>(); String desc; try { JSONObject jobj = new JSONObject(data); - JSONArray days = jobj.getJSONArray("days"); - String ftime = days.getJSONObject(0).getString("issuedAtISO"); + JSONArray loop = jobj.getJSONArray("days"); + String ftime = loop.getJSONObject(0).getString("issuedAtISO"); desc = jobj.getString("locationECWasp") + ", New Zealand"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.getDefault()); @@ -1761,75 +1666,46 @@ String[] processMetService(String data, boolean showHeader) sdf = new SimpleDateFormat("dd MMM yyyy HH:mm", Locale.getDefault()); ftime = sdf.format(mdate); - tmp = "
" + ftime + "
"; - out.append(tmp); - tmp = "\n"; - out.append(tmp); - - for(int i = 0; i < days.length(); i++) + for(int i = 0; i < loop.length(); i++) { - JSONObject jtmp = days.getJSONObject(i); - String dow = jtmp.getString("dow"); - String text = jtmp.getString("forecast"); - String max = jtmp.getString("max"); - String min = jtmp.getString("min"); - String icon; + Day day = new Day(); + JSONObject jtmp = loop.getJSONObject(i); + day.day = jtmp.getString("dow"); + day.text = jtmp.getString("forecast"); + day.max = jtmp.getString("max"); + day.min = jtmp.getString("min"); if(jtmp.has("partDayData")) - icon = jtmp.getJSONObject("partDayData").getJSONObject("afternoon").getString("forecastWord"); + day.icon = jtmp.getJSONObject("partDayData").getJSONObject("afternoon").getString("forecastWord"); else - icon = jtmp.getString("forecastWord"); + day.icon = jtmp.getString("forecastWord"); - icon = icon.toLowerCase().replaceAll(" ", "-").trim(); + day.icon = day.icon.toLowerCase().replaceAll(" ", "-").trim(); if(!use_icons) { - if(!icon.equals("frost")) - tmp = ""; + if(!day.icon.equals("frost")) + day.icon = "wi wi-metservice-" + day.icon; else - tmp = ""; + day.icon = "flaticon-thermometer"; } else { - icon = icon.replaceAll("-", "_"); - String fileName = checkImage("ms_" + icon + ".png", null); - tmp = ""; + day.icon = day.icon.replaceAll("-", "_"); + String fileName = checkImage("ms_" + day.icon + ".png", null); + day.icon = "file://" + fileName; } - out.append(tmp); - - tmp = ""; - out.append(tmp); if(metric) { - max = max + "°C"; - min = min + "°C"; + day.max += "°C"; + day.min += "°C"; } else { - max = round((Double.parseDouble(max) * 9.0 / 5.0) + 32.0) + "°F"; - min = round((Double.parseDouble(min) * 9.0 / 5.0) + 32.0) + "°F"; + day.max = round((Double.parseDouble(day.max) * 9.0 / 5.0) + 32.0) + "°F"; + day.min = round((Double.parseDouble(day.min) * 9.0 / 5.0) + 32.0) + "°F"; } - if(!max.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); - - tmp = ""; - out.append(tmp); - - if(!min.equals("°C")) - tmp = ""; - else - tmp = ""; - out.append(tmp); - - if(showHeader) - { - tmp = ""; - out.append(tmp); - } + days.add(day); } - out.append("
" + dow + "" + max + "
 
" + text + "" + min + "
 
 
"); - return new String[]{out.toString(), desc}; + return new String[]{generateForecast(days, ftime, showHeader), desc}; } catch (Exception e) { e.printStackTrace(); } @@ -1849,8 +1725,7 @@ String[] processDWD(String data, boolean showHeader) boolean metric = GetBoolPref("metric", true); boolean use_icons = GetBoolPref("use_icons", false); - StringBuilder out = new StringBuilder(); - String tmp; + List days = new ArrayList<>(); String desc = ""; try @@ -1868,22 +1743,17 @@ String[] processDWD(String data, boolean showHeader) sdf = new SimpleDateFormat("dd MMM yyyy HH:mm", Locale.getDefault()); ftime = sdf.format(mdate); - tmp = "
" + ftime + "
"; - out.append(tmp); - tmp = "\n"; - out.append(tmp); - data = data.split("", 2)[1].split("
Vorhersage
", 2)[0].trim(); - bits = data.split("", 2).length > 1) - day = bit.split("", 2)[1].split("", 2)[0].trim(); + d = bit.split("", 2)[1].split("", 2)[0].trim(); else - day = bit.split("", 2)[1].split("", 2)[0].trim(); + d = bit.split("", 2)[1].split("", 2)[0].trim(); if(bit.split(" 1) icon = bit.split("\"",2)[0].trim();"; + day.icon = "wi wi-dwd-" + icon; else - tmp = ""; + day.icon = "flaticon-thermometer"; } else { - tmp = ""; + day.icon = "file://" + fileName; } - out.append(tmp); - - tmp = "" + day + ""; - out.append(tmp); + day.day = d; + day.min = "°C"; if(metric) - temp = temp + "°C"; + day.max = temp + "°C"; else - temp = round((Double.parseDouble(temp) * 9.0 / 5.0) + 32.0) + "°F"; - - if(!temp.equals("°C")) - tmp = "" + temp + ""; - else - tmp = " "; - out.append(tmp); + day.max = round((Double.parseDouble(temp) * 9.0 / 5.0) + 32.0) + "°F"; - tmp = " "; - out.append(tmp); - - tmp = " "; - out.append(tmp); - - if(showHeader) - { - tmp = " "; - out.append(tmp); - } + days.add(day); } - - out.append(""); - return new String[]{out.toString(), desc}; + return new String[]{generateForecast(days, ftime, showHeader), desc}; } catch (Exception e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/odiousapps/weewxweather/Day.java b/app/src/main/java/com/odiousapps/weewxweather/Day.java index 2ef2767..c226cfd 100644 --- a/app/src/main/java/com/odiousapps/weewxweather/Day.java +++ b/app/src/main/java/com/odiousapps/weewxweather/Day.java @@ -2,11 +2,11 @@ class Day { - String day; - String icon; - String max; - String text; - String min; + String day = ""; + String icon = ""; + String text = ""; + String max = ""; + String min = ""; public String toString() {