package de.htwdd.fragments;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import de.htwdd.DatabaseHandlerTimetable;
import de.htwdd.R;
import de.htwdd.TimetableAdapter;
import de.htwdd.TimetableDetailsActivity;
import de.htwdd.TimetableEditActivity;
import de.htwdd.WizardWelcome;
import de.htwdd.classes.HTTPDownloader;
import de.htwdd.classes.Timetable;
import de.htwdd.types.Lesson;
public class TimetableFragment extends Fragment
{
private String StgJhr;
private String Stg;
private String StgGrp;
private String Prof;
private int week;
private SharedPreferences sharedPreferences;
private Context context;
// Liste mit allen Stunden der aktuellen Woche
private ArrayList<Lesson> lessons_week = new ArrayList<Lesson>();
public TimetableAdapter timetableAdapter;
public TimetableFragment()
{
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
context = inflater.getContext();
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
week = getArguments().getInt("week", new GregorianCalendar().get(Calendar.WEEK_OF_YEAR));
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_timetable, container, false);
// Hole Stunden aus DB
loadLessons();
// Setze Adapter
timetableAdapter = new TimetableAdapter(getActivity(), lessons_week, week);
GridView gridView = (GridView) view.findViewById(R.id.Timetable);
gridView.setAdapter(timetableAdapter);
// Sollen Einträge aktuallisiert werden?
if (getArguments() != null && getArguments().getBoolean("Update"))
loadTimetable();
else
{
//Einträge in der Datenbank vorhanden, wenn nein Vorschlagen zu updaten
DatabaseHandlerTimetable databaseHandlerTimetable = new DatabaseHandlerTimetable(context);
if (databaseHandlerTimetable.countDS() == 0)
loadTimetable();
databaseHandlerTimetable.close();
}
gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l)
{
Bundle bundle = new Bundle();
bundle.putInt("DS", i/7);
bundle.putInt("Day", i%7);
bundle.putInt("Week", week);
Intent intent = new Intent(context, TimetableEditActivity.class);
intent.putExtras(bundle);
startActivityForResult(intent, 1);
return true;
}
});
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Bundle bundle = new Bundle();
bundle.putInt("DS", i/7);
bundle.putInt("Day", i%7);
bundle.putInt("Week", week);
Intent intent = new Intent(context, TimetableDetailsActivity.class);
intent.putExtras(bundle);
startActivityForResult(intent, 1);
}
});
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
loadLessons();
timetableAdapter.notifyDataSetChanged();
}
/**
* Lädt die Stunden der aktuellen Woche {@see week} aus der Datenbank und speichert sie in einer
* Liste {@see lesson_week}
*/
void loadLessons()
{
DatabaseHandlerTimetable databaseHandlerTimetable = new DatabaseHandlerTimetable(context);
lessons_week.clear();
lessons_week.addAll(databaseHandlerTimetable.getShortWeek(week));
databaseHandlerTimetable.close();
}
private void loadTimetable()
{
int modus;
StgJhr = sharedPreferences.getString("im", "");
Stg = sharedPreferences.getString("stdg", "");
StgGrp = sharedPreferences.getString("studgruppe", "");
Prof = sharedPreferences.getString("prof_kennung", "");
// Überprüfe Daten
if ((StgJhr.length() < 2 || Stg.length() != 3 || StgGrp.length() == 0) && (Prof.length() == 0))
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.timetable_noData)
.setTitle(R.string.noData)
.setIcon(R.drawable.ic_launcher)
.setPositiveButton(R.string.startAssistent, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
Intent nextScreen = new Intent(getActivity(), WizardWelcome.class);
startActivity(nextScreen);
getActivity().finish();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
Toast.makeText(context,R.string.timetable_updade_error,Toast.LENGTH_LONG).show();
}
}).show();
return;
}
// Auswahl was geladen werden soll
if (!(StgJhr.length() < 2 || Stg.length() != 3 || StgGrp.length() == 0))
modus = 1;
else modus = 2;
// Überprüfe Internet-Verbindung
if (!HTTPDownloader.CheckInternet(context))
{
Toast.makeText(context, R.string.app_no_internet,Toast.LENGTH_LONG).show();
return;
}
WorkerGetTimeTable getTimeTable = new WorkerGetTimeTable();
getTimeTable.execute(modus);
}
private class WorkerGetTimeTable extends AsyncTask<Integer, Void, Timetable>
{
private int ResponseCode;
@Override
protected Timetable doInBackground(Integer... integers)
{
Timetable timetable = new Timetable(context);
switch (integers[0])
{
case 1:
ResponseCode = timetable.getTimtableStudent(StgJhr, Stg, StgGrp);
break;
case 2:
ResponseCode = timetable.getTimetableProf(Prof);
break;
}
// Speichern des Stundenplans
if (ResponseCode == 200)
timetable.saveTimetableUser();
return timetable;
}
@Override
protected void onPostExecute(Timetable timetable)
{
if (!isAdded())
return;
switch (ResponseCode)
{
case 200:
Toast.makeText(context,R.string.timetable_updade_success, Toast.LENGTH_SHORT).show();
break;
case 999:
Toast.makeText(context,R.string.pars_error, Toast.LENGTH_LONG);
break;
default:
Toast.makeText(context,R.string.app_internet_error,Toast.LENGTH_LONG).show();
break;
}
// Adapter über neue Daten informieren
loadLessons();
timetableAdapter.notifyDataSetChanged();
}
}
}