kopia lustrzana https://github.com/SP8EBC/MeteoSystem
handling old and missing data on wind rose and station summary
rodzic
43c9ddc45d
commit
5eee31fc41
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package cc.pogoda.mobile.pogodacc.type.web;
|
||||
|
||||
public enum QualityFactor {
|
||||
UNSET,
|
||||
FULL,
|
||||
DEGRADED,
|
||||
NOT_AVALIABLE;
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -163,7 +163,7 @@
|
|||
android:layout_span="2">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView14"
|
||||
android:id="@+id/textViewSummaryMessage"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:scrollIndicators="right"
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
android:id="@+id/textViewWindRoseWindSpeed"
|
||||
android:layout_width="152dp"
|
||||
android:layout_height="69dp"
|
||||
android:text="Średnia"
|
||||
android:text="@string/mean_value"
|
||||
android:textAlignment="center"
|
||||
android:textSize="28sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/guidelineRoseSDown"
|
||||
|
@ -62,7 +62,7 @@
|
|||
android:id="@+id/textViewWindRoseWindDirection"
|
||||
android:layout_width="152dp"
|
||||
android:layout_height="69dp"
|
||||
android:text="Kierunek"
|
||||
android:text="@string/wind_direction_short"
|
||||
android:textAlignment="center"
|
||||
android:textSize="28sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/guidelineRoseSDown"
|
||||
|
@ -76,7 +76,7 @@
|
|||
android:id="@+id/textViewWindRoseTemperatura"
|
||||
android:layout_width="152dp"
|
||||
android:layout_height="69dp"
|
||||
android:text="Temp"
|
||||
android:text="@string/temperature_short"
|
||||
android:textAlignment="center"
|
||||
android:textSize="28sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/guidelineRoseSDown"
|
||||
|
@ -90,7 +90,7 @@
|
|||
android:id="@+id/textViewWindRoseWindGusts"
|
||||
android:layout_width="152dp"
|
||||
android:layout_height="70dp"
|
||||
android:text="Poryw"
|
||||
android:text="@string/wind_gust_short"
|
||||
android:textAlignment="center"
|
||||
android:textSize="28sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/guidelineRoseSDown"
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
<string name="add">Add</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="delete_fav">Delete from favourities</string>
|
||||
<string name="station_not_comm">Warning! This station doesn\'t send any data for longer than 4 hours</string>
|
||||
<string name="station_not_comm">Warning! This station doesn\'t send any data for longer than 2 hours</string>
|
||||
<string name="station_disabled">Warning! This station has been temporarily disabled or it is not functional for long time</string>
|
||||
<string name="archive_data">Archival Data</string>
|
||||
<string name="export_from">Export From</string>
|
||||
|
@ -46,6 +46,10 @@
|
|||
<string name="wind_direction_short">Direction</string>
|
||||
<string name="temperature_short">Tempr</string>
|
||||
<string name="degress">Degrees</string>
|
||||
<string name="max_1h_gust">Maximum gust in last 1h</string>
|
||||
<string name="min_1h_avg">Minimum average in last 1h</string>
|
||||
<string name="max_1h_gust">Max gust in last hour</string>
|
||||
<string name="min_1h_avg">Min average in last hour</string>
|
||||
<string name="no_data">No data</string>
|
||||
<string name="warning">Warning!</string>
|
||||
<string name="station_doesnt_transmit">Station doesn\'t transmit data</string>
|
||||
<string name="for_longer_than_2_hours">for longer than 2 hours</string>
|
||||
</resources>
|
|
@ -48,4 +48,8 @@
|
|||
<string name="degress">-</string>
|
||||
<string name="max_1h_gust">-</string>
|
||||
<string name="min_1h_avg">-</string>
|
||||
<string name="no_data">-</string>
|
||||
<string name="warning">-</string>
|
||||
<string name="station_doesnt_transmit">-</string>
|
||||
<string name="for_longer_than_2_hours">-</string>
|
||||
</resources>
|
|
@ -48,5 +48,9 @@
|
|||
<string name="degress">-</string>
|
||||
<string name="max_1h_gust">-</string>
|
||||
<string name="min_1h_avg">-</string>
|
||||
<string name="no_data">-</string>
|
||||
<string name="warning">-</string>
|
||||
<string name="station_doesnt_transmit">-</string>
|
||||
<string name="for_longer_than_2_hours">-</string>
|
||||
|
||||
</resources>
|
|
@ -19,7 +19,7 @@
|
|||
<string name="add">Dodaj</string>
|
||||
<string name="delete">Usuń</string>
|
||||
<string name="delete_fav">Usuń z ulubionych</string>
|
||||
<string name="station_not_comm">Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 4 godzin</string>
|
||||
<string name="station_not_comm">Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 2 godzin</string>
|
||||
<string name="station_disabled">Uwaga! Stacja została tymczasowo wyłączona bądź nie pracuje od dłuższego czasu</string>
|
||||
<string name="archive_data">Dane Archiwalne</string>
|
||||
<string name="export_from">Exportuj do</string>
|
||||
|
@ -48,4 +48,8 @@
|
|||
<string name="degress">Stopni</string>
|
||||
<string name="max_1h_gust">Maks poryw w ost godzinie</string>
|
||||
<string name="min_1h_avg">Min prędkość w ost godzinie</string>
|
||||
<string name="no_data">Brak Danych</string>
|
||||
<string name="warning">Uwaga!</string>
|
||||
<string name="station_doesnt_transmit">Stacja nie wysyła danych</string>
|
||||
<string name="for_longer_than_2_hours">dłużej niż dwie godziny</string>
|
||||
</resources>
|
|
@ -19,7 +19,7 @@
|
|||
<string name="add">Dodaj</string>
|
||||
<string name="delete">Usuń</string>
|
||||
<string name="delete_fav">Usuń z ulubionych</string>
|
||||
<string name="station_not_comm">Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 4 godzin</string>
|
||||
<string name="station_not_comm">Uwaga! Ta stacja nie wysyła żadnych danych dłużej niż od 2 godzin</string>
|
||||
<string name="station_disabled">Uwaga! Stacja została tymczasowo wyłączona bądź nie pracuje od dłuższego czasu</string>
|
||||
<string name="archive_data">Dane Archiwalne</string>
|
||||
<string name="export_from">Eksportuj od</string>
|
||||
|
@ -48,4 +48,8 @@
|
|||
<string name="degress">Stopni</string>
|
||||
<string name="max_1h_gust">Maks poryw w ost godzinie</string>
|
||||
<string name="min_1h_avg">Min prędkość w ost godzinie</string>
|
||||
<string name="no_data">Brak Danych</string>
|
||||
<string name="warning">Uwaga!</string>
|
||||
<string name="station_doesnt_transmit">Stacja nie wysyła danych</string>
|
||||
<string name="for_longer_than_2_hours">dłużej niż dwie godziny</string>
|
||||
</resources>
|
|
@ -18,7 +18,7 @@
|
|||
<string name="add">Add</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="delete_fav">Delete from favourities</string>
|
||||
<string name="station_not_comm">Warning! This station doesn\'t send any data for longer than 4 hours</string>
|
||||
<string name="station_not_comm">Warning! This station doesn\'t send any data for longer than 2 hours</string>
|
||||
<string name="station_disabled">Warning! This station has been temporarily disabled or it is not functional for long time</string>
|
||||
<string name="archive_data">Archival Data</string>
|
||||
<string name="export_from">Export From</string>
|
||||
|
@ -50,6 +50,10 @@
|
|||
<string name="temperature_short">Tempr</string>
|
||||
<string name="degress">Degrees</string>
|
||||
<string name="degrees_sign" translatable="false">°</string>
|
||||
<string name="max_1h_gust">Maximum gust in last 1h</string>
|
||||
<string name="min_1h_avg">Minimum average in last 1h</string>
|
||||
<string name="max_1h_gust">Max gust in last hour</string>
|
||||
<string name="min_1h_avg">Min average in last hour</string>
|
||||
<string name="no_data">No data</string>
|
||||
<string name="warning">Warning!</string>
|
||||
<string name="station_doesnt_transmit">Station doesn\'t transmit data</string>
|
||||
<string name="for_longer_than_2_hours">for longer than 2 hours</string>
|
||||
</resources>
|
Ładowanie…
Reference in New Issue