package it.fdev.unisaconnect;
import it.fdev.scraper.esse3.Esse3BasicScraper.LoadStates;
import it.fdev.scraper.esse3.Esse3ScraperService;
import it.fdev.unisaconnect.MainActivity.BootableFragmentsEnum;
import it.fdev.unisaconnect.data.Appelli;
import it.fdev.unisaconnect.data.Appelli.Appello;
import it.fdev.unisaconnect.data.SharedPrefDataManager;
import it.fdev.utils.MyDateUtils;
import it.fdev.utils.MySimpleFragment;
import it.fdev.utils.Utils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
public class FragmentAppelli extends MySimpleFragment {
private boolean alreadyStarted = false;
private ArrayList<Appello> listaAppelliDisponibili;
private ArrayList<Appello> listaAppelliPrenotati;
private LayoutInflater layoutInflater;
private SharedPrefDataManager mDataManager;
private ScrollView appelliListContainer;
private LinearLayout appelliDisponibiliContainer;
private LinearLayout appelliPrenotatiContainer;
private View appelliNDView;
private TextView lastUpdateTextView;
private View lastUpdateIconView;
private IntentFilter mIntentFilter = new IntentFilter();
private final BroadcastReceiver mHandlerBroadcast = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
onNewBroadcast(context, intent);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_appelli, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Se non sono stati salvati i dati utente rimando al fragment dei dati
mDataManager = new SharedPrefDataManager(mActivity);
if (!mDataManager.loginDataExists()) { // Non sono memorizzati i dati utente
Utils.createAlert(mActivity, getString(R.string.dati_errati), BootableFragmentsEnum.ACCOUNT, false);
return;
}
mActivity.setLoadingVisible(true, true);
mIntentFilter.addAction(Esse3ScraperService.BROADCAST_STATE_E3_PAGAMENTI);
layoutInflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
appelliListContainer = (ScrollView) view.findViewById(R.id.appelli_list_container);
appelliDisponibiliContainer = (LinearLayout) view.findViewById(R.id.appelli_disponibili_list);
appelliPrenotatiContainer = (LinearLayout) view.findViewById(R.id.appelli_prenotati_list);
appelliNDView = view.findViewById(R.id.appelli_vuoto);
lastUpdateTextView = (TextView) view.findViewById(R.id.last_update_time);
lastUpdateIconView = (View) view.findViewById(R.id.last_update_icon);
}
@Override
public void onResume() {
super.onResume();
mActivity.registerReceiver(mHandlerBroadcast, mIntentFilter);
getAppelli(false);
}
@Override
public void onPause() {
super.onPause();
mActivity.unregisterReceiver(mHandlerBroadcast);
}
@Override
public void actionRefresh() {
getAppelli(true);
}
public void onNewBroadcast(Context context, Intent intent) {
try {
Log.d(Utils.TAG, "BROADCAST RECEIVED: " + intent.getAction());
if (Esse3ScraperService.BROADCAST_STATE_E3_PAGAMENTI.equals(intent.getAction())) {
LoadStates state = (LoadStates) intent.getSerializableExtra("status");
switch (state) {
case FINISHED:
mostraAppelli();
break;
case NO_DATA:
case WRONG_DATA:
Utils.createAlert(mActivity, mActivity.getString(R.string.dati_errati), BootableFragmentsEnum.ACCOUNT, false);
break;
case UNKNOWN_PROBLEM:
default:
Utils.createAlert(mActivity, mActivity.getString(R.string.problema_di_connessione_generico), null, true);
break;
}
}
} catch (Exception e) {
Log.e(Utils.TAG, "onReceiveBroadcast exception", e);
}
}
@Override
public Set<Integer> getActionsToShow() {
Set<Integer> actionsToShow = new HashSet<Integer>();
actionsToShow.add(R.id.action_refresh_button);
if (!alreadyStarted || Esse3ScraperService.isRunning) {
actionsToShow.add(R.id.action_loading_animation);
}
return actionsToShow;
}
public void getAppelli(boolean force) {
if (!isAdded()) {
return;
}
// Lo scraper è in esecuzione
if (Esse3ScraperService.isRunning) {
return;
}
mActivity.setLoadingVisible(true, true);
if (!force && mDataManager.getAppelli() != null) {
alreadyStarted = true;
mostraAppelli();
return;
}
// Se non c'è internet rimando al fragment di errore
if (!Utils.hasConnection(mActivity)) {
Utils.goToInternetError(mActivity, this);
return;
}
if (force || !alreadyStarted) {
alreadyStarted = true;
mActivity.startService(new Intent(mActivity, Esse3ScraperService.class).setAction(Esse3ScraperService.BROADCAST_STATE_E3_APPELLI));
} else {
appelliNDView.setVisibility(View.VISIBLE);
appelliDisponibiliContainer.setVisibility(View.GONE);
appelliPrenotatiContainer.setVisibility(View.GONE);
lastUpdateTextView.setVisibility(View.GONE);
lastUpdateIconView.setVisibility(View.GONE);
mActivity.setLoadingVisible(false, false);
return;
}
}
public void mostraAppelli() {
if (!isAdded()) {
return;
}
if (appelliDisponibiliContainer == null || appelliPrenotatiContainer == null || appelliNDView == null) { // Dai report di crash sembra succedere a volte, non ho idea del perchè
mActivity.setDrawerOpen(true); // Quindi mostro lo slidingmenu per apparare
mActivity.setLoadingVisible(false, false);
return;
}
Appelli appelli = mDataManager.getAppelli();
String updateText = "";
if (appelli != null) {
updateText = MyDateUtils.getLastUpdateString(mActivity, appelli.getFetchTime().getTime(), false);
}
if (!updateText.isEmpty()) {
lastUpdateTextView.setText(updateText);
lastUpdateTextView.setVisibility(View.VISIBLE);
lastUpdateIconView.setVisibility(View.VISIBLE);
} else {
lastUpdateTextView.setVisibility(View.GONE);
lastUpdateIconView.setVisibility(View.GONE);
}
if (appelli == null || appelli.isEmpty()) {
// Non ho appelli da mostrare
appelliNDView.setVisibility(View.VISIBLE);
appelliListContainer.setVisibility(View.GONE);
mActivity.setLoadingVisible(false, false);
return;
}
appelliNDView.setVisibility(View.GONE);
mostraAppelliDisponibili(appelli.getListaAppelliDisponibili());
mostraAppelliPrenotati(appelli.getListaAppelliPrenotati());
mActivity.setLoadingVisible(false, false);
}
private void mostraAppelliPrenotati(ArrayList<Appello> listaAppelli) {
appelliPrenotatiContainer.setVisibility(View.GONE);
if (listaAppelli != null && listaAppelli.size() > 0) {
listaAppelliPrenotati = listaAppelli;
}
if (listaAppelliPrenotati == null) {
listaAppelliPrenotati = new ArrayList<Appello>();
}
if (listaAppelliPrenotati.size() == 0) {
if (listaAppelliDisponibili != null && listaAppelliDisponibili.size() == 0) {
appelliNDView.setVisibility(View.VISIBLE);
}
return;
} else {
appelliNDView.setVisibility(View.GONE);
}
while (appelliPrenotatiContainer.getChildCount() >= 2) {
appelliPrenotatiContainer.removeViewAt(1);
}
for (Appello appello : listaAppelliPrenotati) {
View rowView = setAppelliRow(appello, layoutInflater);
appelliPrenotatiContainer.addView(rowView);
}
appelliPrenotatiContainer.setVisibility(View.VISIBLE);
}
private void mostraAppelliDisponibili(ArrayList<Appello> listaAppelli) {
appelliDisponibiliContainer.setVisibility(View.GONE);
if (listaAppelli != null && listaAppelli.size() > 0) {
listaAppelliDisponibili = listaAppelli;
}
if (listaAppelliDisponibili == null) {
listaAppelliDisponibili = new ArrayList<Appello>();
}
if (listaAppelliDisponibili.size() == 0) {
if (listaAppelliPrenotati != null && listaAppelliPrenotati.size() == 0) {
appelliNDView.setVisibility(View.VISIBLE);
}
return;
} else {
appelliNDView.setVisibility(View.GONE);
}
while (appelliDisponibiliContainer.getChildCount() >= 2) {
appelliDisponibiliContainer.removeViewAt(1);
}
for (Appello appello : listaAppelliDisponibili) {
View rowView = setAppelliRow(appello, layoutInflater);
appelliDisponibiliContainer.addView(rowView);
}
appelliDisponibiliContainer.setVisibility(View.VISIBLE);
}
private View setAppelliRow(Appello appello, LayoutInflater layoutInflater) {
View rowView = layoutInflater.inflate(R.layout.appello_row, null);
TextView nameView = (TextView) rowView.findViewById(R.id.appello_name);
TextView descriptionView = (TextView) rowView.findViewById(R.id.appello_description);
TextView dateView = (TextView) rowView.findViewById(R.id.appello_date);
TextView nSubsView = (TextView) rowView.findViewById(R.id.appello_subscribed_num);
TextView locationView = (TextView) rowView.findViewById(R.id.appello_location);
nameView.setText(appello.getName());
dateView.setText(appello.getDate() + " " + appello.getTime());
descriptionView.setText(appello.getDescription());
nSubsView.setText(appello.getSubscribedNum());
if (appello.getLocation().isEmpty()) {
locationView.setVisibility(View.GONE);
} else {
locationView.setText(appello.getLocation());
}
return rowView;
}
@Override
public int getTitleResId() {
return R.string.appelli;
}
}