Tons of refactoring and deleting unused stuff
|
|
@ -5,6 +5,10 @@
|
||||||
|
|
||||||
solarCast forecasts the output of your solar power plant
|
solarCast forecasts the output of your solar power plant
|
||||||
|
|
||||||
|
This app takes direct and diffuse radiation data from Open-Meteo.com, calculates the position
|
||||||
|
of the sun and projects the radiation on your solar panel.
|
||||||
|
It shows the estimated energy production for the next hours and up to 16 days.
|
||||||
|
|
||||||
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/01.png" width="150"/><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/02.png" width="150"/> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/03.png" width="150"/>
|
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/01.png" width="150"/><img src="fastlane/metadata/android/en-US/images/phoneScreenshots/02.png" width="150"/> <img src="fastlane/metadata/android/en-US/images/phoneScreenshots/03.png" width="150"/>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,10 @@
|
||||||
package org.woheller69.weather.activities;
|
package org.woheller69.weather.activities;
|
||||||
|
|
||||||
import static java.lang.Boolean.TRUE;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.location.LocationListener;
|
|
||||||
import android.location.LocationManager;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.core.app.ActivityCompat;
|
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
import com.google.android.material.tabs.TabLayoutMediator;
|
import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
|
|
@ -19,31 +12,25 @@ import com.google.android.material.tabs.TabLayoutMediator;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.viewpager2.widget.ViewPager2;
|
import androidx.viewpager2.widget.ViewPager2;
|
||||||
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.animation.AlphaAnimation;
|
|
||||||
import android.view.animation.Animation;
|
import android.view.animation.Animation;
|
||||||
import android.view.animation.LinearInterpolator;
|
import android.view.animation.LinearInterpolator;
|
||||||
import android.view.animation.RotateAnimation;
|
import android.view.animation.RotateAnimation;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import org.woheller69.weather.R;
|
import org.woheller69.weather.R;
|
||||||
import org.woheller69.weather.database.CityToWatch;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
import org.woheller69.weather.ui.updater.IUpdateableCityUI;
|
import org.woheller69.weather.ui.updater.IUpdateableCityUI;
|
||||||
import org.woheller69.weather.ui.updater.ViewUpdater;
|
import org.woheller69.weather.ui.updater.ViewUpdater;
|
||||||
import org.woheller69.weather.ui.viewPager.WeatherPagerAdapter;
|
import org.woheller69.weather.ui.viewPager.WeatherPagerAdapter;
|
||||||
import static org.woheller69.weather.database.SQLiteHelper.getWidgetCityID;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
public class ForecastCityActivity extends NavigationActivity implements IUpdateableCityUI {
|
public class ForecastCityActivity extends NavigationActivity implements IUpdateableCityUI {
|
||||||
private WeatherPagerAdapter pagerAdapter;
|
private WeatherPagerAdapter pagerAdapter;
|
||||||
|
|
@ -88,9 +75,9 @@ public class ForecastCityActivity extends NavigationActivity implements IUpdatea
|
||||||
if (pagerAdapter.getItemCount()>0) { //only if at least one city is watched
|
if (pagerAdapter.getItemCount()>0) { //only if at least one city is watched
|
||||||
//if pagerAdapter has item with current cityId go there, otherwise use cityId from current item
|
//if pagerAdapter has item with current cityId go there, otherwise use cityId from current item
|
||||||
if (pagerAdapter.getPosForCityID(cityId)==-1) cityId=pagerAdapter.getCityIDForPos(viewPager2.getCurrentItem());
|
if (pagerAdapter.getPosForCityID(cityId)==-1) cityId=pagerAdapter.getCityIDForPos(viewPager2.getCurrentItem());
|
||||||
CurrentWeatherData currentWeather = db.getCurrentWeatherByCityId(cityId);
|
GeneralData generalData = db.getGeneralDataByCityId(cityId);
|
||||||
|
|
||||||
long timestamp = currentWeather.getTimestamp();
|
long timestamp = generalData.getTimestamp();
|
||||||
long systemTime = System.currentTimeMillis() / 1000;
|
long systemTime = System.currentTimeMillis() / 1000;
|
||||||
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||||
long updateInterval = (long) (Float.parseFloat(prefManager.getString("pref_updateInterval", "2")) * 60 * 60);
|
long updateInterval = (long) (Float.parseFloat(prefManager.getString("pref_updateInterval", "2")) * 60 * 60);
|
||||||
|
|
@ -120,9 +107,9 @@ public class ForecastCityActivity extends NavigationActivity implements IUpdatea
|
||||||
//Update current tab if outside update interval, show animation
|
//Update current tab if outside update interval, show animation
|
||||||
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
|
||||||
SQLiteHelper database = SQLiteHelper.getInstance(getApplicationContext().getApplicationContext());
|
SQLiteHelper database = SQLiteHelper.getInstance(getApplicationContext().getApplicationContext());
|
||||||
CurrentWeatherData currentWeather = database.getCurrentWeatherByCityId(pagerAdapter.getCityIDForPos(position));
|
GeneralData generalData = database.getGeneralDataByCityId(pagerAdapter.getCityIDForPos(position));
|
||||||
|
|
||||||
long timestamp = currentWeather.getTimestamp();
|
long timestamp = generalData.getTimestamp();
|
||||||
long systemTime = System.currentTimeMillis() / 1000;
|
long systemTime = System.currentTimeMillis() / 1000;
|
||||||
long updateInterval = (long) (Float.parseFloat(prefManager.getString("pref_updateInterval", "2")) * 60 * 60);
|
long updateInterval = (long) (Float.parseFloat(prefManager.getString("pref_updateInterval", "2")) * 60 * 60);
|
||||||
|
|
||||||
|
|
@ -204,7 +191,7 @@ public class ForecastCityActivity extends NavigationActivity implements IUpdatea
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processNewCurrentWeatherData(CurrentWeatherData data) {
|
public void processNewGeneralData(GeneralData data) {
|
||||||
if (refreshActionButton != null && refreshActionButton.getActionView() != null) {
|
if (refreshActionButton != null && refreshActionButton.getActionView() != null) {
|
||||||
refreshActionButton.getActionView().clearAnimation();
|
refreshActionButton.getActionView().clearAnimation();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -150,7 +150,8 @@ public class ManageLocationsActivity extends NavigationActivity {
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable editable) {
|
public void afterTextChanged(Editable editable) {
|
||||||
float elevation = Float.parseFloat("0"+editElevation.getText().toString());
|
float elevation = Float.parseFloat("0"+editElevation.getText().toString());
|
||||||
editDiffuseEfficiency.setText(Float.toString(100-50 * elevation/90));
|
int diffuseEfficiency = (int) (100-50 * elevation/90);
|
||||||
|
editDiffuseEfficiency.setText(Float.toString((float) diffuseEfficiency));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,40 +9,23 @@ import java.util.TimeZone;
|
||||||
* This class represents the database model for current weather data of cities.
|
* This class represents the database model for current weather data of cities.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class CurrentWeatherData {
|
public class GeneralData {
|
||||||
|
|
||||||
private int id;
|
private int id;
|
||||||
private int city_id;
|
private int city_id;
|
||||||
private long timestamp;
|
private long timestamp;
|
||||||
private int weatherID;
|
|
||||||
private float temperatureCurrent;
|
|
||||||
private float humidity;
|
|
||||||
private float pressure;
|
|
||||||
private float windSpeed;
|
|
||||||
private float windDirection;
|
|
||||||
private float cloudiness;
|
|
||||||
private long timeSunrise;
|
private long timeSunrise;
|
||||||
private long timeSunset;
|
private long timeSunset;
|
||||||
private int timeZoneSeconds;
|
private int timeZoneSeconds;
|
||||||
private String Rain60min;
|
|
||||||
|
|
||||||
private String city_name;
|
public GeneralData() {
|
||||||
|
|
||||||
public CurrentWeatherData() {
|
|
||||||
this.city_id = Integer.MIN_VALUE;
|
this.city_id = Integer.MIN_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CurrentWeatherData(int id, int city_id, long timestamp, int weatherID, float temperatureCurrent, float temperatureMin, float temperatureMax, float humidity, float pressure, float windSpeed, float windDirection, float cloudiness, long timeSunrise, long timeSunset, int timeZoneSeconds) {
|
public GeneralData(int id, int city_id, long timestamp, int weatherID, float temperatureCurrent, float temperatureMin, float temperatureMax, float humidity, float pressure, float windSpeed, float windDirection, float cloudiness, long timeSunrise, long timeSunset, int timeZoneSeconds) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.city_id = city_id;
|
this.city_id = city_id;
|
||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
this.weatherID = weatherID;
|
|
||||||
this.temperatureCurrent = temperatureCurrent;
|
|
||||||
this.humidity = humidity;
|
|
||||||
this.pressure = pressure;
|
|
||||||
this.windSpeed = windSpeed;
|
|
||||||
this.windDirection = windDirection;
|
|
||||||
this.cloudiness = cloudiness;
|
|
||||||
this.timeSunrise = timeSunrise;
|
this.timeSunrise = timeSunrise;
|
||||||
this.timeSunset = timeSunset;
|
this.timeSunset = timeSunset;
|
||||||
this.timeZoneSeconds = timeZoneSeconds;
|
this.timeZoneSeconds = timeZoneSeconds;
|
||||||
|
|
@ -72,61 +55,6 @@ public class CurrentWeatherData {
|
||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getWeatherID() {
|
|
||||||
return weatherID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setWeatherID(int weatherID) {
|
|
||||||
this.weatherID = weatherID;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getTemperatureCurrent() {
|
|
||||||
return temperatureCurrent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTemperatureCurrent(float temperatureCurrent) {
|
|
||||||
this.temperatureCurrent = temperatureCurrent;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getHumidity() {
|
|
||||||
return humidity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHumidity(float humidity) {
|
|
||||||
this.humidity = humidity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getPressure() {
|
|
||||||
return pressure;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPressure(float pressure) {
|
|
||||||
this.pressure = pressure;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getWindSpeed() {
|
|
||||||
return windSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setWindSpeed(float windSpeed) {
|
|
||||||
this.windSpeed = windSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getWindDirection() {
|
|
||||||
return windDirection;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setWindDirection(float windDirection) {
|
|
||||||
this.windDirection = windDirection;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getCloudiness() {
|
|
||||||
return cloudiness;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCloudiness(float cloudiness) {
|
|
||||||
this.cloudiness = cloudiness;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isDay(Context context){
|
public boolean isDay(Context context){
|
||||||
Calendar timeStamp = Calendar.getInstance();
|
Calendar timeStamp = Calendar.getInstance();
|
||||||
|
|
@ -158,14 +86,6 @@ public class CurrentWeatherData {
|
||||||
this.timeSunset = timeSunset;
|
this.timeSunset = timeSunset;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCity_name() {
|
|
||||||
return city_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCity_name(String city_name) {
|
|
||||||
this.city_name = city_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTimeZoneSeconds() {
|
public int getTimeZoneSeconds() {
|
||||||
return timeZoneSeconds;
|
return timeZoneSeconds;
|
||||||
}
|
}
|
||||||
|
|
@ -174,11 +94,4 @@ public class CurrentWeatherData {
|
||||||
this.timeZoneSeconds = timeZoneSeconds;
|
this.timeZoneSeconds = timeZoneSeconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getRain60min() {
|
|
||||||
return Rain60min;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRain60min(String Rain60min) {
|
|
||||||
this.Rain60min = Rain60min;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -45,7 +45,7 @@ public class HourlyForecast {
|
||||||
*/
|
*/
|
||||||
public long getLocalForecastTime(Context context) {
|
public long getLocalForecastTime(Context context) {
|
||||||
SQLiteHelper dbhelper = SQLiteHelper.getInstance(context);
|
SQLiteHelper dbhelper = SQLiteHelper.getInstance(context);
|
||||||
int timezoneseconds = dbhelper.getCurrentWeatherByCityId(city_id).getTimeZoneSeconds();
|
int timezoneseconds = dbhelper.getGeneralDataByCityId(city_id).getTimeZoneSeconds();
|
||||||
return forecastFor + timezoneseconds * 1000L;
|
return forecastFor + timezoneseconds * 1000L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
private static final String TABLE_CITIES_TO_WATCH = "CITIES_TO_WATCH";
|
private static final String TABLE_CITIES_TO_WATCH = "CITIES_TO_WATCH";
|
||||||
private static final String TABLE_HOURLY_FORECAST = "FORECASTS";
|
private static final String TABLE_HOURLY_FORECAST = "FORECASTS";
|
||||||
private static final String TABLE_WEEKFORECAST = "WEEKFORECASTS";
|
private static final String TABLE_WEEKFORECAST = "WEEKFORECASTS";
|
||||||
private static final String TABLE_CURRENT_WEATHER = "CURRENT_WEATHER";
|
private static final String TABLE_GENERAL_DATA = "GENERAL_DATA";
|
||||||
|
|
||||||
|
|
||||||
//Names of columns in TABLE_CITIES_TO_WATCH
|
//Names of columns in TABLE_CITIES_TO_WATCH
|
||||||
|
|
@ -69,55 +69,30 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
private static final String WEEKFORECAST_COLUMN_TIME_MEASUREMENT = "time_of_measurement";
|
private static final String WEEKFORECAST_COLUMN_TIME_MEASUREMENT = "time_of_measurement";
|
||||||
private static final String WEEKFORECAST_COLUMN_FORECAST_FOR = "forecast_for";
|
private static final String WEEKFORECAST_COLUMN_FORECAST_FOR = "forecast_for";
|
||||||
private static final String WEEKFORECAST_COLUMN_WEATHER_ID = "weather_id";
|
private static final String WEEKFORECAST_COLUMN_WEATHER_ID = "weather_id";
|
||||||
private static final String WEEKFORECAST_COLUMN_TEMPERATURE_CURRENT = "temperature_current";
|
private static final String WEEKFORECAST_COLUMN_ENERGY_DAY = "energy_day";
|
||||||
private static final String WEEKFORECAST_COLUMN_TEMPERATURE_MIN = "temperature_min";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_TEMPERATURE_MAX = "temperature_max";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_HUMIDITY = "humidity";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_PRESSURE = "pressure";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_PRECIPITATION = "precipitation";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_WIND_SPEED = "wind_speed";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_WIND_DIRECTION = "wind_direction";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_UV_INDEX = "uv_index";
|
|
||||||
private static final String WEEKFORECAST_COLUMN_TIME_SUNRISE = "time_sunrise";
|
private static final String WEEKFORECAST_COLUMN_TIME_SUNRISE = "time_sunrise";
|
||||||
private static final String WEEKFORECAST_COLUMN_TIME_SUNSET = "time_sunset";
|
private static final String WEEKFORECAST_COLUMN_TIME_SUNSET = "time_sunset";
|
||||||
|
|
||||||
|
|
||||||
//Names of columns in TABLE_CURRENT_WEATHER
|
//Names of columns in TABLE_GENERAL_DATA
|
||||||
private static final String CURRENT_WEATHER_ID = "current_weather_id";
|
private static final String COLUMN_ID = "current_id";
|
||||||
private static final String CURRENT_WEATHER_CITY_ID = "city_id";
|
private static final String COLUMN_CITY_ID = "city_id";
|
||||||
private static final String COLUMN_TIME_MEASUREMENT = "time_of_measurement";
|
private static final String COLUMN_TIME_MEASUREMENT = "time_of_measurement";
|
||||||
private static final String COLUMN_WEATHER_ID = "weather_id";
|
|
||||||
private static final String COLUMN_TEMPERATURE_CURRENT = "temperature_current";
|
|
||||||
private static final String COLUMN_HUMIDITY = "humidity";
|
|
||||||
private static final String COLUMN_PRESSURE = "pressure";
|
|
||||||
private static final String COLUMN_WIND_SPEED = "wind_speed";
|
|
||||||
private static final String COLUMN_WIND_DIRECTION = "wind_direction";
|
|
||||||
private static final String COLUMN_CLOUDINESS = "cloudiness";
|
|
||||||
private static final String COLUMN_TIME_SUNRISE = "time_sunrise";
|
private static final String COLUMN_TIME_SUNRISE = "time_sunrise";
|
||||||
private static final String COLUMN_TIME_SUNSET = "time_sunset";
|
private static final String COLUMN_TIME_SUNSET = "time_sunset";
|
||||||
private static final String COLUMN_TIMEZONE_SECONDS = "timezone_seconds";
|
private static final String COLUMN_TIMEZONE_SECONDS = "timezone_seconds";
|
||||||
private static final String COLUMN_RAIN60MIN = "Rain60min";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create Table statements for all tables
|
* Create Table statements for all tables
|
||||||
*/
|
*/
|
||||||
private static final String CREATE_CURRENT_WEATHER = "CREATE TABLE " + TABLE_CURRENT_WEATHER +
|
private static final String CREATE_GENERAL_DATA = "CREATE TABLE " + TABLE_GENERAL_DATA +
|
||||||
"(" +
|
"(" +
|
||||||
CURRENT_WEATHER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
|
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
|
||||||
CURRENT_WEATHER_CITY_ID + " INTEGER," +
|
COLUMN_CITY_ID + " INTEGER," +
|
||||||
COLUMN_TIME_MEASUREMENT + " LONG NOT NULL," +
|
COLUMN_TIME_MEASUREMENT + " LONG NOT NULL," +
|
||||||
COLUMN_WEATHER_ID + " INTEGER," +
|
|
||||||
COLUMN_TEMPERATURE_CURRENT + " REAL," +
|
|
||||||
COLUMN_HUMIDITY + " REAL," +
|
|
||||||
COLUMN_PRESSURE + " REAL," +
|
|
||||||
COLUMN_WIND_SPEED + " REAL," +
|
|
||||||
COLUMN_WIND_DIRECTION + " REAL," +
|
|
||||||
COLUMN_CLOUDINESS + " REAL," +
|
|
||||||
COLUMN_TIME_SUNRISE + " LONG NOT NULL," +
|
COLUMN_TIME_SUNRISE + " LONG NOT NULL," +
|
||||||
COLUMN_TIME_SUNSET + " LONG NOT NULL," +
|
COLUMN_TIME_SUNSET + " LONG NOT NULL," +
|
||||||
COLUMN_TIMEZONE_SECONDS + " INTEGER," +
|
COLUMN_TIMEZONE_SECONDS + " INTEGER)";
|
||||||
COLUMN_RAIN60MIN + " VARCHAR(25) NOT NULL) ;";
|
|
||||||
|
|
||||||
|
|
||||||
private static final String CREATE_TABLE_FORECASTS = "CREATE TABLE " + TABLE_HOURLY_FORECAST +
|
private static final String CREATE_TABLE_FORECASTS = "CREATE TABLE " + TABLE_HOURLY_FORECAST +
|
||||||
"(" +
|
"(" +
|
||||||
|
|
@ -137,15 +112,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
WEEKFORECAST_COLUMN_TIME_MEASUREMENT + " LONG NOT NULL," +
|
WEEKFORECAST_COLUMN_TIME_MEASUREMENT + " LONG NOT NULL," +
|
||||||
WEEKFORECAST_COLUMN_FORECAST_FOR + " VARCHAR(200) NOT NULL," +
|
WEEKFORECAST_COLUMN_FORECAST_FOR + " VARCHAR(200) NOT NULL," +
|
||||||
WEEKFORECAST_COLUMN_WEATHER_ID + " INTEGER," +
|
WEEKFORECAST_COLUMN_WEATHER_ID + " INTEGER," +
|
||||||
WEEKFORECAST_COLUMN_TEMPERATURE_CURRENT + " REAL," +
|
WEEKFORECAST_COLUMN_ENERGY_DAY + " REAL," +
|
||||||
WEEKFORECAST_COLUMN_TEMPERATURE_MIN + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_TEMPERATURE_MAX + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_HUMIDITY + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_PRESSURE + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_PRECIPITATION + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_WIND_SPEED + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_WIND_DIRECTION + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_UV_INDEX + " REAL," +
|
|
||||||
WEEKFORECAST_COLUMN_TIME_SUNRISE + " LONG NOT NULL," +
|
WEEKFORECAST_COLUMN_TIME_SUNRISE + " LONG NOT NULL," +
|
||||||
WEEKFORECAST_COLUMN_TIME_SUNSET + " LONG NOT NULL)";
|
WEEKFORECAST_COLUMN_TIME_SUNSET + " LONG NOT NULL)";
|
||||||
|
|
||||||
|
|
@ -182,7 +149,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(SQLiteDatabase db) {
|
public void onCreate(SQLiteDatabase db) {
|
||||||
db.execSQL(CREATE_TABLE_CITIES_TO_WATCH);
|
db.execSQL(CREATE_TABLE_CITIES_TO_WATCH);
|
||||||
db.execSQL(CREATE_CURRENT_WEATHER);
|
db.execSQL(CREATE_GENERAL_DATA);
|
||||||
db.execSQL(CREATE_TABLE_FORECASTS);
|
db.execSQL(CREATE_TABLE_FORECASTS);
|
||||||
db.execSQL(CREATE_TABLE_WEEKFORECASTS);
|
db.execSQL(CREATE_TABLE_WEEKFORECASTS);
|
||||||
}
|
}
|
||||||
|
|
@ -192,7 +159,6 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Methods for TABLE_CITIES_TO_WATCH
|
* Methods for TABLE_CITIES_TO_WATCH
|
||||||
*/
|
*/
|
||||||
|
|
@ -352,7 +318,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
public synchronized void deleteCityToWatch(CityToWatch cityToWatch) {
|
public synchronized void deleteCityToWatch(CityToWatch cityToWatch) {
|
||||||
|
|
||||||
//First delete all weather data for city which is deleted
|
//First delete all weather data for city which is deleted
|
||||||
deleteCurrentWeatherByCityId(cityToWatch.getCityId());
|
deleteGeneralDataByCityId(cityToWatch.getCityId());
|
||||||
deleteForecastsByCityId(cityToWatch.getCityId());
|
deleteForecastsByCityId(cityToWatch.getCityId());
|
||||||
deleteWeekForecastsByCityId(cityToWatch.getCityId());
|
deleteWeekForecastsByCityId(cityToWatch.getCityId());
|
||||||
|
|
||||||
|
|
@ -457,15 +423,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
values.put(WEEKFORECAST_COLUMN_TIME_MEASUREMENT, weekForecast.getTimestamp());
|
values.put(WEEKFORECAST_COLUMN_TIME_MEASUREMENT, weekForecast.getTimestamp());
|
||||||
values.put(WEEKFORECAST_COLUMN_FORECAST_FOR, weekForecast.getForecastTime());
|
values.put(WEEKFORECAST_COLUMN_FORECAST_FOR, weekForecast.getForecastTime());
|
||||||
values.put(WEEKFORECAST_COLUMN_WEATHER_ID, weekForecast.getWeatherID());
|
values.put(WEEKFORECAST_COLUMN_WEATHER_ID, weekForecast.getWeatherID());
|
||||||
values.put(WEEKFORECAST_COLUMN_TEMPERATURE_CURRENT, weekForecast.getTemperature());
|
values.put(WEEKFORECAST_COLUMN_ENERGY_DAY, weekForecast.getEnergyDay());
|
||||||
values.put(WEEKFORECAST_COLUMN_TEMPERATURE_MIN, weekForecast.getMinTemperature());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_TEMPERATURE_MAX, weekForecast.getMaxTemperature());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_HUMIDITY, weekForecast.getHumidity());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_PRESSURE, weekForecast.getPressure());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_PRECIPITATION, weekForecast.getPrecipitation());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_WIND_SPEED, weekForecast.getWind_speed());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_WIND_DIRECTION, weekForecast.getWind_direction());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_UV_INDEX, weekForecast.getUv_index());
|
|
||||||
values.put(WEEKFORECAST_COLUMN_TIME_SUNRISE, weekForecast.getTimeSunrise());
|
values.put(WEEKFORECAST_COLUMN_TIME_SUNRISE, weekForecast.getTimeSunrise());
|
||||||
values.put(WEEKFORECAST_COLUMN_TIME_SUNSET, weekForecast.getTimeSunset());
|
values.put(WEEKFORECAST_COLUMN_TIME_SUNSET, weekForecast.getTimeSunset());
|
||||||
database.insert(TABLE_WEEKFORECAST, null, values);
|
database.insert(TABLE_WEEKFORECAST, null, values);
|
||||||
|
|
@ -492,15 +450,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
WEEKFORECAST_COLUMN_TIME_MEASUREMENT,
|
WEEKFORECAST_COLUMN_TIME_MEASUREMENT,
|
||||||
WEEKFORECAST_COLUMN_FORECAST_FOR,
|
WEEKFORECAST_COLUMN_FORECAST_FOR,
|
||||||
WEEKFORECAST_COLUMN_WEATHER_ID,
|
WEEKFORECAST_COLUMN_WEATHER_ID,
|
||||||
WEEKFORECAST_COLUMN_TEMPERATURE_CURRENT,
|
WEEKFORECAST_COLUMN_ENERGY_DAY,
|
||||||
WEEKFORECAST_COLUMN_TEMPERATURE_MIN,
|
|
||||||
WEEKFORECAST_COLUMN_TEMPERATURE_MAX,
|
|
||||||
WEEKFORECAST_COLUMN_HUMIDITY,
|
|
||||||
WEEKFORECAST_COLUMN_PRESSURE,
|
|
||||||
WEEKFORECAST_COLUMN_PRECIPITATION,
|
|
||||||
WEEKFORECAST_COLUMN_WIND_SPEED,
|
|
||||||
WEEKFORECAST_COLUMN_WIND_DIRECTION,
|
|
||||||
WEEKFORECAST_COLUMN_UV_INDEX,
|
|
||||||
WEEKFORECAST_COLUMN_TIME_SUNRISE,
|
WEEKFORECAST_COLUMN_TIME_SUNRISE,
|
||||||
WEEKFORECAST_COLUMN_TIME_SUNSET}
|
WEEKFORECAST_COLUMN_TIME_SUNSET}
|
||||||
, WEEKFORECAST_CITY_ID + "=?",
|
, WEEKFORECAST_CITY_ID + "=?",
|
||||||
|
|
@ -517,17 +467,9 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
weekForecast.setTimestamp(Long.parseLong(cursor.getString(2)));
|
weekForecast.setTimestamp(Long.parseLong(cursor.getString(2)));
|
||||||
weekForecast.setForecastTime(Long.parseLong(cursor.getString(3)));
|
weekForecast.setForecastTime(Long.parseLong(cursor.getString(3)));
|
||||||
weekForecast.setWeatherID(Integer.parseInt(cursor.getString(4)));
|
weekForecast.setWeatherID(Integer.parseInt(cursor.getString(4)));
|
||||||
weekForecast.setTemperature(Float.parseFloat(cursor.getString(5)));
|
weekForecast.setEnergyDay(Float.parseFloat(cursor.getString(5)));
|
||||||
weekForecast.setMinTemperature(Float.parseFloat(cursor.getString(6)));
|
weekForecast.setTimeSunrise(Long.parseLong(cursor.getString(6)));
|
||||||
weekForecast.setMaxTemperature(Float.parseFloat(cursor.getString(7)));
|
weekForecast.setTimeSunset(Long.parseLong(cursor.getString(7)));
|
||||||
weekForecast.setHumidity(Float.parseFloat(cursor.getString(8)));
|
|
||||||
weekForecast.setPressure(Float.parseFloat(cursor.getString(9)));
|
|
||||||
weekForecast.setPrecipitation(Float.parseFloat(cursor.getString(10)));
|
|
||||||
weekForecast.setWind_speed(Float.parseFloat(cursor.getString(11)));
|
|
||||||
weekForecast.setWind_direction(Float.parseFloat(cursor.getString(12)));
|
|
||||||
weekForecast.setUv_index(Float.parseFloat(cursor.getString(13)));
|
|
||||||
weekForecast.setTimeSunrise(Long.parseLong(cursor.getString(14)));
|
|
||||||
weekForecast.setTimeSunset(Long.parseLong(cursor.getString(15)));
|
|
||||||
list.add(weekForecast);
|
list.add(weekForecast);
|
||||||
} while (cursor.moveToNext());
|
} while (cursor.moveToNext());
|
||||||
|
|
||||||
|
|
@ -538,128 +480,71 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Methods for TABLE_CURRENT_WEATHER
|
* Methods for TABLE_GENERAL_DATA
|
||||||
*/
|
*/
|
||||||
public synchronized void addCurrentWeather(CurrentWeatherData currentWeather) {
|
public synchronized void addGeneralData(GeneralData generalData) {
|
||||||
SQLiteDatabase database = this.getWritableDatabase();
|
SQLiteDatabase database = this.getWritableDatabase();
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(CURRENT_WEATHER_CITY_ID, currentWeather.getCity_id());
|
values.put(COLUMN_CITY_ID, generalData.getCity_id());
|
||||||
values.put(COLUMN_TIME_MEASUREMENT, currentWeather.getTimestamp());
|
values.put(COLUMN_TIME_MEASUREMENT, generalData.getTimestamp());
|
||||||
values.put(COLUMN_WEATHER_ID, currentWeather.getWeatherID());
|
values.put(COLUMN_TIME_SUNRISE, generalData.getTimeSunrise());
|
||||||
values.put(COLUMN_TEMPERATURE_CURRENT, currentWeather.getTemperatureCurrent());
|
values.put(COLUMN_TIME_SUNSET, generalData.getTimeSunset());
|
||||||
values.put(COLUMN_HUMIDITY, currentWeather.getHumidity());
|
values.put(COLUMN_TIMEZONE_SECONDS, generalData.getTimeZoneSeconds());
|
||||||
values.put(COLUMN_PRESSURE, currentWeather.getPressure());
|
|
||||||
values.put(COLUMN_WIND_SPEED, currentWeather.getWindSpeed());
|
|
||||||
values.put(COLUMN_WIND_DIRECTION, currentWeather.getWindDirection());
|
|
||||||
values.put(COLUMN_CLOUDINESS, currentWeather.getCloudiness());
|
|
||||||
values.put(COLUMN_TIME_SUNRISE, currentWeather.getTimeSunrise());
|
|
||||||
values.put(COLUMN_TIME_SUNSET, currentWeather.getTimeSunset());
|
|
||||||
values.put(COLUMN_TIMEZONE_SECONDS, currentWeather.getTimeZoneSeconds());
|
|
||||||
values.put(COLUMN_RAIN60MIN, currentWeather.getRain60min());
|
|
||||||
|
|
||||||
|
database.insert(TABLE_GENERAL_DATA, null, values);
|
||||||
database.insert(TABLE_CURRENT_WEATHER, null, values);
|
|
||||||
database.close();
|
database.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public synchronized CurrentWeatherData getCurrentWeatherByCityId(int cityId) {
|
public synchronized GeneralData getGeneralDataByCityId(int cityId) {
|
||||||
SQLiteDatabase database = this.getReadableDatabase();
|
SQLiteDatabase database = this.getReadableDatabase();
|
||||||
|
|
||||||
Cursor cursor = database.query(TABLE_CURRENT_WEATHER,
|
Cursor cursor = database.query(TABLE_GENERAL_DATA,
|
||||||
new String[]{CURRENT_WEATHER_ID,
|
new String[]{COLUMN_ID,
|
||||||
CURRENT_WEATHER_CITY_ID,
|
COLUMN_CITY_ID,
|
||||||
COLUMN_TIME_MEASUREMENT,
|
COLUMN_TIME_MEASUREMENT,
|
||||||
COLUMN_WEATHER_ID,
|
|
||||||
COLUMN_TEMPERATURE_CURRENT,
|
|
||||||
COLUMN_HUMIDITY,
|
|
||||||
COLUMN_PRESSURE,
|
|
||||||
COLUMN_WIND_SPEED,
|
|
||||||
COLUMN_WIND_DIRECTION,
|
|
||||||
COLUMN_CLOUDINESS,
|
|
||||||
COLUMN_TIME_SUNRISE,
|
COLUMN_TIME_SUNRISE,
|
||||||
COLUMN_TIME_SUNSET,
|
COLUMN_TIME_SUNSET,
|
||||||
COLUMN_TIMEZONE_SECONDS,
|
COLUMN_TIMEZONE_SECONDS},
|
||||||
COLUMN_RAIN60MIN},
|
COLUMN_CITY_ID + " = ?",
|
||||||
CURRENT_WEATHER_CITY_ID + " = ?",
|
|
||||||
new String[]{String.valueOf(cityId)}, null, null, null, null);
|
new String[]{String.valueOf(cityId)}, null, null, null, null);
|
||||||
|
|
||||||
CurrentWeatherData currentWeather = new CurrentWeatherData();
|
GeneralData generalData = new GeneralData();
|
||||||
|
|
||||||
if (cursor != null && cursor.moveToFirst()) {
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
currentWeather.setId(Integer.parseInt(cursor.getString(0)));
|
generalData.setId(Integer.parseInt(cursor.getString(0)));
|
||||||
currentWeather.setCity_id(Integer.parseInt(cursor.getString(1)));
|
generalData.setCity_id(Integer.parseInt(cursor.getString(1)));
|
||||||
currentWeather.setTimestamp(Long.parseLong(cursor.getString(2)));
|
generalData.setTimestamp(Long.parseLong(cursor.getString(2)));
|
||||||
currentWeather.setWeatherID(Integer.parseInt(cursor.getString(3)));
|
generalData.setTimeSunrise(Long.parseLong(cursor.getString(3)));
|
||||||
currentWeather.setTemperatureCurrent(Float.parseFloat(cursor.getString(4)));
|
generalData.setTimeSunset(Long.parseLong(cursor.getString(4)));
|
||||||
currentWeather.setHumidity(Float.parseFloat(cursor.getString(5)));
|
generalData.setTimeZoneSeconds(Integer.parseInt(cursor.getString(5)));
|
||||||
currentWeather.setPressure(Float.parseFloat(cursor.getString(6)));
|
|
||||||
currentWeather.setWindSpeed(Float.parseFloat(cursor.getString(7)));
|
|
||||||
currentWeather.setWindDirection(Float.parseFloat(cursor.getString(8)));
|
|
||||||
currentWeather.setCloudiness(Float.parseFloat(cursor.getString(9)));
|
|
||||||
currentWeather.setTimeSunrise(Long.parseLong(cursor.getString(10)));
|
|
||||||
currentWeather.setTimeSunset(Long.parseLong(cursor.getString(11)));
|
|
||||||
currentWeather.setTimeZoneSeconds(Integer.parseInt(cursor.getString(12)));
|
|
||||||
currentWeather.setRain60min(cursor.getString(13));
|
|
||||||
|
|
||||||
cursor.close();
|
cursor.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
return currentWeather;
|
return generalData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void updateCurrentWeather(CurrentWeatherData currentWeather) {
|
public synchronized void updateGeneralData(GeneralData generalData) {
|
||||||
SQLiteDatabase database = this.getWritableDatabase();
|
SQLiteDatabase database = this.getWritableDatabase();
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
ContentValues values = new ContentValues();
|
||||||
values.put(CURRENT_WEATHER_CITY_ID, currentWeather.getCity_id());
|
values.put(COLUMN_CITY_ID, generalData.getCity_id());
|
||||||
values.put(COLUMN_TIME_MEASUREMENT, currentWeather.getTimestamp());
|
values.put(COLUMN_TIME_MEASUREMENT, generalData.getTimestamp());
|
||||||
values.put(COLUMN_WEATHER_ID, currentWeather.getWeatherID());
|
values.put(COLUMN_TIME_SUNRISE, generalData.getTimeSunrise());
|
||||||
values.put(COLUMN_TEMPERATURE_CURRENT, currentWeather.getTemperatureCurrent());
|
values.put(COLUMN_TIME_SUNSET, generalData.getTimeSunset());
|
||||||
values.put(COLUMN_HUMIDITY, currentWeather.getHumidity());
|
values.put(COLUMN_TIMEZONE_SECONDS, generalData.getTimeZoneSeconds());
|
||||||
values.put(COLUMN_PRESSURE, currentWeather.getPressure());
|
|
||||||
values.put(COLUMN_WIND_SPEED, currentWeather.getWindSpeed());
|
|
||||||
values.put(COLUMN_WIND_DIRECTION, currentWeather.getWindDirection());
|
|
||||||
values.put(COLUMN_CLOUDINESS, currentWeather.getCloudiness());
|
|
||||||
values.put(COLUMN_TIME_SUNRISE, currentWeather.getTimeSunrise());
|
|
||||||
values.put(COLUMN_TIME_SUNSET, currentWeather.getTimeSunset());
|
|
||||||
values.put(COLUMN_TIMEZONE_SECONDS, currentWeather.getTimeZoneSeconds());
|
|
||||||
values.put(COLUMN_RAIN60MIN, currentWeather.getRain60min());
|
|
||||||
|
|
||||||
database.update(TABLE_CURRENT_WEATHER, values, CURRENT_WEATHER_CITY_ID + " = ?",
|
database.update(TABLE_GENERAL_DATA, values, COLUMN_CITY_ID + " = ?",
|
||||||
new String[]{String.valueOf(currentWeather.getCity_id())});
|
new String[]{String.valueOf(generalData.getCity_id())});
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void deleteCurrentWeather(CurrentWeatherData currentWeather) {
|
public synchronized void deleteGeneralDataByCityId(int cityId) {
|
||||||
SQLiteDatabase database = this.getWritableDatabase();
|
SQLiteDatabase database = this.getWritableDatabase();
|
||||||
database.delete(TABLE_CURRENT_WEATHER, CURRENT_WEATHER_ID + " = ?",
|
database.delete(TABLE_GENERAL_DATA, COLUMN_CITY_ID + " = ?",
|
||||||
new String[]{Integer.toString(currentWeather.getId())});
|
|
||||||
database.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void deleteCurrentWeatherByCityId(int cityId) {
|
|
||||||
SQLiteDatabase database = this.getWritableDatabase();
|
|
||||||
database.delete(TABLE_CURRENT_WEATHER, CURRENT_WEATHER_CITY_ID + " = ?",
|
|
||||||
new String[]{Integer.toString(cityId)});
|
new String[]{Integer.toString(cityId)});
|
||||||
database.close();
|
database.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getWidgetCityID(Context context) {
|
|
||||||
SQLiteHelper db = SQLiteHelper.getInstance(context);
|
|
||||||
int cityID=0;
|
|
||||||
List<CityToWatch> cities = db.getAllCitiesToWatch();
|
|
||||||
int rank=cities.get(0).getRank();
|
|
||||||
for (int i = 0; i < cities.size(); i++) { //find cityID for first city to watch = lowest Rank
|
|
||||||
CityToWatch city = cities.get(i);
|
|
||||||
//Log.d("debugtag",Integer.toString(city.getRank()));
|
|
||||||
if (city.getRank() <= rank ){
|
|
||||||
rank=city.getRank();
|
|
||||||
cityID = city.getCityId();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cityID;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,36 +13,20 @@ public class WeekForecast {
|
||||||
private long timestamp;
|
private long timestamp;
|
||||||
private long forecastFor;
|
private long forecastFor;
|
||||||
private int weatherID;
|
private int weatherID;
|
||||||
private float temperature;
|
private float energyDay;
|
||||||
private float temperature_min;
|
|
||||||
private float temperature_max;
|
|
||||||
private float humidity;
|
|
||||||
private float pressure;
|
|
||||||
private float precipitation;
|
|
||||||
private float wind_speed;
|
|
||||||
private float wind_direction;
|
|
||||||
private float uv_index;
|
|
||||||
private long timeSunrise;
|
private long timeSunrise;
|
||||||
private long timeSunset;
|
private long timeSunset;
|
||||||
|
|
||||||
public WeekForecast() {
|
public WeekForecast() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public WeekForecast(int id, int city_id, long timestamp, long forecastFor, int weatherID, float temperature, float temperature_min, float temperature_max, float humidity, float pressure, float precipitation, float wind_speed, float wind_direction, float uv_index) {
|
public WeekForecast(int id, int city_id, long timestamp, long forecastFor, int weatherID, float temperature, float temperature_min, float temperature_max, float humidity, float pressure, float energyDay, float wind_speed, float wind_direction, float uv_index) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.city_id = city_id;
|
this.city_id = city_id;
|
||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
this.forecastFor = forecastFor;
|
this.forecastFor = forecastFor;
|
||||||
this.weatherID = weatherID;
|
this.weatherID = weatherID;
|
||||||
this.temperature = temperature;
|
this.energyDay = energyDay;
|
||||||
this.temperature_min = temperature_min;
|
|
||||||
this.temperature_max = temperature_max;
|
|
||||||
this.humidity = humidity;
|
|
||||||
this.pressure = pressure;
|
|
||||||
this.precipitation=precipitation;
|
|
||||||
this.wind_speed=wind_speed;
|
|
||||||
this.wind_direction=wind_direction;
|
|
||||||
this.uv_index=uv_index;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -69,7 +53,7 @@ public class WeekForecast {
|
||||||
*/
|
*/
|
||||||
public long getLocalForecastTime(Context context) {
|
public long getLocalForecastTime(Context context) {
|
||||||
SQLiteHelper dbhelper = SQLiteHelper.getInstance(context);
|
SQLiteHelper dbhelper = SQLiteHelper.getInstance(context);
|
||||||
int timezoneseconds = dbhelper.getCurrentWeatherByCityId(city_id).getTimeZoneSeconds();
|
int timezoneseconds = dbhelper.getGeneralDataByCityId(city_id).getTimeZoneSeconds();
|
||||||
return forecastFor + timezoneseconds * 1000L;
|
return forecastFor + timezoneseconds * 1000L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -117,77 +101,9 @@ public class WeekForecast {
|
||||||
this.weatherID = weatherID;
|
this.weatherID = weatherID;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public float getEnergyDay() {return energyDay;}
|
||||||
* @return Returns the current temperature in Celsius.
|
|
||||||
*/
|
|
||||||
public float getTemperature() {
|
|
||||||
return temperature;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
public void setEnergyDay(float energyDay) {this.energyDay =energyDay;}
|
||||||
* @param temperature The current temperature to set in Celsius.
|
|
||||||
*/
|
|
||||||
public void setTemperature(float temperature) {
|
|
||||||
this.temperature = temperature;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Returns the min temperature in Celsius.
|
|
||||||
*/
|
|
||||||
public float getMinTemperature() {
|
|
||||||
return temperature_min;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param temperature_min The min temperature to set in Celsius.
|
|
||||||
*/
|
|
||||||
public void setMinTemperature(float temperature_min) {
|
|
||||||
this.temperature_min = temperature_min;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Returns the max temperature in Celsius.
|
|
||||||
*/
|
|
||||||
public float getMaxTemperature() {
|
|
||||||
return temperature_max;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param temperature_max The max temperature to set in Celsius.
|
|
||||||
*/
|
|
||||||
public void setMaxTemperature(float temperature_max) {
|
|
||||||
this.temperature_max = temperature_max;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Returns the humidity value in percent.
|
|
||||||
*/
|
|
||||||
public float getHumidity() {
|
|
||||||
return humidity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param humidity The humidity value in percent to set.
|
|
||||||
*/
|
|
||||||
public void setHumidity(float humidity) {
|
|
||||||
this.humidity = humidity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getPressure() { return pressure;}
|
|
||||||
public void setPressure(float pressure) {this.pressure=pressure;}
|
|
||||||
|
|
||||||
public float getPrecipitation() {return precipitation; }
|
|
||||||
public void setPrecipitation(float precipitation) {this.precipitation=precipitation;}
|
|
||||||
|
|
||||||
public float getWind_speed() { return wind_speed;}
|
|
||||||
public void setWind_speed(float wind_speed) {this.wind_speed=wind_speed;}
|
|
||||||
|
|
||||||
public float getWind_direction() { return wind_direction;}
|
|
||||||
public void setWind_direction(float wind_direction) {this.wind_direction=wind_direction;}
|
|
||||||
|
|
||||||
public float getUv_index() { return uv_index; }
|
|
||||||
public void setUv_index(float uv_index) {this.uv_index=uv_index;}
|
|
||||||
|
|
||||||
public long getTimeSunrise() { return timeSunrise; }
|
public long getTimeSunrise() { return timeSunrise; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,161 +54,6 @@ public final class StringFormatUtils {
|
||||||
return df.format(time);
|
return df.format(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String formatWindSpeed(Context context, float wind_speed) {
|
|
||||||
SharedPreferences sharedPreferences= PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
if (sharedPreferences.getBoolean("pref_WindFormat",true)==TRUE) {
|
|
||||||
if (wind_speed < 0.3) {
|
|
||||||
return formatInt(0, context.getString(R.string.units_Bft)); // Calm
|
|
||||||
} else if (wind_speed < 1.5) {
|
|
||||||
return formatInt(1, context.getString(R.string.units_Bft)); // Light air
|
|
||||||
} else if (wind_speed < 3.3) {
|
|
||||||
return formatInt(2, context.getString(R.string.units_Bft)); // Light breeze
|
|
||||||
} else if (wind_speed < 5.5) {
|
|
||||||
return formatInt(3, context.getString(R.string.units_Bft)); // Gentle breeze
|
|
||||||
} else if (wind_speed < 7.9) {
|
|
||||||
return formatInt(4, context.getString(R.string.units_Bft)); // Moderate breeze
|
|
||||||
} else if (wind_speed < 10.7) {
|
|
||||||
return formatInt(5, context.getString(R.string.units_Bft)); // Fresh breeze
|
|
||||||
} else if (wind_speed < 13.8) {
|
|
||||||
return formatInt(6, context.getString(R.string.units_Bft)); // Strong breeze
|
|
||||||
} else if (wind_speed < 17.1) {
|
|
||||||
return formatInt(7, context.getString(R.string.units_Bft)); // High wind
|
|
||||||
} else if (wind_speed < 20.7) {
|
|
||||||
return formatInt(8, context.getString(R.string.units_Bft)); // Gale
|
|
||||||
} else if (wind_speed < 24.4) {
|
|
||||||
return formatInt(9, context.getString(R.string.units_Bft)); // Strong gale
|
|
||||||
} else if (wind_speed < 28.4) {
|
|
||||||
return formatInt(10, context.getString(R.string.units_Bft)); // Storm
|
|
||||||
} else if (wind_speed < 32.6) {
|
|
||||||
return formatInt(11, context.getString(R.string.units_Bft)); // Violent storm
|
|
||||||
} else {
|
|
||||||
return formatInt(12, context.getString(R.string.units_Bft)); // Hurricane
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
if (sharedPreferences.getString("distanceUnit", "0").equals("1")) { //distanceUnit km
|
|
||||||
return formatInt((float) (wind_speed*3.6),context.getString(R.string.units_km_h));
|
|
||||||
}else return formatInt((float) (wind_speed*2.236),context.getString(R.string.units_mph));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable colorWindSpeed(Context context, float wind_speed) {
|
|
||||||
if (wind_speed < 0.3) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_transparent,null);
|
|
||||||
} else if (wind_speed < 1.5) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_transparent,null);
|
|
||||||
} else if (wind_speed < 3.3) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_transparent,null);
|
|
||||||
} else if (wind_speed < 5.5) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_transparent,null);
|
|
||||||
} else if (wind_speed < 7.9) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_transparent,null);
|
|
||||||
} else if (wind_speed < 10.7) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_yellow,null);
|
|
||||||
} else if (wind_speed < 13.8) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_yellow,null);
|
|
||||||
} else if (wind_speed < 17.1) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_yellow,null);
|
|
||||||
} else if (wind_speed < 20.7) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_orange,null);
|
|
||||||
} else if (wind_speed < 24.4) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_orange,null);
|
|
||||||
} else if (wind_speed < 28.4) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_lightred,null);
|
|
||||||
} else if (wind_speed < 32.6) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_lightred,null);
|
|
||||||
} else {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_red,null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int colorWindSpeedWidget(float wind_speed) {
|
|
||||||
if (wind_speed < 0.3) {
|
|
||||||
return R.drawable.ic_wind_empty;
|
|
||||||
} else if (wind_speed < 1.5) {
|
|
||||||
return R.drawable.ic_wind_empty;
|
|
||||||
} else if (wind_speed < 3.3) {
|
|
||||||
return R.drawable.ic_wind_empty;
|
|
||||||
} else if (wind_speed < 5.5) {
|
|
||||||
return R.drawable.ic_wind_empty;
|
|
||||||
} else if (wind_speed < 7.9) {
|
|
||||||
return R.drawable.ic_wind_empty;
|
|
||||||
} else if (wind_speed < 10.7) {
|
|
||||||
return R.drawable.ic_wind_yellow;
|
|
||||||
} else if (wind_speed < 13.8) {
|
|
||||||
return R.drawable.ic_wind_yellow;
|
|
||||||
} else if (wind_speed < 17.1) {
|
|
||||||
return R.drawable.ic_wind_yellow;
|
|
||||||
} else if (wind_speed < 20.7) {
|
|
||||||
return R.drawable.ic_wind_orange;
|
|
||||||
} else if (wind_speed < 24.4) {
|
|
||||||
return R.drawable.ic_wind_orange;
|
|
||||||
} else if (wind_speed < 28.4) {
|
|
||||||
return R.drawable.ic_wind_lightred;
|
|
||||||
} else if (wind_speed < 32.6) {
|
|
||||||
return R.drawable.ic_wind_lightred;
|
|
||||||
} else {
|
|
||||||
return R.drawable.ic_wind_lightred;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Drawable colorUVindex(Context context, int uvindex) {
|
|
||||||
if (uvindex <=2) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_transparent,null);
|
|
||||||
} else if (uvindex <= 5) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_yellow,null);
|
|
||||||
} else if (uvindex <= 7) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_orange,null);
|
|
||||||
} else if (uvindex <= 10) {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_lightred,null);
|
|
||||||
} else {
|
|
||||||
return ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_violet,null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer widgetColorWindSpeed(Context context, float wind_speed) {
|
|
||||||
if (wind_speed < 0.3) {
|
|
||||||
return R.drawable.rounded_grey;
|
|
||||||
} else if (wind_speed < 1.5) {
|
|
||||||
return R.drawable.rounded_grey;
|
|
||||||
} else if (wind_speed < 3.3) {
|
|
||||||
return R.drawable.rounded_grey;
|
|
||||||
} else if (wind_speed < 5.5) {
|
|
||||||
return R.drawable.rounded_grey;
|
|
||||||
} else if (wind_speed < 7.9) {
|
|
||||||
return R.drawable.rounded_grey;
|
|
||||||
} else if (wind_speed < 10.7) {
|
|
||||||
return R.drawable.rounded_yellow;
|
|
||||||
} else if (wind_speed < 13.8) {
|
|
||||||
return R.drawable.rounded_yellow;
|
|
||||||
} else if (wind_speed < 17.1) {
|
|
||||||
return R.drawable.rounded_yellow;
|
|
||||||
} else if (wind_speed < 20.7) {
|
|
||||||
return R.drawable.rounded_orange;
|
|
||||||
} else if (wind_speed < 24.4) {
|
|
||||||
return R.drawable.rounded_orange;
|
|
||||||
} else if (wind_speed < 28.4) {
|
|
||||||
return R.drawable.rounded_lightred;
|
|
||||||
} else if (wind_speed < 32.6) {
|
|
||||||
return R.drawable.rounded_lightred;
|
|
||||||
} else {
|
|
||||||
return R.drawable.rounded_red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer widgetColorUVindex(Context context, int uvindex) {
|
|
||||||
if (uvindex <=2) {
|
|
||||||
return R.drawable.rounded_green;
|
|
||||||
} else if (uvindex <= 5) {
|
|
||||||
return R.drawable.rounded_yellow;
|
|
||||||
} else if (uvindex <= 7) {
|
|
||||||
return R.drawable.rounded_orange;
|
|
||||||
} else if (uvindex <= 10) {
|
|
||||||
return R.drawable.rounded_lightred;
|
|
||||||
} else {
|
|
||||||
return R.drawable.rounded_violet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Integer getDayShort(int day){
|
public static Integer getDayShort(int day){
|
||||||
|
|
||||||
switch(day) {
|
switch(day) {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package org.woheller69.weather.ui.RecycleList;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.content.res.ResourcesCompat;
|
import androidx.core.content.res.ResourcesCompat;
|
||||||
import androidx.preference.PreferenceManager;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
|
@ -15,27 +14,23 @@ import android.widget.TextView;
|
||||||
import com.db.chart.Tools;
|
import com.db.chart.Tools;
|
||||||
import com.db.chart.model.BarSet;
|
import com.db.chart.model.BarSet;
|
||||||
import com.db.chart.model.ChartSet;
|
import com.db.chart.model.ChartSet;
|
||||||
import com.db.chart.model.LineSet;
|
|
||||||
import com.db.chart.view.AxisController;
|
import com.db.chart.view.AxisController;
|
||||||
import com.db.chart.view.BarChartView;
|
import com.db.chart.view.BarChartView;
|
||||||
|
|
||||||
import org.woheller69.weather.R;
|
import org.woheller69.weather.R;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
import org.woheller69.weather.preferences.AppPreferencesManager;
|
|
||||||
import org.woheller69.weather.ui.Help.StringFormatUtils;
|
import org.woheller69.weather.ui.Help.StringFormatUtils;
|
||||||
import org.woheller69.weather.ui.UiResourceProvider;
|
import org.woheller69.weather.ui.UiResourceProvider;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
|
|
||||||
public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.ViewHolder> {
|
public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.ViewHolder> {
|
||||||
private static final String TAG = "Forecast_Adapter";
|
|
||||||
|
|
||||||
private int[] dataSetTypes;
|
private int[] dataSetTypes;
|
||||||
private List<HourlyForecast> courseDayList;
|
private List<HourlyForecast> courseDayList;
|
||||||
|
|
@ -46,7 +41,7 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
private RecyclerView mCourseOfDay;
|
private RecyclerView mCourseOfDay;
|
||||||
private RecyclerView mWeekWeather;
|
private RecyclerView mWeekWeather;
|
||||||
|
|
||||||
private CurrentWeatherData currentWeatherDataList;
|
private GeneralData generalDataList;
|
||||||
|
|
||||||
public static final int OVERVIEW = 0;
|
public static final int OVERVIEW = 0;
|
||||||
public static final int DETAILS = 1;
|
public static final int DETAILS = 1;
|
||||||
|
|
@ -55,15 +50,15 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
public static final int CHART = 4;
|
public static final int CHART = 4;
|
||||||
public static final int EMPTY = 5;
|
public static final int EMPTY = 5;
|
||||||
|
|
||||||
public CityWeatherAdapter(CurrentWeatherData currentWeatherDataList, int[] dataSetTypes, Context context) {
|
public CityWeatherAdapter(GeneralData generalDataList, int[] dataSetTypes, Context context) {
|
||||||
this.currentWeatherDataList = currentWeatherDataList;
|
this.generalDataList = generalDataList;
|
||||||
this.dataSetTypes = dataSetTypes;
|
this.dataSetTypes = dataSetTypes;
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
|
||||||
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
||||||
|
|
||||||
List<HourlyForecast> hourlyForecasts = database.getForecastsByCityId(currentWeatherDataList.getCity_id());
|
List<HourlyForecast> hourlyForecasts = database.getForecastsByCityId(generalDataList.getCity_id());
|
||||||
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(currentWeatherDataList.getCity_id());
|
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
|
||||||
|
|
||||||
updateForecastData(hourlyForecasts);
|
updateForecastData(hourlyForecasts);
|
||||||
updateWeekForecastData(weekforecasts);
|
updateWeekForecastData(weekforecasts);
|
||||||
|
|
@ -90,21 +85,21 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
int cityId = forecasts.get(0).getCity_id();
|
int cityId = forecasts.get(0).getCity_id();
|
||||||
|
|
||||||
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context.getApplicationContext());
|
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context.getApplicationContext());
|
||||||
int zonemilliseconds = dbHelper.getCurrentWeatherByCityId(cityId).getTimeZoneSeconds() * 1000;
|
int zonemilliseconds = dbHelper.getGeneralDataByCityId(cityId).getTimeZoneSeconds() * 1000;
|
||||||
|
|
||||||
//temp max 0, temp min 1, humidity 2, pressure 3, precipitation 4, wind 5, wind direction 6, uv_index 7, forecast time 8, weather ID 9, number of FCs for day 10
|
//temp max 0, temp min 1, humidity 2, pressure 3, precipitation 4, wind 5, wind direction 6, uv_index 7, forecast time 8, weather ID 9, number of FCs for day 10
|
||||||
|
|
||||||
forecastData = new float[forecasts.size()][11];
|
forecastData = new float[forecasts.size()][11];
|
||||||
|
|
||||||
for (int i=0;i<forecasts.size();i++){
|
for (int i=0;i<forecasts.size();i++){
|
||||||
forecastData[i][0]=forecasts.get(i).getMaxTemperature();
|
forecastData[i][0]=0;
|
||||||
forecastData[i][1]=forecasts.get(i).getMinTemperature();
|
forecastData[i][1]=0;
|
||||||
forecastData[i][2]=forecasts.get(i).getHumidity();
|
forecastData[i][2]=0;
|
||||||
forecastData[i][3]=forecasts.get(i).getPressure();
|
forecastData[i][3]=0;
|
||||||
forecastData[i][4]=forecasts.get(i).getPrecipitation();
|
forecastData[i][4]=forecasts.get(i).getEnergyDay();
|
||||||
forecastData[i][5]=forecasts.get(i).getWind_speed();
|
forecastData[i][5]=0;
|
||||||
forecastData[i][6]=forecasts.get(i).getWind_direction();
|
forecastData[i][6]=0;
|
||||||
forecastData[i][7]=forecasts.get(i).getUv_index();
|
forecastData[i][7]=0;
|
||||||
forecastData[i][8]=forecasts.get(i).getForecastTime()+zonemilliseconds;
|
forecastData[i][8]=forecasts.get(i).getForecastTime()+zonemilliseconds;
|
||||||
forecastData[i][9]=forecasts.get(i).getWeatherID();
|
forecastData[i][9]=forecasts.get(i).getWeatherID();
|
||||||
forecastData[i][10]=1;
|
forecastData[i][10]=1;
|
||||||
|
|
@ -123,17 +118,13 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
|
|
||||||
public class OverViewHolder extends ViewHolder {
|
public class OverViewHolder extends ViewHolder {
|
||||||
TextView temperature;
|
TextView temperature;
|
||||||
ImageView weather;
|
|
||||||
ImageView windicon;
|
|
||||||
TextView updatetime;
|
TextView updatetime;
|
||||||
TextView sun;
|
TextView sun;
|
||||||
|
|
||||||
OverViewHolder(View v) {
|
OverViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
this.temperature = v.findViewById(R.id.card_overview_temperature);
|
this.temperature = v.findViewById(R.id.card_overview_temperature);
|
||||||
this.weather = v.findViewById(R.id.card_overview_weather_image);
|
|
||||||
this.sun=v.findViewById(R.id.card_overview_sunrise_sunset);
|
this.sun=v.findViewById(R.id.card_overview_sunrise_sunset);
|
||||||
this.windicon=v.findViewById(R.id.card_overview_windicon);
|
|
||||||
this.updatetime=v.findViewById(R.id.card_overview_update_time);
|
this.updatetime=v.findViewById(R.id.card_overview_update_time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -236,27 +227,22 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
|
public void onBindViewHolder(ViewHolder viewHolder, final int position) {
|
||||||
|
|
||||||
boolean isDay = currentWeatherDataList.isDay(context);
|
if (viewHolder.getItemViewType() == OVERVIEW) {
|
||||||
|
|
||||||
if (viewHolder.getItemViewType() == OVERVIEW) {
|
|
||||||
OverViewHolder holder = (OverViewHolder) viewHolder;
|
OverViewHolder holder = (OverViewHolder) viewHolder;
|
||||||
|
|
||||||
//correct for timezone differences
|
//correct for timezone differences
|
||||||
int zoneseconds = currentWeatherDataList.getTimeZoneSeconds();
|
int zoneseconds = generalDataList.getTimeZoneSeconds();
|
||||||
long riseTime = (currentWeatherDataList.getTimeSunrise() + zoneseconds) * 1000;
|
long riseTime = (generalDataList.getTimeSunrise() + zoneseconds) * 1000;
|
||||||
long setTime = (currentWeatherDataList.getTimeSunset() + zoneseconds) * 1000;
|
long setTime = (generalDataList.getTimeSunset() + zoneseconds) * 1000;
|
||||||
if (riseTime==zoneseconds*1000 || setTime==zoneseconds*1000) holder.sun.setText("\u2600\u25b2 --:--" + " \u25bc --:--" );
|
if (riseTime==zoneseconds*1000 || setTime==zoneseconds*1000) holder.sun.setText("\u2600\u25b2 --:--" + " \u25bc --:--" );
|
||||||
else {
|
else {
|
||||||
holder.sun.setText("\u2600\u25b2 " + StringFormatUtils.formatTimeWithoutZone(context, riseTime) + " \u25bc " + StringFormatUtils.formatTimeWithoutZone(context, setTime));
|
holder.sun.setText("\u2600\u25b2 " + StringFormatUtils.formatTimeWithoutZone(context, riseTime) + " \u25bc " + StringFormatUtils.formatTimeWithoutZone(context, setTime));
|
||||||
}
|
}
|
||||||
holder.windicon.setImageResource(StringFormatUtils.colorWindSpeedWidget(currentWeatherDataList.getWindSpeed()));
|
long time = generalDataList.getTimestamp();
|
||||||
long time = currentWeatherDataList.getTimestamp();
|
|
||||||
long updateTime = ((time + zoneseconds) * 1000);
|
long updateTime = ((time + zoneseconds) * 1000);
|
||||||
|
|
||||||
holder.updatetime.setText("("+StringFormatUtils.formatTimeWithoutZone(context, updateTime)+")");
|
holder.updatetime.setText("("+StringFormatUtils.formatTimeWithoutZone(context, updateTime)+")");
|
||||||
|
|
||||||
setImage(currentWeatherDataList.getWeatherID(), holder.weather, isDay);
|
|
||||||
|
|
||||||
|
|
||||||
} else if (viewHolder.getItemViewType() == WEEK) {
|
} else if (viewHolder.getItemViewType() == WEEK) {
|
||||||
|
|
||||||
|
|
@ -265,7 +251,7 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
holder.recyclerView.setLayoutManager(layoutManager);
|
holder.recyclerView.setLayoutManager(layoutManager);
|
||||||
|
|
||||||
|
|
||||||
final WeekWeatherAdapter adapter = new WeekWeatherAdapter(context, forecastData,currentWeatherDataList.getCity_id());
|
final WeekWeatherAdapter adapter = new WeekWeatherAdapter(context, forecastData, generalDataList.getCity_id());
|
||||||
holder.recyclerView.setAdapter(adapter);
|
holder.recyclerView.setAdapter(adapter);
|
||||||
holder.recyclerView.setFocusable(false);
|
holder.recyclerView.setFocusable(false);
|
||||||
|
|
||||||
|
|
@ -280,7 +266,7 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
@Override
|
@Override
|
||||||
public void onItemClick(View view, int position) {
|
public void onItemClick(View view, int position) {
|
||||||
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
||||||
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(currentWeatherDataList.getCity_id());
|
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
|
||||||
long time = weekforecasts.get(position).getForecastTime(); //time of clicked week item
|
long time = weekforecasts.get(position).getForecastTime(); //time of clicked week item
|
||||||
time=time-6*3600000; //week item normally midday -> subtract 6h to get morning time
|
time=time-6*3600000; //week item normally midday -> subtract 6h to get morning time
|
||||||
|
|
||||||
|
|
@ -343,7 +329,7 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
ChartViewHolder holder = (ChartViewHolder) viewHolder;
|
ChartViewHolder holder = (ChartViewHolder) viewHolder;
|
||||||
|
|
||||||
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
||||||
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(currentWeatherDataList.getCity_id());
|
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
|
||||||
|
|
||||||
if (weekforecasts.isEmpty()) {
|
if (weekforecasts.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -355,12 +341,12 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
|
|
||||||
Calendar c = Calendar.getInstance();
|
Calendar c = Calendar.getInstance();
|
||||||
c.setTimeZone(TimeZone.getTimeZone("GMT"));
|
c.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
int zonemilliseconds = currentWeatherDataList.getTimeZoneSeconds()*1000;
|
int zonemilliseconds = generalDataList.getTimeZoneSeconds()*1000;
|
||||||
|
|
||||||
for (int i=0 ; i< weekforecasts.size();i++) {
|
for (int i=0 ; i< weekforecasts.size();i++) {
|
||||||
c.setTimeInMillis(weekforecasts.get(i).getForecastTime()+zonemilliseconds);
|
c.setTimeInMillis(weekforecasts.get(i).getForecastTime()+zonemilliseconds);
|
||||||
int day = c.get(Calendar.DAY_OF_WEEK);
|
int day = c.get(Calendar.DAY_OF_WEEK);
|
||||||
float precip=weekforecasts.get(i).getPrecipitation();
|
float precip=weekforecasts.get(i).getEnergyDay();
|
||||||
|
|
||||||
String dayString = context.getResources().getString(StringFormatUtils.getDayShort(day));
|
String dayString = context.getResources().getString(StringFormatUtils.getDayShort(day));
|
||||||
if (weekforecasts.size()>8) dayString=dayString.substring(0,1); //use first character only if more than 8 days to avoid overlapping text
|
if (weekforecasts.size()>8) dayString=dayString.substring(0,1); //use first character only if more than 8 days to avoid overlapping text
|
||||||
|
|
@ -369,18 +355,12 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
if (precip>pmax) pmax=precip;
|
if (precip>pmax) pmax=precip;
|
||||||
}
|
}
|
||||||
|
|
||||||
int step;
|
|
||||||
|
|
||||||
ArrayList<ChartSet> temperature = new ArrayList<>();
|
|
||||||
|
|
||||||
ArrayList<ChartSet> precipitation = new ArrayList<>();
|
ArrayList<ChartSet> precipitation = new ArrayList<>();
|
||||||
precipitation.add(precipitationDataset);
|
precipitation.add(precipitationDataset);
|
||||||
|
|
||||||
precipitationDataset.setColor(ContextCompat.getColor(context,R.color.yellow));
|
precipitationDataset.setColor(ContextCompat.getColor(context,R.color.yellow));
|
||||||
precipitationDataset.setAlpha(0.8f); // make precipitation bars transparent
|
precipitationDataset.setAlpha(0.8f); // make precipitation bars transparent
|
||||||
|
|
||||||
|
|
||||||
step = (int) Math.ceil((Math.max(1,pmax))/4);
|
|
||||||
holder.barChartView.addData(precipitation);
|
holder.barChartView.addData(precipitation);
|
||||||
holder.barChartView.setBarSpacing(10);
|
holder.barChartView.setBarSpacing(10);
|
||||||
holder.barChartView.setXAxis(false);
|
holder.barChartView.setXAxis(false);
|
||||||
|
|
@ -398,10 +378,6 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
//No update for error needed
|
//No update for error needed
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(int value, ImageView imageView, boolean isDay) {
|
|
||||||
imageView.setImageResource(UiResourceProvider.getImageResourceForWeatherCategory(value, isDay));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.woheller69.weather.R;
|
import org.woheller69.weather.R;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
import org.woheller69.weather.ui.Help.StringFormatUtils;
|
import org.woheller69.weather.ui.Help.StringFormatUtils;
|
||||||
|
|
@ -63,14 +63,14 @@ public class CourseOfDayAdapter extends RecyclerView.Adapter<CourseOfDayAdapter.
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(CourseOfDayViewHolder holder, int position) {
|
public void onBindViewHolder(CourseOfDayViewHolder holder, int position) {
|
||||||
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context);
|
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context);
|
||||||
CurrentWeatherData currentWeather = dbHelper.getCurrentWeatherByCityId(courseOfDayList.get(position).getCity_id());
|
GeneralData generalData = dbHelper.getGeneralDataByCityId(courseOfDayList.get(position).getCity_id());
|
||||||
|
|
||||||
Calendar forecastTime = Calendar.getInstance();
|
Calendar forecastTime = Calendar.getInstance();
|
||||||
forecastTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
forecastTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
forecastTime.setTimeInMillis(courseOfDayList.get(position).getLocalForecastTime(context));
|
forecastTime.setTimeInMillis(courseOfDayList.get(position).getLocalForecastTime(context));
|
||||||
|
|
||||||
boolean isDay;
|
boolean isDay;
|
||||||
if (currentWeather.getTimeSunrise()==0 || currentWeather.getTimeSunset()==0){
|
if (generalData.getTimeSunrise()==0 || generalData.getTimeSunset()==0){
|
||||||
if ((dbHelper.getCityToWatch(courseOfDayList.get(position).getCity_id()).getLatitude())>0){ //northern hemisphere
|
if ((dbHelper.getCityToWatch(courseOfDayList.get(position).getCity_id()).getLatitude())>0){ //northern hemisphere
|
||||||
isDay= forecastTime.get(Calendar.DAY_OF_YEAR) >= 80 && forecastTime.get(Calendar.DAY_OF_YEAR) <= 265; //from March 21 to September 22 (incl)
|
isDay= forecastTime.get(Calendar.DAY_OF_YEAR) >= 80 && forecastTime.get(Calendar.DAY_OF_YEAR) <= 265; //from March 21 to September 22 (incl)
|
||||||
}else{ //southern hemisphere
|
}else{ //southern hemisphere
|
||||||
|
|
@ -79,14 +79,14 @@ public class CourseOfDayAdapter extends RecyclerView.Adapter<CourseOfDayAdapter.
|
||||||
}else {
|
}else {
|
||||||
Calendar sunSetTime = Calendar.getInstance();
|
Calendar sunSetTime = Calendar.getInstance();
|
||||||
sunSetTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
sunSetTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
sunSetTime.setTimeInMillis(currentWeather.getTimeSunset() * 1000 + currentWeather.getTimeZoneSeconds() * 1000L);
|
sunSetTime.setTimeInMillis(generalData.getTimeSunset() * 1000 + generalData.getTimeZoneSeconds() * 1000L);
|
||||||
sunSetTime.set(Calendar.DAY_OF_YEAR, forecastTime.get(Calendar.DAY_OF_YEAR));
|
sunSetTime.set(Calendar.DAY_OF_YEAR, forecastTime.get(Calendar.DAY_OF_YEAR));
|
||||||
sunSetTime.set(Calendar.YEAR, forecastTime.get(Calendar.YEAR));
|
sunSetTime.set(Calendar.YEAR, forecastTime.get(Calendar.YEAR));
|
||||||
|
|
||||||
|
|
||||||
Calendar sunRiseTime = Calendar.getInstance();
|
Calendar sunRiseTime = Calendar.getInstance();
|
||||||
sunRiseTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
sunRiseTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
sunRiseTime.setTimeInMillis(currentWeather.getTimeSunrise() * 1000 + currentWeather.getTimeZoneSeconds() * 1000L);
|
sunRiseTime.setTimeInMillis(generalData.getTimeSunrise() * 1000 + generalData.getTimeZoneSeconds() * 1000L);
|
||||||
sunRiseTime.set(Calendar.DAY_OF_YEAR, forecastTime.get(Calendar.DAY_OF_YEAR));
|
sunRiseTime.set(Calendar.DAY_OF_YEAR, forecastTime.get(Calendar.DAY_OF_YEAR));
|
||||||
sunRiseTime.set(Calendar.YEAR, forecastTime.get(Calendar.YEAR));
|
sunRiseTime.set(Calendar.YEAR, forecastTime.get(Calendar.YEAR));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.woheller69.weather.R;
|
import org.woheller69.weather.R;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
import org.woheller69.weather.ui.Help.StringFormatUtils;
|
import org.woheller69.weather.ui.Help.StringFormatUtils;
|
||||||
import org.woheller69.weather.ui.UiResourceProvider;
|
import org.woheller69.weather.ui.UiResourceProvider;
|
||||||
|
|
@ -69,7 +69,7 @@ public class WeekWeatherAdapter extends RecyclerView.Adapter<WeekWeatherAdapter.
|
||||||
if (dayValues.length!=11) return; //Fixes app crash if forecastData not yet ready.
|
if (dayValues.length!=11) return; //Fixes app crash if forecastData not yet ready.
|
||||||
|
|
||||||
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context);
|
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context);
|
||||||
CurrentWeatherData currentWeather = dbHelper.getCurrentWeatherByCityId(cityID);
|
GeneralData generalData = dbHelper.getGeneralDataByCityId(cityID);
|
||||||
|
|
||||||
Calendar forecastTime = Calendar.getInstance();
|
Calendar forecastTime = Calendar.getInstance();
|
||||||
forecastTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
forecastTime.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||||
|
|
@ -77,7 +77,7 @@ public class WeekWeatherAdapter extends RecyclerView.Adapter<WeekWeatherAdapter.
|
||||||
|
|
||||||
boolean isDay;
|
boolean isDay;
|
||||||
|
|
||||||
if (currentWeather.getTimeSunrise()==0 || currentWeather.getTimeSunset()==0) {
|
if (generalData.getTimeSunrise()==0 || generalData.getTimeSunset()==0) {
|
||||||
if ((dbHelper.getCityToWatch(cityID).getLatitude()) > 0) { //northern hemisphere
|
if ((dbHelper.getCityToWatch(cityID).getLatitude()) > 0) { //northern hemisphere
|
||||||
isDay = forecastTime.get(Calendar.DAY_OF_YEAR) >= 80 && forecastTime.get(Calendar.DAY_OF_YEAR) <= 265; //from March 21 to September 22 (incl)
|
isDay = forecastTime.get(Calendar.DAY_OF_YEAR) >= 80 && forecastTime.get(Calendar.DAY_OF_YEAR) <= 265; //from March 21 to September 22 (incl)
|
||||||
} else { //southern hemisphere
|
} else { //southern hemisphere
|
||||||
|
|
|
||||||
|
|
@ -158,147 +158,4 @@ public class UiResourceProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param categoryNumber The category number. See IApiToDatabaseConversion#WeatherCategories
|
|
||||||
* for details.
|
|
||||||
* @param isDay True if TimeStamp between sunrise and sunset
|
|
||||||
* @return Returns the image resource that belongs to the given category number.
|
|
||||||
*/
|
|
||||||
public static int getImageResourceForWeatherCategory(int categoryNumber, boolean isDay) {
|
|
||||||
if (categoryNumber == WeatherCategories.CLEAR_SKY.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_00d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_00n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.FEW_CLOUDS.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_01d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_01n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.SCATTERED_CLOUDS.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_02d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_02n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.OVERCAST_CLOUDS.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_03d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_03n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.MIST.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_45d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_45n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.DRIZZLE_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_53d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_53n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.FREEZING_DRIZZLE_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_57d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_57n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.LIGHT_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_61d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_61n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.MODERATE_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_63d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_63n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.HEAVY_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_65d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_65n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.LIGHT_SHOWER_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_80d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_80n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.SHOWER_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_81d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_81n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.LIGHT_SNOW.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_71d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_71n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.MODERATE_SNOW.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_73d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_73n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.HEAVY_SNOW.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_75d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_75n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.LIGHT_FREEZING_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_66d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_66n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.FREEZING_RAIN.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_67d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_67n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.LIGHT_SHOWER_SNOW.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_85d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_85n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.SHOWER_SNOW.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_86d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_86n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.SHOWER_RAIN_SNOW.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_84d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_84n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.THUNDERSTORM.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_95d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_95n;
|
|
||||||
}
|
|
||||||
} else if (categoryNumber == WeatherCategories.THUNDERSTORM_HAIL.getNumVal()) {
|
|
||||||
if (isDay) {
|
|
||||||
return R.drawable.wmo_image_96d;
|
|
||||||
} else {
|
|
||||||
return R.drawable.wmo_image_96n;
|
|
||||||
}
|
|
||||||
} else { //this should not occur
|
|
||||||
return R.drawable.wmo_image_error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,7 @@ package org.woheller69.weather.ui;
|
||||||
|
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.CHART;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.CHART;
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.DAY;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.DAY;
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.DETAILS;
|
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.EMPTY;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.EMPTY;
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.OVERVIEW;
|
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.WEEK;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.WEEK;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
|
@ -16,7 +14,6 @@ import androidx.annotation.Nullable;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
|
|
||||||
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
|
||||||
|
|
@ -25,7 +22,7 @@ import android.view.ViewGroup;
|
||||||
|
|
||||||
import org.woheller69.weather.R;
|
import org.woheller69.weather.R;
|
||||||
import org.woheller69.weather.activities.ForecastCityActivity;
|
import org.woheller69.weather.activities.ForecastCityActivity;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
|
|
@ -38,7 +35,7 @@ import org.woheller69.weather.ui.viewPager.WeatherPagerAdapter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class WeatherCityFragment extends Fragment implements IUpdateableCityUI {
|
public class WeatherCityFragment extends Fragment implements IUpdateableCityUI {
|
||||||
private static final int MINGRIDWIDTH = 500;
|
|
||||||
private int mCityId = -1;
|
private int mCityId = -1;
|
||||||
private int[] mDataSetTypes = new int[]{};
|
private int[] mDataSetTypes = new int[]{};
|
||||||
private static int[] mFull = {DAY, WEEK, CHART}; //TODO Make dynamic from Settings
|
private static int[] mFull = {DAY, WEEK, CHART}; //TODO Make dynamic from Settings
|
||||||
|
|
@ -65,10 +62,10 @@ public class WeatherCityFragment extends Fragment implements IUpdateableCityUI {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadData() {
|
public void loadData() {
|
||||||
CurrentWeatherData currentWeatherData = SQLiteHelper.getInstance(getContext()).getCurrentWeatherByCityId(mCityId);
|
GeneralData generalData = SQLiteHelper.getInstance(getContext()).getGeneralDataByCityId(mCityId);
|
||||||
if (currentWeatherData.getTimestamp()==0) mDataSetTypes=mEmpty; //show empty view if no data available yet
|
if (generalData.getTimestamp()==0) mDataSetTypes=mEmpty; //show empty view if no data available yet
|
||||||
else mDataSetTypes=mFull;
|
else mDataSetTypes=mFull;
|
||||||
mAdapter = new CityWeatherAdapter(currentWeatherData, mDataSetTypes, getContext());
|
mAdapter = new CityWeatherAdapter(generalData, mDataSetTypes, getContext());
|
||||||
setAdapter(mAdapter);
|
setAdapter(mAdapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,7 +120,7 @@ public class WeatherCityFragment extends Fragment implements IUpdateableCityUI {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processNewCurrentWeatherData(CurrentWeatherData data) {
|
public void processNewGeneralData(GeneralData data) {
|
||||||
if (data != null && data.getCity_id() == mCityId) {
|
if (data != null && data.getCity_id() == mCityId) {
|
||||||
mDataSetTypes= mFull;
|
mDataSetTypes= mFull;
|
||||||
setAdapter(new CityWeatherAdapter(data, mDataSetTypes, getContext()));
|
setAdapter(new CityWeatherAdapter(data, mDataSetTypes, getContext()));
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package org.woheller69.weather.ui.updater;
|
package org.woheller69.weather.ui.updater;
|
||||||
|
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
|
|
||||||
|
|
@ -10,7 +10,7 @@ import java.util.List;
|
||||||
* Created by chris on 24.01.2017.
|
* Created by chris on 24.01.2017.
|
||||||
*/
|
*/
|
||||||
public interface IUpdateableCityUI {
|
public interface IUpdateableCityUI {
|
||||||
void processNewCurrentWeatherData(CurrentWeatherData data);
|
void processNewGeneralData(GeneralData data);
|
||||||
|
|
||||||
void processNewForecasts(List<HourlyForecast> hourlyForecasts);
|
void processNewForecasts(List<HourlyForecast> hourlyForecasts);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package org.woheller69.weather.ui.updater;
|
package org.woheller69.weather.ui.updater;
|
||||||
|
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
|
|
||||||
|
|
@ -24,10 +24,10 @@ public class ViewUpdater {
|
||||||
subscribers.remove(sub);
|
subscribers.remove(sub);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateCurrentWeatherData(CurrentWeatherData data) {
|
public static void updateGeneralDataData(GeneralData data) {
|
||||||
ArrayList<IUpdateableCityUI> subcopy = new ArrayList<>(subscribers); //copy list needed as bugfix for concurrent modification exception
|
ArrayList<IUpdateableCityUI> subcopy = new ArrayList<>(subscribers); //copy list needed as bugfix for concurrent modification exception
|
||||||
for (IUpdateableCityUI sub : subcopy) {
|
for (IUpdateableCityUI sub : subcopy) {
|
||||||
sub.processNewCurrentWeatherData(data);
|
sub.processNewGeneralData(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import androidx.lifecycle.Lifecycle;
|
||||||
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
import androidx.viewpager2.adapter.FragmentStateAdapter;
|
||||||
|
|
||||||
import org.woheller69.weather.database.CityToWatch;
|
import org.woheller69.weather.database.CityToWatch;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
|
|
@ -77,7 +77,7 @@ public class WeatherPagerAdapter extends FragmentStateAdapter implements IUpdate
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processNewCurrentWeatherData(CurrentWeatherData data) {
|
public void processNewGeneralData(GeneralData data) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,16 @@
|
||||||
package org.woheller69.weather.weather_api;
|
package org.woheller69.weather.weather_api;
|
||||||
|
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This interface defines the frame of the functionality to extractCurrentWeatherData weather information from which
|
* This interface defines the frame of the functionality to extractGeneralData weather information from which
|
||||||
* is returned by some API.
|
* is returned by some API.
|
||||||
*/
|
*/
|
||||||
public interface IDataExtractor {
|
public interface IDataExtractor {
|
||||||
|
|
||||||
/**
|
|
||||||
* @param data The data that contains the information to instantiate a CurrentWeatherData
|
|
||||||
* object. In the easiest case this is the (HTTP) response of the One Call API.
|
|
||||||
* @return Returns the extracted information as a CurrentWeatherData instance.
|
|
||||||
*/
|
|
||||||
CurrentWeatherData extractCurrentWeather(String data);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param data The data that contains the information to instantiate a Forecast object.
|
* @param data The data that contains the information to instantiate a Forecast object.
|
||||||
* @return Returns the extracted weather forecast information. In case some error occurs, null
|
* @return Returns the extracted weather forecast information. In case some error occurs, null
|
||||||
|
|
@ -33,10 +26,4 @@ public interface IDataExtractor {
|
||||||
|
|
||||||
List<HourlyForecast> extractHourlyForecast(String data, int cityID);
|
List<HourlyForecast> extractHourlyForecast(String data, int cityID);
|
||||||
|
|
||||||
/**
|
|
||||||
* @param data0, data1, data2, data3, data4 contain the information to retrieve the rain for a minute within the next 60min.
|
|
||||||
* @return Returns a string with a rain drop in case of rain or a - in case of no rain
|
|
||||||
*/
|
|
||||||
String extractRain60min(String data0,String data1, String data2, String data3, String data4);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.woheller69.weather.SolarPowerPlant;
|
import org.woheller69.weather.SolarPowerPlant;
|
||||||
import org.woheller69.weather.database.CityToWatch;
|
import org.woheller69.weather.database.CityToWatch;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
|
|
@ -30,50 +30,17 @@ public class OMDataExtractor implements IDataExtractor {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public CurrentWeatherData extractCurrentWeather(String data) {
|
|
||||||
try {
|
|
||||||
JSONObject jsonData = new JSONObject(data);
|
|
||||||
CurrentWeatherData weatherData = new CurrentWeatherData();
|
|
||||||
weatherData.setTimestamp(System.currentTimeMillis() / 1000);
|
|
||||||
IApiToDatabaseConversion conversion = new OMToDatabaseConversion();
|
|
||||||
if (jsonData.has("weathercode")) weatherData.setWeatherID(conversion.convertWeatherCategory(jsonData.getString("weathercode")));
|
|
||||||
if (jsonData.has("temperature")) weatherData.setTemperatureCurrent((float) jsonData.getDouble("temperature"));
|
|
||||||
if (jsonData.has("windspeed")) weatherData.setWindSpeed((float) jsonData.getDouble("windspeed"));
|
|
||||||
if (jsonData.has("winddirection")) weatherData.setWindDirection((float) jsonData.getDouble("winddirection"));
|
|
||||||
weatherData.setTimeSunrise(0L);
|
|
||||||
weatherData.setTimeSunset(0L);
|
|
||||||
weatherData.setHumidity(0);
|
|
||||||
weatherData.setPressure(0);
|
|
||||||
weatherData.setCloudiness(0);
|
|
||||||
|
|
||||||
return weatherData;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<WeekForecast> extractWeekForecast(String data) {
|
public List<WeekForecast> extractWeekForecast(String data) {
|
||||||
try {
|
try {
|
||||||
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
|
|
||||||
List<WeekForecast> weekforecasts = new ArrayList<>();
|
List<WeekForecast> weekforecasts = new ArrayList<>();
|
||||||
JSONObject jsonData = new JSONObject(data);
|
JSONObject jsonData = new JSONObject(data);
|
||||||
JSONArray timeArray = jsonData.getJSONArray("time");
|
JSONArray timeArray = jsonData.getJSONArray("time");
|
||||||
JSONArray weathercodeArray = jsonData.has("weathercode") ? jsonData.getJSONArray("weathercode") : null;
|
JSONArray weathercodeArray = jsonData.has("weathercode") ? jsonData.getJSONArray("weathercode") : null;
|
||||||
JSONArray tempMaxArray = jsonData.has("temperature_2m_max") ? jsonData.getJSONArray("temperature_2m_max") : null;
|
|
||||||
JSONArray tempMinArray = jsonData.has("temperature_2m_min") ? jsonData.getJSONArray("temperature_2m_min") : null;
|
|
||||||
JSONArray sunriseArray = jsonData.has("sunrise") ? jsonData.getJSONArray("sunrise") : null;
|
JSONArray sunriseArray = jsonData.has("sunrise") ? jsonData.getJSONArray("sunrise") : null;
|
||||||
JSONArray sunsetArray = jsonData.has("sunset") ? jsonData.getJSONArray("sunset") : null;
|
JSONArray sunsetArray = jsonData.has("sunset") ? jsonData.getJSONArray("sunset") : null;
|
||||||
JSONArray uvIndexArray = jsonData.has("uv_index_max") ? jsonData.getJSONArray("uv_index_max") : null;
|
|
||||||
JSONArray precipitationArray = jsonData.has("precipitation_sum") ? jsonData.getJSONArray("precipitation_sum") : null;
|
|
||||||
JSONArray windSpeedArray = jsonData.has("windspeed_10m_max") ? jsonData.getJSONArray("windspeed_10m_max") : null;
|
|
||||||
JSONArray snowfallArray = jsonData.has("snowfall_sum") ? jsonData.getJSONArray("snowfall_sum") : null;
|
|
||||||
JSONArray showersArray = jsonData.has("showers_sum") ? jsonData.getJSONArray("showers_sum") : null;
|
|
||||||
JSONArray rainArray = jsonData.has("rain_sum") ? jsonData.getJSONArray("rain_sum") : null;
|
|
||||||
|
|
||||||
IApiToDatabaseConversion conversion = new OMToDatabaseConversion();
|
IApiToDatabaseConversion conversion = new OMToDatabaseConversion();
|
||||||
for (int i = 0; i < timeArray.length(); i++) {
|
for (int i = 0; i < timeArray.length(); i++) {
|
||||||
|
|
@ -81,14 +48,8 @@ public class OMDataExtractor implements IDataExtractor {
|
||||||
weekForecast.setTimestamp(System.currentTimeMillis() / 1000);
|
weekForecast.setTimestamp(System.currentTimeMillis() / 1000);
|
||||||
if (!timeArray.isNull(i)) weekForecast.setForecastTime((timeArray.getLong(i)+12*3600)*1000L); //shift to midday
|
if (!timeArray.isNull(i)) weekForecast.setForecastTime((timeArray.getLong(i)+12*3600)*1000L); //shift to midday
|
||||||
if (!weathercodeArray.isNull(i)) weekForecast.setWeatherID(conversion.convertWeatherCategory(weathercodeArray.getString(i)));
|
if (!weathercodeArray.isNull(i)) weekForecast.setWeatherID(conversion.convertWeatherCategory(weathercodeArray.getString(i)));
|
||||||
if (!tempMaxArray.isNull(i)) weekForecast.setMaxTemperature((float) tempMaxArray.getDouble(i));
|
|
||||||
if (!tempMinArray.isNull(i)) weekForecast.setMinTemperature((float) tempMinArray.getDouble(i));
|
|
||||||
if (!sunriseArray.isNull(i)) weekForecast.setTimeSunrise(sunriseArray.getLong(i));
|
if (!sunriseArray.isNull(i)) weekForecast.setTimeSunrise(sunriseArray.getLong(i));
|
||||||
if (!sunsetArray.isNull(i)) weekForecast.setTimeSunset(sunsetArray.getLong(i));
|
if (!sunsetArray.isNull(i)) weekForecast.setTimeSunset(sunsetArray.getLong(i));
|
||||||
if (!uvIndexArray.isNull(i)) {
|
|
||||||
weekForecast.setUv_index((float) uvIndexArray.getDouble(i));
|
|
||||||
} else weekForecast.setUv_index(-1);
|
|
||||||
if (!windSpeedArray.isNull(i)) weekForecast.setWind_speed((float) windSpeedArray.getDouble(i));
|
|
||||||
weekforecasts.add(weekForecast);
|
weekforecasts.add(weekForecast);
|
||||||
}
|
}
|
||||||
return weekforecasts;
|
return weekforecasts;
|
||||||
|
|
@ -139,47 +100,4 @@ public class OMDataExtractor implements IDataExtractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see IDataExtractor#extractRain60min(String, String, String, String, String)
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public String extractRain60min(String data0,String data1, String data2, String data3, String data4) {
|
|
||||||
try {
|
|
||||||
|
|
||||||
String rain = "";
|
|
||||||
JSONObject jsonData0 = new JSONObject(data0);
|
|
||||||
JSONObject jsonData1 = new JSONObject(data1);
|
|
||||||
JSONObject jsonData2 = new JSONObject(data2);
|
|
||||||
JSONObject jsonData3 = new JSONObject(data3);
|
|
||||||
JSONObject jsonData4 = new JSONObject(data4);
|
|
||||||
double rain5min=jsonData0.getDouble("precipitation")+jsonData1.getDouble("precipitation")+jsonData2.getDouble("precipitation")+jsonData3.getDouble("precipitation")+jsonData4.getDouble("precipitation");
|
|
||||||
if (rain5min==0){
|
|
||||||
rain ="\u25a1";
|
|
||||||
} else if (rain5min<2.5){ // very light rain equals <0.5mm/h (2.5 = 5 x 0.5)
|
|
||||||
rain ="\u25a4";
|
|
||||||
}else if (rain5min<12.5){ //light rain equals <2.5mm/h (12.5 = 5 x 2.5)
|
|
||||||
rain ="\u25a6";
|
|
||||||
} else{
|
|
||||||
rain ="\u25a0";
|
|
||||||
}
|
|
||||||
|
|
||||||
return rain;
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param data The data that contains the information to retrieve the ID of the city.
|
|
||||||
* If data for a single city were requested, the response string can be
|
|
||||||
* passed as an argument.
|
|
||||||
* If data for multiple cities were requested, make sure to pass only one item
|
|
||||||
* of the response list at a time!
|
|
||||||
* @return Returns the ID of the city or Integer#MIN_VALUE in case the data is not well-formed
|
|
||||||
* and the information could not be extracted.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ public class OMHttpRequest {
|
||||||
SharedPreferences sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context);
|
SharedPreferences sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
|
||||||
return String.format(
|
return String.format(
|
||||||
"%sforecast?latitude=%s&longitude=%s&forecast_days=%s&hourly=diffuse_radiation,direct_normal_irradiance,weathercode&daily=weathercode,temperature_2m_max,temperature_2m_min,sunrise,sunset,uv_index_max,precipitation_sum,windspeed_10m_max¤t_weather=true&windspeed_unit=ms&timeformat=unixtime&timezone=auto",
|
"%sforecast?latitude=%s&longitude=%s&forecast_days=%s&hourly=diffuse_radiation,direct_normal_irradiance,weathercode&daily=weathercode,sunrise,sunset,&timeformat=unixtime&timezone=auto",
|
||||||
BuildConfig.BASE_URL,
|
BuildConfig.BASE_URL,
|
||||||
lat,
|
lat,
|
||||||
lon,
|
lon,
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,7 @@
|
||||||
package org.woheller69.weather.weather_api.open_meteo;
|
package org.woheller69.weather.weather_api.open_meteo;
|
||||||
|
|
||||||
import android.appwidget.AppWidgetManager;
|
|
||||||
import android.content.ComponentName;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.widget.RemoteViews;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.android.volley.VolleyError;
|
import com.android.volley.VolleyError;
|
||||||
|
|
@ -14,8 +10,7 @@ import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.woheller69.weather.R;
|
import org.woheller69.weather.R;
|
||||||
import org.woheller69.weather.activities.NavigationActivity;
|
import org.woheller69.weather.activities.NavigationActivity;
|
||||||
import org.woheller69.weather.database.CityToWatch;
|
import org.woheller69.weather.database.GeneralData;
|
||||||
import org.woheller69.weather.database.CurrentWeatherData;
|
|
||||||
import org.woheller69.weather.database.HourlyForecast;
|
import org.woheller69.weather.database.HourlyForecast;
|
||||||
import org.woheller69.weather.database.WeekForecast;
|
import org.woheller69.weather.database.WeekForecast;
|
||||||
import org.woheller69.weather.database.SQLiteHelper;
|
import org.woheller69.weather.database.SQLiteHelper;
|
||||||
|
|
@ -23,7 +18,6 @@ import org.woheller69.weather.ui.updater.ViewUpdater;
|
||||||
import org.woheller69.weather.weather_api.IDataExtractor;
|
import org.woheller69.weather.weather_api.IDataExtractor;
|
||||||
import org.woheller69.weather.weather_api.IProcessHttpRequest;
|
import org.woheller69.weather.weather_api.IProcessHttpRequest;
|
||||||
|
|
||||||
import androidx.preference.PreferenceManager;
|
|
||||||
import org.woheller69.weather.weather_api.IApiToDatabaseConversion.WeatherCategories;
|
import org.woheller69.weather.weather_api.IApiToDatabaseConversion.WeatherCategories;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -88,50 +82,41 @@ public class ProcessOMweatherAPIRequest implements IProcessHttpRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Extract current weather
|
//Extract current weather
|
||||||
String rain60min=context.getResources().getString(R.string.error_no_rain60min_data);
|
GeneralData generalData = new GeneralData();
|
||||||
CurrentWeatherData weatherData = extractor.extractCurrentWeather(json.getString("current_weather"));
|
generalData.setTimestamp(System.currentTimeMillis() / 1000);
|
||||||
|
generalData.setCity_id(cityId);
|
||||||
|
generalData.setTimeSunrise(weekforecasts.get(0).getTimeSunrise());
|
||||||
|
generalData.setTimeSunset(weekforecasts.get(0).getTimeSunset());
|
||||||
|
generalData.setTimeZoneSeconds(json.getInt("utc_offset_seconds"));
|
||||||
|
GeneralData current = dbHelper.getGeneralDataByCityId(cityId);
|
||||||
|
if (current != null && current.getCity_id() == cityId) {
|
||||||
|
dbHelper.updateGeneralData(generalData);
|
||||||
|
} else {
|
||||||
|
dbHelper.addGeneralData(generalData);
|
||||||
|
}
|
||||||
|
|
||||||
if (weatherData == null) {
|
//Extract hourly weather
|
||||||
final String ERROR_MSG = context.getResources().getString(R.string.error_convert_to_json);
|
dbHelper.deleteForecastsByCityId(cityId);
|
||||||
if (NavigationActivity.isVisible)
|
List<HourlyForecast> hourlyforecasts = new ArrayList<>();
|
||||||
Toast.makeText(context, ERROR_MSG, Toast.LENGTH_LONG).show();
|
hourlyforecasts = extractor.extractHourlyForecast(json.getString("hourly"), cityId);
|
||||||
} else {
|
|
||||||
weatherData.setCity_id(cityId);
|
if (hourlyforecasts!=null && !hourlyforecasts.isEmpty()){
|
||||||
weatherData.setRain60min(rain60min);
|
for (HourlyForecast hourlyForecast: hourlyforecasts){
|
||||||
weatherData.setTimeSunrise(weekforecasts.get(0).getTimeSunrise());
|
hourlyForecast.setCity_id(cityId);
|
||||||
weatherData.setTimeSunset(weekforecasts.get(0).getTimeSunset());
|
|
||||||
weatherData.setTimeZoneSeconds(json.getInt("utc_offset_seconds"));
|
|
||||||
CurrentWeatherData current = dbHelper.getCurrentWeatherByCityId(cityId);
|
|
||||||
if (current != null && current.getCity_id() == cityId) {
|
|
||||||
dbHelper.updateCurrentWeather(weatherData);
|
|
||||||
} else {
|
|
||||||
dbHelper.addCurrentWeather(weatherData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//Extract hourly weather
|
|
||||||
dbHelper.deleteForecastsByCityId(cityId);
|
|
||||||
List<HourlyForecast> hourlyforecasts = new ArrayList<>();
|
|
||||||
hourlyforecasts = extractor.extractHourlyForecast(json.getString("hourly"), cityId);
|
|
||||||
|
|
||||||
if (hourlyforecasts!=null && !hourlyforecasts.isEmpty()){
|
|
||||||
for (HourlyForecast hourlyForecast: hourlyforecasts){
|
|
||||||
hourlyForecast.setCity_id(cityId);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
final String ERROR_MSG = context.getResources().getString(R.string.error_convert_to_json);
|
|
||||||
if (NavigationActivity.isVisible)
|
|
||||||
Toast.makeText(context, ERROR_MSG, Toast.LENGTH_LONG).show();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
final String ERROR_MSG = context.getResources().getString(R.string.error_convert_to_json);
|
||||||
|
if (NavigationActivity.isVisible)
|
||||||
|
Toast.makeText(context, ERROR_MSG, Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
dbHelper.addForecasts(hourlyforecasts);
|
dbHelper.addForecasts(hourlyforecasts);
|
||||||
|
|
||||||
weekforecasts = reanalyzeWeekIDs(weekforecasts, hourlyforecasts);
|
weekforecasts = reanalyzeWeekIDs(weekforecasts, hourlyforecasts);
|
||||||
|
|
||||||
dbHelper.addWeekForecasts(weekforecasts);
|
dbHelper.addWeekForecasts(weekforecasts);
|
||||||
|
|
||||||
ViewUpdater.updateCurrentWeatherData(weatherData);
|
ViewUpdater.updateGeneralDataData(generalData);
|
||||||
ViewUpdater.updateWeekForecasts(weekforecasts);
|
ViewUpdater.updateWeekForecasts(weekforecasts);
|
||||||
ViewUpdater.updateForecasts(hourlyforecasts);
|
ViewUpdater.updateForecasts(hourlyforecasts);
|
||||||
|
|
||||||
|
|
@ -192,7 +177,7 @@ public class ProcessOMweatherAPIRequest implements IProcessHttpRequest {
|
||||||
totalEnergy+=hourlyForecast.getPower();
|
totalEnergy+=hourlyForecast.getPower();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
weekForecast.setPrecipitation(totalEnergy/1000);
|
weekForecast.setEnergyDay(totalEnergy/1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
return weekforecasts;
|
return weekforecasts;
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="12.01dp"
|
|
||||||
android:height="17.51dp"
|
|
||||||
android:viewportWidth="1201"
|
|
||||||
android:viewportHeight="1751">
|
|
||||||
<path
|
|
||||||
android:pathData="M125,1750L0,1750 0,0 250,0 250,1750 125,1750Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M1200,575L249,1001 249,150 1200,575Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="#00000000"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
</vector>
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="12.01dp"
|
|
||||||
android:height="17.51dp"
|
|
||||||
android:viewportWidth="1201"
|
|
||||||
android:viewportHeight="1751">
|
|
||||||
<path
|
|
||||||
android:pathData="M125,1750L0,1750 0,0 250,0 250,1750 125,1750Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/colorPrimaryDark"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M1200,575L249,1001 249,150 1200,575Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/lightred"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
</vector>
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="12.01dp"
|
|
||||||
android:height="17.51dp"
|
|
||||||
android:viewportWidth="1201"
|
|
||||||
android:viewportHeight="1751">
|
|
||||||
<path
|
|
||||||
android:pathData="M125,1750L0,1750 0,0 250,0 250,1750 125,1750Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/colorPrimaryDark"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M1200,575L249,1001 249,150 1200,575Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/orange"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
</vector>
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="12.01dp"
|
|
||||||
android:height="17.51dp"
|
|
||||||
android:viewportWidth="1201"
|
|
||||||
android:viewportHeight="1751">
|
|
||||||
<path
|
|
||||||
android:pathData="M125,1750L0,1750 0,0 250,0 250,1750 125,1750Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/colorPrimaryDark"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M1200,575L249,1001 249,150 1200,575Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/red"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
</vector>
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="12.01dp"
|
|
||||||
android:height="17.51dp"
|
|
||||||
android:viewportWidth="1201"
|
|
||||||
android:viewportHeight="1751">
|
|
||||||
<path
|
|
||||||
android:pathData="M125,1750L0,1750 0,0 250,0 250,1750 125,1750Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/colorPrimaryDark"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
<path
|
|
||||||
android:pathData="M1200,575L249,1001 249,150 1200,575Z"
|
|
||||||
android:strokeLineJoin="round"
|
|
||||||
android:strokeWidth="28.222"
|
|
||||||
android:fillColor="@color/yellow"
|
|
||||||
android:strokeColor="#00000000"
|
|
||||||
android:fillType="evenOdd"/>
|
|
||||||
</vector>
|
|
||||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
|
@ -5,13 +5,6 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="@dimen/card_margin">
|
android:layout_margin="@dimen/card_margin">
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/card_overview_weather_image"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:adjustViewBounds="true"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
android:src="@drawable/wmo_image_00d" />
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
|
@ -27,15 +20,6 @@
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="center_vertical">
|
android:layout_gravity="center_vertical">
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/card_overview_windicon"
|
|
||||||
android:layout_width="60dp"
|
|
||||||
android:layout_height="60dp"
|
|
||||||
android:layout_centerInParent="true"
|
|
||||||
android:layout_marginTop="5dp"
|
|
||||||
android:layout_marginEnd="5dp"
|
|
||||||
android:src="@drawable/ic_wind_orange"
|
|
||||||
android:translationY="-20dp" />
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/card_overview_temperature"
|
android:id="@+id/card_overview_temperature"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
solarCast prognostiziert den Ertrag Ihrer PV Anlage
|
solarCast prognostiziert den Ertrag Ihrer PV Anlage
|
||||||
|
|
||||||
Die Wetterdaten werden über die freie API von Open-Meteo.com.
|
Diese App nimmt direkte und diffuse Strahlungsdaten von Open-Meteo.com, berechnet die Position
|
||||||
|
der Sonne und projiziert die Strahlung auf Ihr Solarpanel.
|
||||||
|
Es zeigt die geschätzte Energieproduktion für die nächsten Stunden und bis zu 16 Tage an.
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
- Stündliches Prognose es Ertrags für bis zu 16 Tage
|
- Stündliches Prognose des Ertrags für bis zu 16 Tage
|
||||||
- Keine Werbung
|
- Keine Werbung
|
||||||
|
|
||||||
Minimale Berechtigungen:
|
Minimale Berechtigungen:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
solarCast forecasts the output of your solar power plant
|
solarCast forecasts the output of your solar power plant
|
||||||
|
|
||||||
Weather data is provided via the free API from Open-Meteo.com.
|
This app takes direct and diffuse radiation data from Open-Meteo.com, calculates the position
|
||||||
|
of the sun and projects the radiation on your solar panel.
|
||||||
|
It shows the estimated energy production for the next hours and up to 16 days.
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
- Hourly forecasts for the output for up to 16 days
|
- Hourly forecasts for the output for up to 16 days
|
||||||
|
|
|
||||||