package it.fdev.unisaconnect;
import it.fdev.scraper.WeatherScraper;
import it.fdev.unisaconnect.R;
import it.fdev.unisaconnect.data.SharedPrefDataManager;
import it.fdev.unisaconnect.data.WeatherData;
import it.fdev.unisaconnect.data.WeatherData.DailyForecast;
import it.fdev.utils.MySimpleFragment;
import it.fdev.utils.Utils;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class FragmentWeather extends MySimpleFragment {
private final int MIN_UPDATE_MINUTES_INTERVAL = 10;
private boolean alreadyStarted = false;
private WeatherScraper meteoScraper;
private WeatherData meteo;
private SharedPrefDataManager mDataManager;
private RelativeLayout weatherActualContainerView;
// private RelativeLayout weatherForecastContainerView;
private GridView weatherForecastGridview;
private TextView meteoNDView;
// private TextView forecastNDView;
private ViewPager pager;
private TextView lastUpdateView;
private ImageView lastUpdateIconView;
private ImageView iconView;
private TextView tempView;
private TextView descriptionView;
private TextView humidityView;
private TextView windView;
private TextView windDirView;
private CurrentWeatherAdapter currentWeatherAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = (View) inflater.inflate(R.layout.fragment_weather, container, false);
mActivity.setLoadingVisible(true, true);
meteoNDView = (TextView) view.findViewById(R.id.meteo_non_disponibile);
// forecastNDView = (TextView) view.findViewById(R.id.forecast_not_available);
pager = (ViewPager) view.findViewById(R.id.meteo_pager);
lastUpdateView = (TextView) view.findViewById(R.id.last_update_time);
lastUpdateIconView = (ImageView) view.findViewById(R.id.last_update_icon);
iconView = (ImageView) view.findViewById(R.id.weather_icon);
tempView = (TextView) view.findViewById(R.id.weather_temp);
descriptionView = (TextView) view.findViewById(R.id.weather_description);
humidityView = (TextView) view.findViewById(R.id.weather_humidity);
windView = (TextView) view.findViewById(R.id.weather_wind);
windDirView = (TextView) view.findViewById(R.id.weather_wind_dir);
weatherActualContainerView = (RelativeLayout) view.findViewById(R.id.weather_actual_container);
// weatherForecastContainerView = (RelativeLayout) view.findViewById(R.id.weather_forecast_container);
weatherForecastGridview = (GridView) view.findViewById(R.id.weather_forecast_gridview);
mDataManager = new SharedPrefDataManager(mActivity);
meteo = mDataManager.getWeather();
if (meteo != null) {
Log.d(Utils.TAG, "Meteo salvato!");
} else {
Log.d(Utils.TAG, "Meteo non salvato!");
}
getWeather(false);
return view;
}
@Override
public Set<Integer> getActionsToShow() {
Set<Integer> actionsToShow = new HashSet<Integer>();
actionsToShow.add(R.id.action_refresh_button);
if (!alreadyStarted) {
actionsToShow.add(R.id.action_loading_animation);
}
return actionsToShow;
}
@Override
public void actionRefresh() {
getWeather(true);
}
public void getWeather(boolean force) {
if (!isAdded()) {
return;
}
if (meteo != null) {
// ho un meteo salvato
if(!alreadyStarted) // Se non è gia stato mostrato lo visualizzo
alreadyStarted = true;
showWeather(null);
if (!force) {
// Se non devo forzare l'aggiornamento del meteo vedo se è recente e non devo aggiornarlo
long lastUpdateTime = meteo.getFetchTime().getTime();
long minutesPassedLastUpdate = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis() - lastUpdateTime);
if (minutesPassedLastUpdate <= MIN_UPDATE_MINUTES_INTERVAL) {
alreadyStarted = true;
mActivity.setLoadingVisible(false, false);
return;
}
}
// devo aggiornarlo
mActivity.setLoadingVisible(true, false);
} else {
// Nessun meteo scaricato memorizzato
mActivity.setLoadingVisible(true, true);
}
if (!Utils.hasConnection(mActivity)) {
if (meteo == null) {
Utils.goToInternetError(mActivity, this);
} else {
mActivity.setLoadingVisible(false, false);
}
alreadyStarted = true;
return;
}
alreadyStarted = true;
if (meteoScraper != null && meteoScraper.isRunning) {
return;
}
meteoScraper = new WeatherScraper();
meteoScraper.setCallerMeteoFragment(this);
meteoScraper.execute(mActivity);
return;
}
public void showWeather(WeatherData newWeatherData) {
if (!isAdded()) {
return;
}
if (newWeatherData == null && this.meteo == null) {
weatherActualContainerView.setVisibility(View.GONE);
// weatherForecastContainerView.setVisibility(View.GONE);
meteoNDView.setVisibility(View.VISIBLE);
mActivity.setLoadingVisible(false, false);
return;
}
weatherActualContainerView.setVisibility(View.VISIBLE);
// weatherForecastContainerView.setVisibility(View.VISIBLE);
meteoNDView.setVisibility(View.GONE);
if (newWeatherData != null) {
this.meteo = newWeatherData;
}
currentWeatherAdapter = new CurrentWeatherAdapter(mActivity.getSupportFragmentManager());
pager.setAdapter(currentWeatherAdapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
currentWeatherAdapter.getItem(arg0).showCondition();
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
pager.setCurrentItem(0); // Rettorato -> La webcam della stecca 9 non viene aggiornata da un mese!
ArrayList<DailyForecast> forecastList = this.meteo.getDailyForecastList();
DailyForecast lastForecast = forecastList.get(forecastList.size()-1);
boolean isForecastPast = Utils.isBefore(lastForecast.getValidThroughDate());
if (isForecastPast) {
// Le previsioni sono vecchie...si sarà inceppato lo scraper?
weatherForecastGridview.setVisibility(View.GONE);
// forecastNDView.setVisibility(View.VISIBLE);
} else {
// forecastNDView.setVisibility(View.GONE);
weatherForecastGridview.setVisibility(View.VISIBLE);
weatherForecastGridview.setAdapter(new WeatherForecastAdapter(mActivity, this.meteo.getDailyForecastList()));
}
if (meteo.getFetchTime().getTime() > 0) {
String dateFirstPart = new SimpleDateFormat("dd/MM", Locale.ITALY).format(meteo.getFetchTime());
String dateSecondPart = new SimpleDateFormat("HH:mm", Locale.ITALY).format(meteo.getFetchTime());
String updateText = getString(R.string.aggiornato_il_alle, dateFirstPart, dateSecondPart);
lastUpdateView.setText(updateText);
lastUpdateView.setVisibility(View.VISIBLE);
lastUpdateIconView.setVisibility(View.VISIBLE);
} else {
lastUpdateView.setVisibility(View.GONE);
lastUpdateIconView.setVisibility(View.GONE);
}
if (newWeatherData != null) {
// Il metodo è stato chiamato con il meteo aggiornato da salvare
mActivity.setLoadingVisible(false, false);
Log.d(Utils.TAG, "saving weather data");
mDataManager.setWeather(newWeatherData);
}
FragmentWeatherActualCondition cItem = currentWeatherAdapter.getItem(1);
if (cItem != null) { // E' capitato
cItem.showCondition();
}
}
class CurrentWeatherAdapter extends FragmentPagerAdapter {
private FragmentWeatherActualCondition[] fragmentsList;
public CurrentWeatherAdapter(FragmentManager fm) {
super(fm);
fragmentsList = new FragmentWeatherActualCondition[getCount()];
}
@Override
public FragmentWeatherActualCondition getItem(int position) {
if (position<0 || position>=fragmentsList.length) {
return null;
}
FragmentWeatherActualCondition cFragment;
if (fragmentsList[position] == null) {
cFragment = new FragmentWeatherActualCondition();
cFragment.setActivity(mActivity);
cFragment.setCondition(meteo.getActualCondition(position));
cFragment.setViews(lastUpdateView, lastUpdateIconView, iconView, tempView, descriptionView, humidityView, windView, windDirView);
fragmentsList[position] = cFragment;
} else {
cFragment = fragmentsList[position];
}
return cFragment;
}
@Override
public CharSequence getPageTitle(int position) {
return meteo.getActualCondition(position).getStationName().toUpperCase(Locale.ITALY);
}
@Override
public int getCount() {
return meteo.getActualConditionList().size();
}
// @Override
// public Parcelable saveState() {
// // Workaround for forcing fragments to be recreated after activity is resumed
// return null;
// }
}
@Override
public int getTitleResId() {
return R.string.meteo;
}
}