package io.github.memfis19.sample;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.util.Pair;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseArray;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import io.github.memfis19.cadar.CalendarController;
import io.github.memfis19.cadar.data.entity.Event;
import io.github.memfis19.cadar.event.CalendarPrepareCallback;
import io.github.memfis19.cadar.event.DisplayEventCallback;
import io.github.memfis19.cadar.event.OnDayChangeListener;
import io.github.memfis19.cadar.event.OnMonthChangeListener;
import io.github.memfis19.cadar.internal.process.EventsProcessor;
import io.github.memfis19.cadar.internal.process.EventsProcessorCallback;
import io.github.memfis19.cadar.internal.utils.DateUtils;
import io.github.memfis19.cadar.settings.ListCalendarConfiguration;
import io.github.memfis19.cadar.settings.MonthCalendarConfiguration;
import io.github.memfis19.cadar.view.ListCalendar;
import io.github.memfis19.cadar.view.MonthCalendar;
import io.github.memfis19.sample.model.EventModel;
/**
* Created by memfis on 11/23/16.
*/
public class MonthListCalendarInteractionActivity extends AppCompatActivity implements CalendarPrepareCallback {
private MonthCalendar monthCalendar;
private ListCalendar listCalendar;
private List<Event> events = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_month_list_interaction_layout);
events.add(new EventModel());
monthCalendar = (MonthCalendar) findViewById(R.id.monthCalendar);
listCalendar = (ListCalendar) findViewById(R.id.listCalendar);
MonthCalendarConfiguration.Builder builder = new MonthCalendarConfiguration.Builder();
ListCalendarConfiguration.Builder listBuilder = new ListCalendarConfiguration.Builder();
monthCalendar.setCalendarPrepareCallback(this);
listCalendar.setCalendarPrepareCallback(this);
builder.setDisplayPeriod(Calendar.MONTH, 3);
listBuilder.setDisplayPeriod(Calendar.MONTH, 3);
// builder.setEventsProcessor(new MonthCustomProcessor());
// listBuilder.setEventsProcessor(new ListCustomEventProcessor());
monthCalendar.prepareCalendar(builder.build());
listCalendar.prepareCalendar(listBuilder.build());
monthCalendar.setOnDayChangeListener(new OnDayChangeListener() {
@Override
public void onDayChanged(Calendar calendar) {
listCalendar.setSelectedDay(DateUtils.setTimeToMidnight((Calendar) calendar.clone()), false);
}
});
monthCalendar.setOnMonthChangeListener(new OnMonthChangeListener() {
@Override
public void onMonthChanged(Calendar calendar) {
listCalendar.setSelectedDay(DateUtils.setTimeToMonthStart((Calendar) calendar.clone()), false);
}
});
listCalendar.setOnDayChangeListener(new OnDayChangeListener() {
@Override
public void onDayChanged(Calendar calendar) {
monthCalendar.setSelectedDay(calendar, false);
}
});
listCalendar.setOnMonthChangeListener(new OnMonthChangeListener() {
@Override
public void onMonthChanged(Calendar calendar) {
monthCalendar.setSelectedDay(calendar, true);
}
});
}
private Handler waitHandler = new Handler();
class ListCustomEventProcessor extends EventsProcessor<Pair<Calendar, Calendar>, List<Event>> {
public ListCustomEventProcessor() {
super(false, null, true);
}
@Override
protected void processEventsAsync(final Pair<Calendar, Calendar> target, final EventsProcessorCallback<Pair<Calendar, Calendar>, List<Event>> eventsProcessorCallback) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
final List<Event> events = new ArrayList<>();
for (int i = 0; i < 5; ++i) {
events.add(new EventModel());
}
waitHandler.postDelayed(new Runnable() {
@Override
public void run() {
eventsProcessorCallback.onEventsProcessed(target, events);
}
}, 100);
}
}, 3000);
}
}
class MonthCustomProcessor extends EventsProcessor<Calendar, SparseArray<List<Event>>> {
public MonthCustomProcessor() {
super(false, null, true);
}
@Override
protected void processEventsAsync(final Calendar target, final EventsProcessorCallback<Calendar, SparseArray<List<Event>>> eventsProcessorCallback) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
List<Event> events = new ArrayList<>();
for (int i = 0; i < 5; ++i) {
events.add(new EventModel());
}
final SparseArray<List<Event>> calendarEvents = new SparseArray<>();
Calendar temp = DateUtils.getCalendarInstance();
for (Event event : events) {
temp.setTime(event.getEventStartDate());
if (!DateUtils.isSameMonth(temp, target)) continue;
List<Event> tmpEvents = calendarEvents.get(temp.get(Calendar.DAY_OF_MONTH), new ArrayList<Event>());
tmpEvents.add(event);
calendarEvents.put(temp.get(Calendar.DAY_OF_MONTH), tmpEvents);
}
events.clear();
waitHandler.postDelayed(new Runnable() {
@Override
public void run() {
eventsProcessorCallback.onEventsProcessed(target, calendarEvents);
}
}, 100);
}
}, 3000);
}
}
@Override
public void onCalendarReady(CalendarController calendar) {
if (calendar == monthCalendar) {
monthCalendar.displayEvents(new ArrayList<>(events), new DisplayEventCallback<Calendar>() {
@Override
public void onEventsDisplayed(Calendar month) {
}
});
} else if (calendar == listCalendar) {
listCalendar.displayEvents(new ArrayList<>(events), new DisplayEventCallback<Pair<Calendar, Calendar>>() {
@Override
public void onEventsDisplayed(Pair<Calendar, Calendar> period) {
}
});
}
}
@Override
protected void onDestroy() {
super.onDestroy();
monthCalendar.releaseCalendar();
listCalendar.releaseCalendar();
}
}