package it.fdev.unisaconnect;
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.HashSet;
import java.util.Set;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class FragmentTimetable extends MySimpleFragment {
private RelativeLayout lessonsContainer;
private int containerHeight = 0;
private OnGlobalLayoutListener mLayoutObserver;
private boolean observerRunning = false;
LinearLayout hContainer;
private int[] dayXLoc = new int[5];
private View[] daysList = new View[5];
private int[] timeYLoc = new int[11];
private View[] timesList = new View[11];
private float daysWidth = 0;
private float hoursHeight = 0;
private float minHeight = 0;
private TimetableDB ttDB;
private ArrayList<Lesson> lessonList;
private boolean measuresTaken = false;
private final int[] dayIDs = new int[] { R.id.d1, R.id.d2, R.id.d3, R.id.d4, R.id.d5 };
// private final int[] timeIDs = new int[] { R.id.h8, R.id.h9, R.id.h10, R.id.h11, R.id.h12, R.id.h13, R.id.h14, R.id.h15, R.id.h16, R.id.h17, R.id.h18 };
private final int[] sepIDs = new int[] { R.id.sh8, R.id.sh9, R.id.sh10, R.id.sh11, R.id.sh12, R.id.sh13, R.id.sh14, R.id.sh15, R.id.sh16, R.id.sh17, R.id.sh18 };
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mainView = (View) inflater.inflate(R.layout.fragment_timetable1, container, false);
ttDB = new TimetableDB(mActivity);
ttDB.open();
return mainView;
}
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
lessonsContainer = ((RelativeLayout) view.findViewById(R.id.lessons_container));
hContainer = ((LinearLayout) view.findViewById(R.id.hcontainer));
// Wait for items loaded to take the needed position measures
mLayoutObserver = new OnGlobalLayoutListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onGlobalLayout() {
if (observerRunning) {
return;
}
observerRunning = true;
int newContainerHeight = lessonsContainer.getHeight();
if (newContainerHeight != containerHeight) {
containerHeight = newContainerHeight;
setMeasures();
loadLessons();
}
observerRunning = false;
}
};
resumeLayoutObserver();
}
@Override
public void onResume() {
super.onResume();
resumeLayoutObserver();
try {
if (measuresTaken) {
loadLessons();
}
} catch (Exception e) {
}
}
@Override
public void onPause() {
super.onPause();
pauseLayoutObserver();
}
public void resumeLayoutObserver() {
if (mLayoutObserver == null) {
return;
}
ViewTreeObserver vto = lessonsContainer.getViewTreeObserver();
vto.addOnGlobalLayoutListener(mLayoutObserver);
}
@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void pauseLayoutObserver() {
if (mLayoutObserver == null) {
return;
}
int sdk = android.os.Build.VERSION.SDK_INT;
if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
lessonsContainer.getViewTreeObserver().removeGlobalOnLayoutListener(mLayoutObserver);
} else {
lessonsContainer.getViewTreeObserver().removeOnGlobalLayoutListener(mLayoutObserver);
}
}
public void setMeasures() {
int xOffset = mActivity.findViewById(dayIDs[0]).getLeft();
daysWidth = (lessonsContainer.getWidth() - xOffset) / ((float) daysList.length);
for (int i = 0; i < dayIDs.length; i++) {
daysList[i] = mActivity.findViewById(dayIDs[i]);
dayXLoc[i] = daysList[i].getLeft();
}
int yOffset = mActivity.findViewById(sepIDs[0]).getTop();
hoursHeight = (lessonsContainer.getHeight() - yOffset) / ((float) timeYLoc.length);
minHeight = hoursHeight / (float) 60;
for (int i = 0; i < sepIDs.length; i++) {
timesList[i] = mActivity.findViewById(sepIDs[i]);
timeYLoc[i] = timesList[i].getTop();// + (timesList[i].getHeight()/2);
// RelativeLayout.LayoutParams p = (RelativeLayout.LayoutParams) hContainer.getLayoutParams();
// p.setMargins(0, Math.round(-hoursHeight/2), 0, Math.round(hoursHeight/2));
// hContainer.setLayoutParams(p);
}
measuresTaken = true;
}
/**
*
* @param nome
* Il testo da visualizzare
* @param day
* Il giorno della settimana, dove 0 è lunedi e 4 è venerdi
* @param hour
* L'ora di inizio della lezione, compresa tra le 8 e le 19
* @param minutes
* I minuti dell'ora di inizio della lezione
* @param duration
* La durata della lezione in minuti
*/
public void addLesson(final Lesson lesson, int i) {
String text = lesson.getSubjectName();
if (text.length() > 10)
text = text.substring(0, 8) + "...";
text += "\n" + lesson.getRoom();
if (lesson.getDay() < 0 || lesson.getDay() > 4) {
Log.w(Utils.TAG, "Giorno non valido: " + lesson.getDay());
return;
}
if (lesson.getStartHour() < 8 || lesson.getStartHour() > 19) {
Log.w(Utils.TAG, "Ora non valida: " + lesson.getStartHour());
return;
}
if (lesson.getDuration() < 30) {
Log.w(Utils.TAG, "Durata non valida: " + lesson.getDuration());
return;
}
LayoutInflater layoutInflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout lessonView = (LinearLayout) layoutInflater.inflate(R.layout.timetable_lesson_view, lessonsContainer, false);
TextView titleView = (TextView) lessonView.findViewById(R.id.title);
TextView descriptionView = (TextView) lessonView.findViewById(R.id.description);
lessonView.setTag(i);
lessonView.setBackgroundColor(lesson.getColor());
String title = lesson.getSubjectName();
if (title.length() > 10)
title = title.substring(0, 8) + "...";
titleView.setText(title);
if (lesson.getRoom().isEmpty()) {
descriptionView.setVisibility(View.GONE);
} else {
descriptionView.setText(lesson.getRoom());
}
lessonView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
FragmentTimetableAddLesson addLessonFragment = new FragmentTimetableAddLesson();
addLessonFragment.editLesson(lesson);
mActivity.switchContent(addLessonFragment);
}
});
// TextView textView = new TextView(activity);
// textView.setTextColor(0xFFFFFFFF);
// textView.setTextSize(14f);
// textView.setBackgroundColor(lesson.getColor());
// textView.setGravity(Gravity.CENTER);
// textView.setText(text);
// textView.setTag(i);
// textView.setOnClickListener(new OnClickListener() {
// @Override
// public void onClick(View v) {
// FragmentTimetableAddLesson addLessonFragment = new FragmentTimetableAddLesson();
// addLessonFragment.editLesson(lesson);
// activity.switchContent(addLessonFragment);
// }
// });
int marginTop = timesList[lesson.getStartHour() - 8].getTop() + (int) (minHeight * lesson.getStartMinutes());
int marginLeft = daysList[lesson.getDay()].getLeft();
int height = (int) (minHeight * lesson.getDuration());
int width = (int) daysWidth;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height);
params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
params.setMargins(marginLeft, marginTop, 0, 0);
lessonView.setLayoutParams(params);
lessonsContainer.addView(lessonView);
}
private void loadLessons() {
lessonsContainer.removeAllViews();
lessonList = ttDB.getLessons();
for (int i = 0; i < lessonList.size(); i++) {
addLesson(lessonList.get(i), i);
}
}
@Override
public void actionAdd() {
FragmentTimetableAddLesson addLessonFragment = new FragmentTimetableAddLesson();
mActivity.switchContent(addLessonFragment);
}
@Override
public Set<Integer> getActionsToShow() {
Set<Integer> actionsToShow = new HashSet<Integer>();
actionsToShow.add(R.id.action_add_button);
return actionsToShow;
}
@Override
public int getTitleResId() {
return R.string.orari_lezioni;
}
}