package it.fdev.unisaconnect;
import it.fdev.unisaconnect.R;
import it.fdev.unisaconnect.MainActivity.BootableFragmentsEnum;
import it.fdev.unisaconnect.data.TimetableDB;
import it.fdev.unisaconnect.data.TimetableSubject.Lesson;
import it.fdev.utils.MySimpleFragment;
import it.fdev.utils.Utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
public class FragmentTimetableAddLesson extends MySimpleFragment {
private AutoCompleteTextView subjectName;
private View choosenColorView;
private LinearLayout colorLinearLayout;
private LinearLayout addLesson;
private LinearLayout lessonsParent;
private LayoutInflater lInflater;
private TimetableDB ttDB;
private int[] colorsArray;
private int color = 0;
private final int minStartHour = 8;
private final int maxStartHour = 18;
private final int minEndHour = minStartHour + 1;
private final int maxEndHour = maxStartHour + 1;
private ArrayAdapter<String> roomsAdapter;
private ArrayList<LessonEntry> lessonList = new ArrayList<LessonEntry>();
private String lessonToEdit = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mainView = (View) inflater.inflate(R.layout.fragment_timetable_add_lesson, container, false);
return mainView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ttDB = new TimetableDB(mActivity);
ttDB.open();
subjectName = (AutoCompleteTextView) view.findViewById(R.id.subject_name);
choosenColorView = view.findViewById(R.id.choosen_color);
colorLinearLayout = (LinearLayout) view.findViewById(R.id.color_list);
addLesson = (LinearLayout) view.findViewById(R.id.add_lesson);
lessonsParent = (LinearLayout) view.findViewById(R.id.lesson_data_container);
lInflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
subjectName.requestFocus();
TypedArray colorsResources = resources.obtainTypedArray(R.array.timetable_lesson_colors);
colorsArray = new int[colorsResources.length()];
for (int i = 0; i < colorsResources.length(); i++) {
colorsArray[i] = resources.getColor(colorsResources.getResourceId(i, R.color.orange_dark));
}
colorsResources.recycle();
int childcount = colorLinearLayout.getChildCount();
for (int i = 0; i < childcount; i++) {
final int indx = i;
View v = colorLinearLayout.getChildAt(i);
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
color = colorsArray[indx];
choosenColorView.setBackgroundColor(color);
}
});
if (i == 0)
color = colorsArray[i];
}
addLesson.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
addLessonLayout(true);
}
});
roomsAdapter = new ArrayAdapter<String>(mActivity, android.R.layout.simple_dropdown_item_1line, ttDB.getRoomNames());
ArrayAdapter<String> subjectsAdapter = new ArrayAdapter<String>(mActivity, android.R.layout.simple_dropdown_item_1line, ttDB.getSubjectsNames());
subjectName.setAdapter(subjectsAdapter);
if (lessonToEdit != null) {
ArrayList<Lesson> ll = ttDB.getLessonsByName(lessonToEdit);
Collections.sort(ll);
subjectName.setText(lessonToEdit);
color = ll.get(0).getColor();
choosenColorView.setBackgroundColor(color);
for (int i = 0; i < ll.size(); i++) {
Lesson cl = ll.get(i);
LessonEntry le = addLessonLayout();
le.id = cl.getId();
le.daysSpinnerView.setSelection(cl.getDay());
le.roomNameView.setText(cl.getRoom());
le.startHour = cl.getStartHour();
le.startMin = cl.getStartMinutes();
le.endHour = cl.getEndHour();
le.endMin = cl.getEndMinutes();
updateTime(le, false);
}
} else {
addLessonLayout();
}
}
private LessonEntry addLessonLayout() {
return addLessonLayout(false);
}
private LessonEntry addLessonLayout(boolean animate) {
LinearLayout newLesson = (LinearLayout) lInflater.inflate(R.layout.timetable_lesson_data, lessonsParent, false);
if (animate) {
// newLesson.startAnimation(AnimationUtils.loadAnimation(activity, android.R.anim.slide_in_left));
newLesson.startAnimation(AnimationUtils.loadAnimation(mActivity, R.anim.slide_down));
}
lessonsParent.addView(newLesson);
LessonEntry le = new LessonEntry(newLesson);
lessonList.add(le);
updateTime(le, false);
return le;
}
@Override
public void actionAccept() {
String name = subjectName.getText().toString().trim();
if (name.isEmpty()) {
subjectName.requestFocus();
// Utils.createAlert(activity, resources.getString(R.string.nome_corso_non_vuoto), null, false);
Toast.makeText(mActivity, R.string.nome_corso_non_vuoto, Toast.LENGTH_LONG).show();
return;
}
if (lessonToEdit != null) {
ttDB.deleteSubject(lessonToEdit);
}
boolean atLeastOneLession = false;
for (LessonEntry le : lessonList) {
int day = le.daysSpinnerView.getSelectedItemPosition();
String room = le.roomNameView.getText().toString().trim();
// if (room.isEmpty()) {
// le.roomNameView.requestFocus();
// Utils.createAlert(activity, "L'aula non può essere vuota", null, false);
// return;
// }
atLeastOneLession = true;
Lesson newLesson = new Lesson(le.id, name, day, le.startHour, le.startMin, le.endHour, le.endMin, room, color);
Log.d(Utils.TAG, "Adding lesson: " + le.id + " | " + name);
ttDB.insertLesson(newLesson);
}
if (!atLeastOneLession) {
// Utils.createAlert(activity, resources.getString(R.string.almeno_una_lezione), null, false);
Toast.makeText(mActivity, R.string.almeno_una_lezione, Toast.LENGTH_LONG).show();
return;
}
ttDB.insertSubject(name, color);
mActivity.switchContent(BootableFragmentsEnum.TIMETABLE, true);
}
@Override
public void actionCancel() {
if (lessonToEdit != null) {
ttDB.deleteSubject(lessonToEdit);
}
mActivity.switchContent(BootableFragmentsEnum.TIMETABLE, true);
}
@Override
public int getTitleResId() {
return R.string.aggiungi_corso;
};
public void editLesson(Lesson lesson) {
lessonToEdit = lesson.getSubjectName();
}
@Override
public Set<Integer> getActionsToShow() {
Set<Integer> actionsToShow = new HashSet<Integer>();
actionsToShow.add(R.id.action_accept_button);
actionsToShow.add(R.id.action_cancel_button);
return actionsToShow;
}
private void checkTimeCorrectness(LessonEntry le, boolean updatedStart) {
if (le.startHour >= le.endHour) {
if (updatedStart) {
le.endHour = le.startHour + 1;
le.endMin = le.startMin;
} else {
le.startHour = le.endHour - 1;
le.startMin = le.endMin;
}
}
if (le.startHour < minStartHour) {
le.startHour = minStartHour;
le.startMin = 0;
} else if (le.startHour > maxStartHour) {
le.startHour = maxStartHour;
le.startMin = 0;
}
if (le.endHour < minEndHour) {
le.endHour = minEndHour;
le.endMin = 0;
} else if (le.endHour >= maxEndHour) {
le.endHour = maxEndHour;
le.endMin = 0;
}
}
private void updateTime(LessonEntry le, boolean updatedStart) {
checkTimeCorrectness(le, updatedStart);
le.startTimeView.setText(timeToText(le.startHour, le.startMin));
le.endTimeView.setText(timeToText(le.endHour, le.endMin));
}
private String timeToText(int hour, int min) {
String h = (hour >= 10) ? "" + hour : "0" + hour;
String m = (min >= 10) ? "" + min : "0" + min;
return h + ":" + m;
}
private class LessonEntry {
private LessonEntry thisLesson;
private View thisView;
private int id = -1;
private int startHour = 8;
private int startMin = 0;
private int endHour = 9;
private int endMin = 0;
private Spinner daysSpinnerView;
private AutoCompleteTextView roomNameView;
private TextView startTimeView;
private TextView endTimeView;
private ImageView cancelButton;
public LessonEntry(View lessonView) {
this.daysSpinnerView = (Spinner) lessonView.findViewById(R.id.week_days_spinner);
this.startTimeView = (TextView) lessonView.findViewById(R.id.start_time);
this.endTimeView = (TextView) lessonView.findViewById(R.id.end_time);
this.roomNameView = (AutoCompleteTextView) lessonView.findViewById(R.id.aula);
this.cancelButton = (ImageView) lessonView.findViewById(R.id.cancel_button);
this.thisView = lessonView;
this.thisLesson = this;
setEvents();
}
private void setEvents() {
roomNameView.setAdapter(roomsAdapter);
startTimeView.setOnTouchListener(new OnTouchListener() {
boolean menuShown = false;
TimePickerDialog.OnTimeSetListener onStartTimeChanged = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
startHour = hourOfDay;
startMin = minute;
updateTime(thisLesson, true);
}
};
@Override
public boolean onTouch(View v, MotionEvent event) {
if (menuShown) {
return false;
}
menuShown = true;
TimePickerDialog tp = new TimePickerDialog(mActivity, onStartTimeChanged, startHour, startMin, true);
tp.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
menuShown = false;
}
});
tp.show();
return false;
}
});
endTimeView.setOnTouchListener(new OnTouchListener() {
boolean menuShown = false;
TimePickerDialog.OnTimeSetListener onEndTimeChanged = new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
endHour = hourOfDay;
endMin = minute;
updateTime(thisLesson, false);
}
};
@Override
public boolean onTouch(View v, MotionEvent event) {
if (menuShown) {
return false;
}
menuShown = true;
TimePickerDialog tp = new TimePickerDialog(mActivity, onEndTimeChanged, endHour, endMin, true);
tp.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
menuShown = false;
}
});
tp.show();
return false;
}
});
cancelButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
thisView.startAnimation(AnimationUtils.loadAnimation(mActivity, R.anim.slide_up));
lessonList.remove(thisLesson);
Animation slideUp = AnimationUtils.loadAnimation(mActivity, R.anim.slide_up);
slideUp.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationEnd(Animation animation) {
thisView.setVisibility(View.GONE);
// lessonsParent.removeView(thisView);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationStart(Animation animation) {
}
});
thisView.startAnimation(slideUp);
}
});
}
}
}