package de.tum.in.tumcampusapp.fragments; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.alamkanak.weekview.MonthLoader; import com.alamkanak.weekview.WeekView; import com.alamkanak.weekview.WeekViewEvent; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import de.tum.in.tumcampusapp.R; import de.tum.in.tumcampusapp.auxiliary.calendar.IntegratedCalendarEvent; import de.tum.in.tumcampusapp.tumonline.TUMRoomFinderRequest; public class WeekViewFragment extends Fragment implements MonthLoader.MonthChangeListener { private final SparseArray<List<WeekViewEvent>> loadedEvents = new SparseArray<>(); private String roomApiCode; private WeekView mWeekView; private Activity context; public static WeekViewFragment newInstance(String roomApiCode) { WeekViewFragment fragment = new WeekViewFragment(); Bundle args = new Bundle(); args.putString(TUMRoomFinderRequest.KEY_ROOM_ID, roomApiCode); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { roomApiCode = getArguments().getString(TUMRoomFinderRequest.KEY_ROOM_ID); View view = inflater.inflate(R.layout.fragment_day_view, container, false); mWeekView = (WeekView) view.findViewById(R.id.weekView); mWeekView.setMonthChangeListener(this); mWeekView.goToHour(8); return mWeekView; } @Override public List<WeekViewEvent> onMonthChange(int newYear, int newMonth) { if (!isLoaded(newYear, newMonth)) { loadEventsInBackground(newYear, newMonth); return new ArrayList<>(); } //Events already have been loaded. return loadedEvents.get(calculateLoadedKey(newYear, newMonth)); } private void loadEventsInBackground(final int newYear, final int newMonth) { new Thread(new Runnable() { @Override public void run() { // Populate the week view with the events of the month to display Calendar calendar = Calendar.getInstance(); //Note the (-1), since the calendar starts with month 0, but we get months starting with 1 calendar.set(newYear, newMonth - 1, 1); int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); long startTime = calendar.getTimeInMillis(); calendar.set(newYear, newMonth - 1, daysInMonth); long endTime = calendar.getTimeInMillis(); List<IntegratedCalendarEvent> roomFinderResult = new ArrayList<>(); TUMRoomFinderRequest request = new TUMRoomFinderRequest(getContext()); request.fetchRoomSchedule(roomApiCode, Long.toString(startTime), Long.toString(endTime), roomFinderResult); //Convert to the proper type final List<WeekViewEvent> events = new ArrayList<>(roomFinderResult.size()); for (IntegratedCalendarEvent event : roomFinderResult) { events.add(event); } //Finish loading context.runOnUiThread(new Runnable() { @Override public void run() { loadedEvents.put(calculateLoadedKey(newYear, newMonth), events); //Trigger onMonthChange() again mWeekView.notifyDatasetChanged(); } }); } }).start(); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof Activity) { this.context = (Activity) context; } } private boolean isLoaded(int year, int month) { return loadedEvents.get(calculateLoadedKey(year, month)) != null; } private static int calculateLoadedKey(int year, int month) { return (year * 16) | (month % 12); } }