package ca.etsmtl.applets.etsmobile.ui.fragment; import android.content.ContentUris; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.provider.CalendarContract; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.Toast; import com.octo.android.robospice.persistence.exception.SpiceException; import org.joda.time.DateTime; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Locale; import java.util.Observable; import java.util.Observer; import ca.etsmtl.applets.etsmobile.ApplicationManager; import ca.etsmtl.applets.etsmobile.db.DatabaseHelper; import ca.etsmtl.applets.etsmobile.http.AppletsApiCalendarRequest; import ca.etsmtl.applets.etsmobile.http.DataManager; import ca.etsmtl.applets.etsmobile.http.DataManager.SignetMethods; import ca.etsmtl.applets.etsmobile.model.ListeDeSessions; import ca.etsmtl.applets.etsmobile.model.Seances; import ca.etsmtl.applets.etsmobile.ui.adapter.SeanceAdapter; import ca.etsmtl.applets.etsmobile.ui.adapter.TodayDataRowItem; import ca.etsmtl.applets.etsmobile.util.HoraireManager; import ca.etsmtl.applets.etsmobile.util.Utility; import ca.etsmtl.applets.etsmobile.views.CustomProgressDialog; import ca.etsmtl.applets.etsmobile2.R; /** * Created by Thibaut on 30/08/14. */ public class HoraireFragment extends HttpFragment implements Observer { private HoraireManager horaireManager; private CustomProgressDialog customProgressDialog; private ListView horaireListView; private ArrayList<TodayDataRowItem> listSeances; private SeanceAdapter seanceAdapter; private DateTime dateTime = new DateTime(); private DatabaseHelper databaseHelper; private ProgressBar progressBarSyncHoraire; private SimpleDateFormat seancesFormatter = new SimpleDateFormat("yyyy-MM-dd", Locale.CANADA_FRENCH); @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_horaire, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item_save_in_calendar: new AsyncTask<Object, Void, Object>() { private Exception exception = null; protected void onPreExecute() { customProgressDialog = new CustomProgressDialog(getActivity(), R.drawable.loading_spinner, "Mise à jour du calendrier en cours"); customProgressDialog.show(); } @Override protected Object doInBackground(Object... params) { try { horaireManager.updateCalendar(); } catch (Exception e) { exception = e; } return null; } protected void onPostExecute(Object result) { customProgressDialog.dismiss(); if (exception != null) { Toast.makeText(getActivity(), "Une erreur est survenue lors de la mise à jour du calendrier.", Toast.LENGTH_SHORT).show(); } else { //Launch native calendar app long startMillis = java.lang.System.currentTimeMillis(); Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon(); builder.appendPath("time"); ContentUris.appendId(builder, startMillis); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(builder.build()); startActivity(intent); } } }.execute(); return true; } return super.onOptionsItemSelected(item); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_calendar, container, false); databaseHelper = new DatabaseHelper(getActivity()); horaireListView = (ListView) v.findViewById(R.id.listView_horaire); seanceAdapter = new SeanceAdapter(getActivity()); horaireListView.setAdapter(seanceAdapter); listSeances = new ArrayList<TodayDataRowItem>(); try{ seanceAdapter.setItemList((ArrayList<Seances>) databaseHelper.getDao(Seances.class).queryForAll()); seanceAdapter.notifyDataSetChanged(); } catch(SQLException e) { e.printStackTrace(); } horaireManager = new HoraireManager(this, getActivity()); horaireManager.addObserver(this); progressBarSyncHoraire = (ProgressBar) v.findViewById(R.id.progressBar_sync_horaire); progressBarSyncHoraire.setVisibility(ProgressBar.VISIBLE); // customProgressDialog = new CustomProgressDialog(getActivity(), R.drawable.loading_spinner, "Synchronisation en cours"); // customProgressDialog.show(); dataManager.getDataFromSignet(DataManager.SignetMethods.LIST_SESSION, ApplicationManager.userCredentials, this); dataManager.getDataFromSignet(SignetMethods.LIST_SEANCES_CURRENT_AND_NEXT_SESSION, ApplicationManager.userCredentials, this); dataManager.getDataFromSignet(SignetMethods.LIST_JOURSREMPLACES_CURRENT_AND_NEXT_SESSION, ApplicationManager.userCredentials, this); return v; } @Override public void onRequestFailure(SpiceException arg0) { progressBarSyncHoraire.setVisibility(ProgressBar.GONE); // customProgressDialog.dismiss(); if(getActivity() != null) Toast.makeText(getActivity(), "La synchronisation a échoué.", Toast.LENGTH_SHORT).show(); } @Override public void onRequestSuccess(final Object o) { if (o instanceof ListeDeSessions) { ListeDeSessions listeDeSessions = (ListeDeSessions) o; Date currentDate = new Date(); Date dateStart; Date dateEnd; for (int i = listeDeSessions.liste.size() - 1; i > 0; i--) { dateStart = Utility.getDateFromString(listeDeSessions.liste.get(i).dateDebut); dateEnd = Utility.getDateFromString(listeDeSessions.liste.get(i).dateFin); if (currentDate.getTime() >= dateStart.getTime() && currentDate.getTime() <= dateEnd.getTime()) { String dateStartString = Utility.getStringForApplETSApiFromDate(dateStart); String dateEndString = Utility.getStringForApplETSApiFromDate(dateEnd); //todo dataManager.sendRequest(new AppletsApiCalendarRequest(getActivity(), dateStartString, dateEndString), HoraireFragment.this); break; } } } horaireManager.onRequestSuccess(o); } @Override void updateUI() { } @Override public void update(Observable observable, Object data) { // customProgressDialog.dismiss(); progressBarSyncHoraire.setVisibility(ProgressBar.GONE); try{ seanceAdapter.setItemList((ArrayList<Seances>) databaseHelper.getDao(Seances.class).queryForAll()); seanceAdapter.notifyDataSetChanged(); } catch(SQLException e) { e.printStackTrace(); } } }