diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java index 7bb000c..753fe55 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsPlotsWind.java @@ -5,7 +5,6 @@ import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.graphics.Typeface; import android.os.Bundle; -import android.view.Menu; import android.view.MenuItem; import android.widget.SeekBar; import android.widget.TextView; @@ -25,10 +24,7 @@ import org.threeten.bp.ZonedDateTime; import org.threeten.bp.format.DateTimeFormatter; import org.threeten.bp.format.FormatStyle; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; -import java.util.Locale; import cc.pogoda.mobile.pogodacc.R; import cc.pogoda.mobile.pogodacc.activity.handler.WindPlotClickEvent; diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java index 41f362f..c475ab4 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/StationDetailsSummaryActivity.java @@ -43,6 +43,8 @@ public class StationDetailsSummaryActivity extends AppCompatActivity { elems.wind_speed_val = findViewById(R.id.textViewWindSpeedValue); elems.temperature_val = findViewById(R.id.textViewTemperatureValue); elems.qnh_val = findViewById(R.id.textViewQnhVaue); + elems.humidity_val = findViewById(R.id.textViewHumidityValue); + elems.message = findViewById(R.id.textViewSummaryMessage); summary = summary_dao.getStationSummary(station.getSystemName()); diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsValuesUpdater.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsValuesUpdater.java index 51ecc26..d3779bc 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsValuesUpdater.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/StationDetailsValuesUpdater.java @@ -7,6 +7,8 @@ import cc.pogoda.mobile.pogodacc.type.StationActivityElements; import cc.pogoda.mobile.pogodacc.type.StationSummaryActElements; import cc.pogoda.mobile.pogodacc.type.web.Summary; + + /** * Class used to update the content of Wind Rose Activity */ diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java index d965059..9646d39 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/dao/SummaryDao.java @@ -2,6 +2,7 @@ package cc.pogoda.mobile.pogodacc.dao; import java.io.IOException; +import cc.pogoda.mobile.pogodacc.type.web.QualityFactor; import cc.pogoda.mobile.pogodacc.type.web.Summary; import cc.pogoda.mobile.pogodacc.web.RestClientConfig; import cc.pogoda.mobile.pogodacc.web.SummaryConsumer; @@ -46,6 +47,12 @@ public class SummaryDao { if (response != null) { out = response.body(); + + if (out != null) { + out.temperature_qf_native = QualityFactor.valueOf(out.temperature_qf); + out.wind_qf_native = QualityFactor.valueOf(out.wind_qf); + out.humidity_qf_native = QualityFactor.valueOf(out.humidity_qf); + } } } catch (InterruptedException e) { e.printStackTrace(); diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java index d7bea85..cb2a3c7 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationSummaryActElements.java @@ -1,8 +1,20 @@ package cc.pogoda.mobile.pogodacc.type; import android.app.Activity; +import android.content.res.ColorStateList; +import android.graphics.Color; import android.widget.TextView; +import androidx.core.graphics.ColorUtils; + +import org.threeten.bp.Duration; +import org.threeten.bp.LocalDateTime; +import org.threeten.bp.OffsetDateTime; +import org.threeten.bp.ZoneOffset; +import org.threeten.bp.ZonedDateTime; +import org.threeten.bp.temporal.ChronoUnit; + +import cc.pogoda.mobile.pogodacc.R; import cc.pogoda.mobile.pogodacc.type.web.Summary; public class StationSummaryActElements implements StationActivityElements { @@ -14,6 +26,7 @@ public class StationSummaryActElements implements StationActivityElements { public TextView temperature_val = null; public TextView qnh_val = null; public TextView humidity_val = null; + public TextView message = null; private String convertDegreesToDir(int directionInDegrees) { String out = null; @@ -57,6 +70,43 @@ public class StationSummaryActElements implements StationActivityElements { } public void updateFromSummary(Summary s) { + + if (s == null) { + // print a message in case there is no data available + wind_speed_val.setText(R.string.no_data); + wind_gusts_val.setText(R.string.no_data); + wind_dir_val.setText(R.string.no_data); + temperature_val.setText(R.string.no_data); + qnh_val.setText(R.string.no_data); + humidity_val.setText(R.string.no_data); + + message.setText(R.string.no_data); + + return; + } + + // convert the integer with unix epoch timestamp to LocalDateTime in current system Time Zone + LocalDateTime last_station_data = LocalDateTime.ofEpochSecond(s.last_timestamp, 0, ZonedDateTime.now().getOffset()); + + // current date and time (in current time zone set in system configuration) + LocalDateTime current = LocalDateTime.now(); + + long minutes_difference = last_station_data.until(current, ChronoUnit.MINUTES); + + // calculate the duration between + Duration duration = Duration.between(last_station_data, current); + + // check how old the last data from stations is + if (duration.getSeconds() < 7200) { + // if the last data is no older than 2 hours + message.setText(R.string.auto_refresh); + message.setTextColor(Color.BLACK); + } + else { + message.setText(R.string.station_not_comm); + message.setTextColor(Color.argb(0xFF, 0xFF, 0x0, 0x0)); + } + if (wind_speed_val != null) wind_speed_val.setText(String.format("%.1f m/s", s.average_speed)); @@ -73,7 +123,7 @@ public class StationSummaryActElements implements StationActivityElements { qnh_val.setText(String.format("%d hPa", s.qnh)); if (humidity_val != null) - humidity_val.setText(String.format("%d %", s.humidity)); + humidity_val.setText(String.format("%d %%", s.humidity)); } @Override diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationWindRoseActElements.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationWindRoseActElements.java index e3e98f2..fdeacf7 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationWindRoseActElements.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/StationWindRoseActElements.java @@ -2,12 +2,17 @@ package cc.pogoda.mobile.pogodacc.type; import android.app.Activity; import android.content.Context; +import android.graphics.Color; import android.widget.ImageView; import android.widget.TextView; +import org.threeten.bp.Duration; +import org.threeten.bp.LocalDateTime; +import org.threeten.bp.ZonedDateTime; import org.w3c.dom.Text; import cc.pogoda.mobile.pogodacc.R; +import cc.pogoda.mobile.pogodacc.type.web.QualityFactor; import cc.pogoda.mobile.pogodacc.type.web.Summary; public class StationWindRoseActElements implements StationActivityElements { @@ -46,42 +51,107 @@ public class StationWindRoseActElements implements StationActivityElements { @Override public void updateFromSummary(Summary s) { - if (activity == null ) { + // data to be displayed + Summary data; + + // set to true if no_data string shall be displayed instead of parameters + boolean no_data = false; + + LocalDateTime last_station_data; + + // set to true if the data is old (older than 2 hours) + boolean old_data = false; + + if (activity == null) { return; } - if (windArrow != null) { - windArrow.setRotation(s.direction - 225.0f); + // check if any data has been passed to this method + if (s == null) { + data = new Summary(); + + // set to 180 to rotate the arrow towards the top of a screen + data.direction = 180; + + // set the flag to true to show '---' or 'no data' instead of zeros + no_data = true; + } + else { + data = s; + + // convert the integer with unix epoch timestamp to LocalDateTime in current system Time Zone + last_station_data = LocalDateTime.ofEpochSecond(data.last_timestamp, 0, ZonedDateTime.now().getOffset()); + + // current date and time (in current time zone set in system configuration) + LocalDateTime current = LocalDateTime.now(); + + // calculate the duration between + Duration duration = Duration.between(last_station_data, current); + + // if station is not communicating for longer than 2 hours + if (duration.getSeconds() > 7200) { + old_data = true; + } } - if (windSpeed != null) { - windSpeed.setText(activity.getResources().getString(R.string.mean_value) + '\n' + s.average_speed + "m/s"); + // check if wind data is avaliable in the input data set + if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) { + windArrow.setRotation(data.direction - 225.0f); + } + else { + // if now wind data is avaliable in the input set move the arrow + // to point towards the N + windArrow.setRotation(180.0f - 225.0f); } - if (windGusts != null) { - windGusts.setText(activity.getResources().getString(R.string.wind_gust_short) + '\n' + s.gusts + "m/s"); + if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) { + windSpeed.setText(activity.getResources().getString(R.string.mean_value) + '\n' + data.average_speed + "m/s"); + } + else { + windSpeed.setText(activity.getResources().getString(R.string.mean_value) + '\n' + "---"); } - if (windDirection != null) { - windDirection.setText(activity.getResources().getString(R.string.wind_direction_short) + '\n' + s.direction + activity.getResources().getString(R.string.degrees_sign)); + if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) { + windGusts.setText(activity.getResources().getString(R.string.wind_gust_short) + '\n' + data.gusts + "m/s"); } - - if (temperature != null) { - temperature.setText(activity.getResources().getString(R.string.temperature_short) + '\n' + String.format("%.1f", s.avg_temperature) + "°C"); + else { + windGusts.setText(activity.getResources().getString(R.string.wind_gust_short) + '\n' + "---"); } - if (pressure != null) { - pressure.setText(activity.getResources().getString(R.string.qnh) + ": " + String.format("%d hPa", s.qnh)); + if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) { + windDirection.setText(activity.getResources().getString(R.string.wind_direction_short) + '\n' + data.direction + activity.getResources().getString(R.string.degrees_sign)); + } + else { + windDirection.setText(activity.getResources().getString(R.string.wind_direction_short) + '\n' + "---"); } - if (maxGust != null) { - maxGust.setText(activity.getResources().getString(R.string.max_1h_gust) + ": " + s.hour_gusts + "m/s"); + // check if temperature is avaliable in input data set + if (!no_data && !data.temperature_qf_native.equals(QualityFactor.NOT_AVALIABLE)) { + temperature.setText(activity.getResources().getString(R.string.temperature_short) + '\n' + String.format("%.1f", data.avg_temperature) + "°C"); + } + else { + temperature.setText(activity.getResources().getString(R.string.temperature_short) + '\n' + "---"); } - if (minAverage != null) { - minAverage.setText(activity.getResources().getString(R.string.min_1h_avg) + ": " + s.hour_min_average_speed + "m/s"); - + if (!no_data && !old_data) { + pressure.setText(activity.getResources().getString(R.string.qnh) + ": " + String.format("%d hPa", data.qnh)); + maxGust.setText(activity.getResources().getString(R.string.max_1h_gust) + ": " + data.hour_gusts + "m/s"); + minAverage.setText(activity.getResources().getString(R.string.min_1h_avg) + ": " + data.hour_min_average_speed + "m/s"); + } + else if (!no_data && old_data) { + maxGust.setText(activity.getResources().getString(R.string.warning)); + maxGust.setTextColor(Color.RED); + minAverage.setText(activity.getResources().getString(R.string.station_doesnt_transmit)); + pressure.setText(activity.getResources().getString(R.string.for_longer_than_2_hours)); + } + else { + maxGust.setText(activity.getResources().getString(R.string.no_data)); + maxGust.setTextColor(Color.RED); + minAverage.setText(""); + minAverage.setTextColor(Color.RED); + pressure.setText(""); + pressure.setTextColor(Color.RED); } } diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/QualityFactor.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/QualityFactor.java new file mode 100644 index 0000000..3b46e6e --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/QualityFactor.java @@ -0,0 +1,9 @@ +package cc.pogoda.mobile.pogodacc.type.web; + +public enum QualityFactor { + UNSET, + FULL, + DEGRADED, + NOT_AVALIABLE; + +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java index 2601254..37b130a 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/type/web/Summary.java @@ -10,14 +10,20 @@ public class Summary { public String temperature_qf; + public QualityFactor temperature_qf_native; + public short qnh; public String qnh_qf; + public QualityFactor qnh_qf_native; + public byte humidity; public String humidity_qf; + public QualityFactor humidity_qf_native; + public short direction; public float average_speed; @@ -32,4 +38,12 @@ public class Summary { public String wind_qf; + public QualityFactor wind_qf_native; + + public Summary() { + temperature_qf_native = QualityFactor.UNSET; + humidity_qf_native = QualityFactor.UNSET; + wind_qf_native = QualityFactor.UNSET; + } + } diff --git a/app/src/main/res/layout/activity_station_details_summary.xml b/app/src/main/res/layout/activity_station_details_summary.xml index 88b4836..67cf801 100644 --- a/app/src/main/res/layout/activity_station_details_summary.xml +++ b/app/src/main/res/layout/activity_station_details_summary.xml @@ -163,7 +163,7 @@ android:layout_span="2"> Add Delete Delete from favourities - Warning! This station doesn\'t send any data for longer than 4 hours + Warning! This station doesn\'t send any data for longer than 2 hours Warning! This station has been temporarily disabled or it is not functional for long time Archival Data Export From @@ -46,6 +46,10 @@ Direction Tempr Degrees - Maximum gust in last 1h - Minimum average in last 1h + Max gust in last hour + Min average in last hour + No data + Warning! + Station doesn\'t transmit data + for longer than 2 hours \ No newline at end of file diff --git a/app/src/main/res/values-lv-rLV/strings.xml b/app/src/main/res/values-lv-rLV/strings.xml index 6dfce9c..04688fd 100644 --- a/app/src/main/res/values-lv-rLV/strings.xml +++ b/app/src/main/res/values-lv-rLV/strings.xml @@ -48,4 +48,8 @@ - - - + - + - + - + - \ No newline at end of file diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index a50d64c..1250e7b 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -48,5 +48,9 @@ - - - + - + - + - + - \ No newline at end of file diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 0b56b1b..6b84f21 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -19,7 +19,7 @@ Dodaj Usuń Usuń z ulubionych - Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 4 godzin + Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 2 godzin Uwaga! Stacja została tymczasowo wyłączona bądź nie pracuje od dłuższego czasu Dane Archiwalne Exportuj do @@ -48,4 +48,8 @@ Stopni Maks poryw w ost godzinie Min prędkość w ost godzinie + Brak Danych + Uwaga! + Stacja nie wysyła danych + dłużej niż dwie godziny \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 99b4d36..b7935f7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -19,7 +19,7 @@ Dodaj Usuń Usuń z ulubionych - Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 4 godzin + Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 2 godzin Uwaga! Stacja została tymczasowo wyłączona bądź nie pracuje od dłuższego czasu Dane Archiwalne Eksportuj od @@ -48,4 +48,8 @@ Stopni Maks poryw w ost godzinie Min prędkość w ost godzinie + Brak Danych + Uwaga! + Stacja nie wysyła danych + dłużej niż dwie godziny \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 496240d..4e71bb9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,7 +18,7 @@ Add Delete Delete from favourities - Warning! This station doesn\'t send any data for longer than 4 hours + Warning! This station doesn\'t send any data for longer than 2 hours Warning! This station has been temporarily disabled or it is not functional for long time Archival Data Export From @@ -50,6 +50,10 @@ Tempr Degrees ° - Maximum gust in last 1h - Minimum average in last 1h + Max gust in last hour + Min average in last hour + No data + Warning! + Station doesn\'t transmit data + for longer than 2 hours \ No newline at end of file