package io.github.memfis19.sample;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
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.data.factory.EventFactory;
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.ui.month.adapter.decorator.MonthDayDecorator;
import io.github.memfis19.cadar.internal.ui.month.adapter.decorator.factory.MonthDayDecoratorFactory;
import io.github.memfis19.cadar.internal.utils.DateUtils;
import io.github.memfis19.cadar.settings.MonthCalendarConfiguration;
import io.github.memfis19.cadar.view.MonthCalendar;
import io.github.memfis19.sample.model.EventModel;
import io.github.memfis19.sample.process.Ical4JEventCalculator;
/**
* Created by memfis on 11/23/16.
*/
public class MonthCalendarActivity extends AppCompatActivity implements CalendarPrepareCallback {
private MonthCalendar monthCalendar;
private List<Event> events = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_month_calendar_layout);
events.add(new EventModel());
monthCalendar = (MonthCalendar) findViewById(R.id.monthCalendar);
MonthDayDecoratorFactory monthDayDecoratorFactory = new MonthDayDecoratorFactory() {
@Override
public MonthDayDecorator createMonthDayDecorator(View parent) {
return new MonthDayDecoratorImpl(parent);
}
};
MonthCalendarConfiguration.Builder builder = new MonthCalendarConfiguration.Builder();
builder.setDisplayPeriod(Calendar.YEAR, 1);
builder.setDisplayDaysOutOfMonth(false);
builder.setEventProcessingEnabled(true);
builder.setEventCalculator(new Ical4JEventCalculator());
builder.setEventFactory(new EventFactory() {
@Override
public Event createEventCopy(Event event) {
return new EventModel(event);
}
});
builder.setMonthDayLayout(R.layout.custom_month_day_layout, monthDayDecoratorFactory);
// builder.setEventsProcessor(new CustomProcessor());
monthCalendar.setCalendarPrepareCallback(this);
monthCalendar.prepareCalendar(builder.build());
monthCalendar.setOnDayChangeListener(new OnDayChangeListener() {
@Override
public void onDayChanged(Calendar calendar) {
Toast.makeText(MonthCalendarActivity.this, calendar.getTime().toString(), Toast.LENGTH_SHORT).show();
}
});
monthCalendar.setOnMonthChangeListener(new OnMonthChangeListener() {
@Override
public void onMonthChanged(Calendar calendar) {
Toast.makeText(MonthCalendarActivity.this, calendar.getTime().toString(), Toast.LENGTH_SHORT).show();
}
});
}
private class MonthDayDecoratorImpl implements MonthDayDecorator {
private TextView day;
public MonthDayDecoratorImpl(View parent) {
day = (TextView) parent.findViewById(R.id.day_view);
}
@Override
public void onBindDayView(View view, Calendar monthDay, Calendar month, List<Event> eventList, boolean isSelected, boolean isToday) {
if (!DateUtils.isSameMonth(month, monthDay)) {
view.setVisibility(View.GONE);
return;
} else view.setVisibility(View.VISIBLE);
day.setText(String.valueOf(monthDay.get(Calendar.DAY_OF_MONTH)));
day.setTextColor(Color.WHITE);
view.setBackgroundColor(Color.TRANSPARENT);
if (isToday) view.setBackgroundColor(Color.RED);
if (isSelected) view.setBackgroundColor(Color.MAGENTA);
}
}
@Override
public void onCalendarReady(CalendarController calendar) {
monthCalendar.displayEvents(events, new DisplayEventCallback<Calendar>() {
@Override
public void onEventsDisplayed(Calendar period) {
Log.d("", "");
monthCalendar.refresh();
}
});
}
class CustomProcessor extends EventsProcessor<Calendar, SparseArray<List<Event>>> {
public CustomProcessor() {
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() {
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> events = calendarEvents.get(temp.get(Calendar.DAY_OF_MONTH), new ArrayList<Event>());
events.add(event);
calendarEvents.put(temp.get(Calendar.DAY_OF_MONTH), events);
}
events.clear();
eventsProcessorCallback.onEventsProcessed(target, calendarEvents);
}
}, 3000);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
monthCalendar.releaseCalendar();
}
}