MeteoSystem/app/src/main/java/cc/pogoda/mobile/meteosystem/type/StationWindRoseActElements....

182 wiersze
6.2 KiB
Java

package cc.pogoda.mobile.meteosystem.type;
import android.app.Activity;
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.threeten.bp.format.DateTimeFormatter;
import org.tinylog.Logger;
import cc.pogoda.mobile.meteosystem.R;
import cc.pogoda.mobile.meteosystem.type.web.QualityFactor;
import cc.pogoda.mobile.meteosystem.type.web.Summary;
public class StationWindRoseActElements implements StationActivityElements {
public ImageView windArrow;
public TextView windSpeed;
public TextView windGusts;
public TextView windDirection;
public TextView temperature;
public TextView pressure;
public TextView maxGust;
/**
* This field is named 'minAverage' but in UX it is described as minimal wind speed which is
* not exactly precise.
*/
public TextView minAverage;
public int goodColor;
public int badColor;
Activity activity;
public StationWindRoseActElements() {
windArrow = null;
windGusts = null;
windSpeed = null;
temperature = null;
pressure = null;
activity = null;
}
@Override
public void updateFromSummary(Summary s, AvailableParameters enabledForStation) {
// 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;
}
// 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();
Logger.debug("[last_station_data = " + last_station_data.format(DateTimeFormatter. ISO_LOCAL_DATE_TIME) +"]");
// 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;
}
}
Logger.debug("[no_data = " + no_data +"][old_data = " + old_data+"]");
// create strings with wind speed, gusts etc
String average_speed = String.format("%s", data.getWindspeedStr(true));
String gusts_speed = String.format("%s", data.getWindgustsStr(true));
// 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 (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) {
windSpeed.setText(average_speed);
} else {
windSpeed.setText("---");
}
if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) {
windGusts.setText(gusts_speed);
} else {
windGusts.setText("---");
}
if (!no_data && !data.wind_qf_native.equals(QualityFactor.NOT_AVALIABLE)) {
windDirection.setText(String.valueOf(data.direction) + activity.getResources().getString(R.string.degrees_sign));
} else {
windDirection.setText("---");
}
// check if temperature is avaliable in input data set
if (!no_data) {
temperature.setText(String.format("%s", data.getTemperatureStr(true, false)));
if (!data.temperature_qf_native.equals(QualityFactor.NOT_AVALIABLE) && goodColor != 0) {
temperature.setTextColor(goodColor);
}
else if (badColor != 0) {
temperature.setTextColor(badColor);
}
} else {
temperature.setText("---");
}
if (!no_data && !old_data) {
String hour_max_gusts = String.format("%s", data.getHourWindgustsStr(true));
String hour_min_avg = String.format("%s", data.getHourMinWindspeedStr(true));
pressure.setText(activity.getResources().getString(R.string.qnh) + ": " + String.format("%d hPa", data.qnh));
maxGust.setText(activity.getResources().getString(R.string.max_1h_gust) + ": " + hour_max_gusts);
minAverage.setText(activity.getResources().getString(R.string.min_1h_avg) + ": " + hour_min_avg);
if (goodColor != 0) {
pressure.setTextColor(goodColor);
maxGust.setTextColor(goodColor);
minAverage.setTextColor(goodColor);
}
} 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);
}
}
@Override
public void setActivity(Activity act) {
activity = act;
}
}