MeteoSystem/app/src/main/java/cc/pogoda/mobile/meteosystem/activity/StationDetailsActivity.java

425 wiersze
17 KiB
Java

package cc.pogoda.mobile.meteosystem.activity;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.text.HtmlCompat;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.Handler;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import org.greenrobot.eventbus.EventBus;
import org.tinylog.Logger;
import java.util.Locale;
import cc.pogoda.mobile.meteosystem.R;
import cc.pogoda.mobile.meteosystem.activity.handler.StationDetailsActHumidityPlotButtonClickEvent;
import cc.pogoda.mobile.meteosystem.activity.handler.StationDetailsActTemperaturePlotButtonClickEvent;
import cc.pogoda.mobile.meteosystem.activity.handler.StationDetailsActTrendButtonClickEvent;
import cc.pogoda.mobile.meteosystem.activity.handler.StationDetailsActWindDirectionPlotsButtonClickEvent;
import cc.pogoda.mobile.meteosystem.activity.handler.StationDetailsActWindSpeedPlotsButtonClickEvent;
import cc.pogoda.mobile.meteosystem.activity.handler.StationDetailsActSummaryButtonClickEvent;
import cc.pogoda.mobile.meteosystem.activity.handler.StationDetailsActWindRoseButtonClickEvent;
import cc.pogoda.mobile.meteosystem.activity.updater.StationBackgroundImageUpdater;
import cc.pogoda.mobile.meteosystem.config.AppConfiguration;
import cc.pogoda.mobile.meteosystem.type.AvailableParameters;
import cc.pogoda.mobile.meteosystem.type.WeatherStation;
import cc.pogoda.mobile.meteosystem.type.WeatherStationListEvent;
import cc.pogoda.mobile.meteosystem.web.StationBackgroundDownloader;
public class StationDetailsActivity extends AppCompatActivity {
WeatherStation station;
TextView stationName = null;
TextView stationLocation = null;
TextView stationLatLon = null;
TextView stationSponsorUrl = null;
TextView stationMoreInfo = null;
ImageButton summaryButton = null;
ImageButton windSpeedPlotsButton = null;
ImageButton windDirectionPlotsButton = null;
ImageButton temperatureButton = null;
ImageButton humidityButton = null;
ImageButton windRoseButton = null;
ImageButton trendButton = null;
ImageView topBackground = null;
AppCompatActivity act;
/**
* Click event on Station Summary Button
*/
StationDetailsActSummaryButtonClickEvent summaryClickEvent = null;
/**
* Click event on Wind Speed Button
*/
StationDetailsActWindSpeedPlotsButtonClickEvent windSpeedPlotsClickEvent = null;
StationDetailsActWindDirectionPlotsButtonClickEvent windDirectionPlotsClickEvent = null;
StationDetailsActTemperaturePlotButtonClickEvent temperaturePlotButtonClickEvent = null;
StationDetailsActHumidityPlotButtonClickEvent humidityPlotButtonClickEvent = null;
StationDetailsActTrendButtonClickEvent trendButtonClickEvent = null;
/**
*
*/
StationDetailsActWindRoseButtonClickEvent windRoseClickEvent = null;
/**
*
*/
int plotDataLn = -1;
/*
* the value selected by a user in plot lenght dialog before clicking OK
*/
int selectedLn = 0;
Handler handler;
public StationDetailsActivity() {
stationName = null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_station_details, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
//return super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.menuItemStationDetailsAddFavourites:
if (station != null) {
boolean result = true;
EventBus.getDefault().post(new WeatherStationListEvent(station, WeatherStationListEvent.EventReason.ADD));
if (result) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.fav_added_success);
builder.setPositiveButton(R.string.ok, (DialogInterface var1, int var2) -> {
var1.dismiss();
});
builder.create();
builder.show();
}
}
break;
case R.id.menuItemStationDetailsDeleteFavourites:
if (station != null) {
boolean result = true;
//result = AppConfiguration.favourites.removeFav(station);
EventBus.getDefault().post(new WeatherStationListEvent(station, WeatherStationListEvent.EventReason.DELETE));
if (result) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(R.string.fav_deleted_success);
builder.setPositiveButton(R.string.ok, (DialogInterface var1, int var2) -> {
var1.dismiss();
});
builder.create();
builder.show();
}
}
break;
case R.id.menuItemStationDetailsPlotsLn:
setPlotsLn();
break;
}
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
float station_lat = 0.0f; // szerokość W - E
float station_lon = 0.0f; // długość S - N
StringBuilder sb = new StringBuilder();
super.onCreate(savedInstanceState);
act = this;
station = (WeatherStation) getIntent().getSerializableExtra("station");
Logger.info("[station.getSystemName() = " + station.getSystemName() +"]");
if (AppConfiguration.locale != null && !AppConfiguration.locale.equals("default") ) {
Logger.debug("[AppConfiguration.locale = " + AppConfiguration.locale + "]");
Locale locale = new Locale(AppConfiguration.locale);
Locale.setDefault(locale);
Resources resources = this.getResources();
Configuration config = resources.getConfiguration();
config.setLocale(locale);
resources.updateConfiguration(config, resources.getDisplayMetrics());
}
setContentView(R.layout.activity_station_details);
AvailableParameters parameters = station.getAvailableParameters();
stationName = findViewById(R.id.textViewStationName);
stationLocation = findViewById(R.id.textViewLocalization);
stationLatLon = findViewById(R.id.textViewLatLon);
stationSponsorUrl = findViewById(R.id.textViewSponsorUrl);
stationMoreInfo = findViewById(R.id.textViewMoreInfo);
// public static final int BLACK = -16777216;
// public static final int BLUE = -16776961;
// public static final int CYAN = -16711681;
// public static final int DKGRAY = -12303292;
// public static final int GRAY = -7829368;
// public static final int GREEN = -16711936;
// public static final int LTGRAY = -3355444;
// public static final int MAGENTA = -65281;
// public static final int RED = -65536;
// public static final int TRANSPARENT = 0;
// public static final int WHITE = -1;
// public static final int YELLOW = -256;
stationName.setTextColor(station.getStationNameTextColor());
if (station != null && stationName != null) {
// set the default value od data lenght
this.getIntent().putExtra("data_ln", plotDataLn);
summaryClickEvent = new StationDetailsActSummaryButtonClickEvent(station, this);
windSpeedPlotsClickEvent = new StationDetailsActWindSpeedPlotsButtonClickEvent(station, this);
windDirectionPlotsClickEvent = new StationDetailsActWindDirectionPlotsButtonClickEvent(station, this);
temperaturePlotButtonClickEvent = new StationDetailsActTemperaturePlotButtonClickEvent(station, this);
humidityPlotButtonClickEvent = new StationDetailsActHumidityPlotButtonClickEvent(station, this);
windRoseClickEvent = new StationDetailsActWindRoseButtonClickEvent(station, this);
trendButtonClickEvent = new StationDetailsActTrendButtonClickEvent(station, this);
summaryButton = findViewById(R.id.imageButtonFavourites);
summaryButton.setOnClickListener(summaryClickEvent);
windSpeedPlotsButton = findViewById(R.id.imageButtonPlotsWindSpeed);
if (parameters.windSpeed) {
windSpeedPlotsButton.setOnClickListener(windSpeedPlotsClickEvent);
}
else {
windSpeedPlotsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(act);
builder.setMessage(R.string.station_doesnt_measure);
builder.setPositiveButton(R.string.ok, (DialogInterface var1, int var2) -> {
var1.dismiss();
});
builder.create();
builder.show();
}
});
}
windDirectionPlotsButton = findViewById(R.id.imageButtonPlotsWindDirection);
if (parameters.windSpeed) {
windDirectionPlotsButton.setOnClickListener(windDirectionPlotsClickEvent);
}
else {
windDirectionPlotsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(act);
builder.setMessage(R.string.station_doesnt_measure);
builder.setPositiveButton(R.string.ok, (DialogInterface var1, int var2) -> {
var1.dismiss();
});
builder.create();
builder.show();
}
});
}
windRoseButton = findViewById(R.id.imageButtonWindRose);
windRoseButton.setOnClickListener(windRoseClickEvent);
temperatureButton = findViewById(R.id.imageButtonPlotsTemperature);
temperatureButton.setOnClickListener(temperaturePlotButtonClickEvent);
humidityButton = findViewById(R.id.imageButtonPlotsHumidity);
if (parameters.humidity) {
humidityButton.setOnClickListener(humidityPlotButtonClickEvent);
}
else {
humidityButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(act);
builder.setMessage(R.string.station_doesnt_measure);
builder.setPositiveButton(R.string.ok, (DialogInterface var1, int var2) -> {
var1.dismiss();
});
builder.create();
builder.show();
}
});
}
trendButton = findViewById(R.id.imageButtonTrend);
trendButton.setOnClickListener(trendButtonClickEvent);
topBackground = findViewById(R.id.imageViewStationPng);
switch (station.getImageAlign()) {
case 0:
topBackground.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
break;
case 1:
topBackground.setScaleType(ImageView.ScaleType.FIT_START);
break;
case 2:
topBackground.setScaleType(ImageView.ScaleType.FIT_END);
break;
case 3:
topBackground.setScaleType(ImageView.ScaleType.CENTER);
break;
case 4:
topBackground.setScaleType(ImageView.ScaleType.MATRIX);
break;
case 5:
topBackground.setScaleType(ImageView.ScaleType.FIT_XY);
break;
case 6:
topBackground.setScaleType(ImageView.ScaleType.FIT_CENTER);
break;
default:
topBackground.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
if (station.getDisplayedName().length() > 18) {
stationName.setText(station.getDisplayedName());
stationName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 30.0f);
}
else {
stationName.setText(station.getDisplayedName());
stationName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 36.0f);
}
stationLocation.setText(station.getDisplayedLocation());
station_lat = station.getLat();
station_lon = station.getLon();
stationSponsorUrl.setAutoLinkMask(0);
stationSponsorUrl.setMovementMethod(LinkMovementMethod.getInstance());
String anchorText;
if (station.getSponsorUrl().length() > 32) {
anchorText = getString(R.string.www_link);
} else {
anchorText = station.getSponsorUrl();
}
stationSponsorUrl.setMovementMethod(LinkMovementMethod.getInstance());
stationSponsorUrl.setText(
HtmlCompat.fromHtml(
"<a href=\"" + station.getSponsorUrl() + "\">" + anchorText + "</a>\n", HtmlCompat.FROM_HTML_MODE_LEGACY
)
);
// if (station.getSponsorUrl().length() > 32) {
// stationSponsorUrl.setClickable(true);
// stationSponsorUrl.setMovementMethod(LinkMovementMethod.getInstance());
// stationSponsorUrl.setText(Html.fromHtml("<a href=\"" + station.getSponsorUrl() +"\">" + getString(R.string.www_link) + "</a>\n", HtmlCompat.FROM_HTML_MODE_LEGACY));
// }
// else {
// stationSponsorUrl.setText(station.getSponsorUrl());
// }
stationMoreInfo.setText(station.getMoreInfo());
StationBackgroundDownloader downloader = new StationBackgroundDownloader(station);
Thread t = new Thread(downloader);
t.start();
handler = new Handler();
handler.postDelayed(new StationBackgroundImageUpdater(topBackground, stationName, station, downloader, handler), 100);
if (station_lat > 0.0f && station_lon > 0.0f) {
// europe
sb.append(station_lat);
sb.append(" N / ");
sb.append(station_lon);
sb.append(" E");
stationLatLon.setText(sb.toString());
} else if (station_lat < 0.0f && station_lon > 0.0f) {
// usa
sb.append(station_lat);
sb.append(" N / ");
sb.append(-station_lon);
sb.append(" W");
stationLatLon.setText(sb.toString());
} else if (station_lat < 0.0f && station_lon < 0.0f) {
// brazil
sb.append(-station_lat);
sb.append(" S / ");
sb.append(-station_lon);
sb.append(" W");
stationLatLon.setText(sb.toString());
} else if (station_lat > 0.0f && station_lat > 0.0f) {
// australia
sb.append(-station_lat);
sb.append(" S / ");
sb.append(station_lon);
sb.append(" E");
stationLatLon.setText(sb.toString());
}
}
}
private void setPlotsLn() {
// an array of strings with radio button options
CharSequence[] vales = new CharSequence[3];
// fill the array from resources
vales[0] = getResources().getString(R.string.hours_12).toString();
vales[1] = getResources().getString(R.string.hours_24).toString();
vales[2] = getResources().getString(R.string.days_3).toString();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.plot_data_lenght);
builder.setSingleChoiceItems(vales, plotDataLn, (DialogInterface var1, int var2) -> { selectedLn = var2; } );
builder.setPositiveButton(R.string.ok, (DialogInterface var1, int var2) -> {
plotDataLn = selectedLn;
this.getIntent().putExtra("data_ln", plotDataLn);
var1.dismiss();
});
builder.create();
builder.show();
}
}