package in.co.praveenkumar.mdroid.fragment;
import in.co.praveenkumar.R;
import in.co.praveenkumar.mdroid.helper.SessionSetting;
import in.co.praveenkumar.mdroid.helper.TimeFormat;
import in.co.praveenkumar.mdroid.helper.Workaround;
import in.co.praveenkumar.mdroid.model.MoodleCourse;
import in.co.praveenkumar.mdroid.model.MoodleEvent;
import in.co.praveenkumar.mdroid.task.EventSyncTask;
import in.co.praveenkumar.mdroid.view.StickyListView;
import in.co.praveenkumar.mdroid.view.StickyListView.PinnedSectionListAdapter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.text.Html;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
public class CalenderFragment extends Fragment implements OnRefreshListener {
Context context;
int courseid = 0;
CalendarListAdapter calendarListAdapter;
SessionSetting session;
List<MoodleEvent> mEvents;
ArrayList<CalenderObject> listObjects = new ArrayList<>();
LinearLayout calenderEmptyLayout;
SwipeRefreshLayout swipeLayout;
/**
* Don't use this constructor
*/
public CalenderFragment() {
}
/**
* If you want to list all events, use courseid = 0
*
* @param courseid
*/
public void setCourseid(int courseid){
this.courseid = courseid;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
this.context = getActivity();
View rootView = inflater.inflate(R.layout.frag_calender, container,
false);
calenderEmptyLayout = (LinearLayout) rootView
.findViewById(R.id.calender_empty_layout);
ListView eventList = (ListView) rootView
.findViewById(R.id.list_calendar);
session = new SessionSetting(context);
if (courseid == 0)
mEvents = MoodleEvent.find(MoodleEvent.class, "siteid = ?",
String.valueOf(session.getCurrentSiteId()));
else
mEvents = MoodleEvent.find(MoodleEvent.class,
"siteid = ? and courseid = ?", String.valueOf(session.getCurrentSiteId())
, String.valueOf(courseid));
setupCalenderObjects();
calendarListAdapter = new CalendarListAdapter(context);
((StickyListView) eventList).setShadowVisible(false);
eventList.setAdapter(calendarListAdapter);
swipeLayout = (SwipeRefreshLayout) rootView
.findViewById(R.id.swipe_refresh);
Workaround.linkSwipeRefreshAndListView(swipeLayout, eventList);
swipeLayout.setOnRefreshListener(this);
new ListEventsThread(session.getmUrl(), session.getToken(),
session.getCurrentSiteId()).execute("");
return rootView;
}
private class ListEventsThread extends AsyncTask<String, Integer, Boolean> {
Long siteid;
EventSyncTask est;
Boolean syncStatus;
public ListEventsThread(String mUrl, String token, Long siteid) {
this.siteid = siteid;
est = new EventSyncTask(mUrl, token, siteid);
}
@Override
protected void onPreExecute() {
swipeLayout.setRefreshing(true);
}
@Override
protected Boolean doInBackground(String... params) {
// Get course ids
List<MoodleCourse> mCourses = MoodleCourse.find(MoodleCourse.class,
"siteid = ?", siteid + "");
ArrayList<String> courseIds = new ArrayList<>();
for (int i = 0; i < mCourses.size(); i++)
courseIds.add(mCourses.get(i).getCourseid() + "");
syncStatus = est.syncEvents(courseIds);
if (syncStatus) {
if (courseid == 0)
mEvents = MoodleEvent.find(MoodleEvent.class, "siteid = ?",
String.valueOf(session.getCurrentSiteId()));
else
mEvents = MoodleEvent.find(MoodleEvent.class,
"siteid = ? and courseid = ?",
String.valueOf(session.getCurrentSiteId()), String.valueOf(courseid));
setupCalenderObjects();
return true;
} else
return false;
}
@Override
protected void onPostExecute(Boolean result) {
calendarListAdapter.notifyDataSetChanged();
if (!listObjects.isEmpty())
calenderEmptyLayout.setVisibility(LinearLayout.GONE);
swipeLayout.setRefreshing(false);
}
}
public class CalendarListAdapter extends BaseAdapter implements
PinnedSectionListAdapter {
final Context context;
static final int TYPE_EVENT = 0;
static final int TYPE_DATE = 1;
static final int TYPE_COUNT = 2;
public CalendarListAdapter(Context context) {
this.context = context;
if (!listObjects.isEmpty())
calenderEmptyLayout.setVisibility(LinearLayout.GONE);
}
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
@Override
public int getItemViewType(int position) {
return listObjects.get(position).viewType;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
int type = getItemViewType(position);
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Choose layout
switch (type) {
case TYPE_EVENT:
convertView = inflater.inflate(R.layout.list_item_event,
parent, false);
viewHolder.eventname = (TextView) convertView
.findViewById(R.id.event_name);
viewHolder.eventcourse = (TextView) convertView
.findViewById(R.id.event_coursename);
viewHolder.eventtime = (TextView) convertView
.findViewById(R.id.event_time);
viewHolder.eventdesc = (TextView) convertView
.findViewById(R.id.event_desc);
break;
case TYPE_DATE:
convertView = inflater.inflate(
R.layout.list_item_calender_day, parent, false);
viewHolder.title = (TextView) convertView
.findViewById(R.id.list_calender_time);
break;
}
// Save the holder with the view
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// Assign values
switch (type) {
case TYPE_EVENT:
viewHolder.eventname.setText(listObjects.get(position).event
.getName());
viewHolder.eventcourse.setText(listObjects.get(position).event
.getCoursename());
viewHolder.eventtime.setText(TimeFormat.getNiceTime(listObjects
.get(position).event.getTimestart()));
String description = listObjects.get(position).event
.getDescription();
if (description == null)
description = "";
else
description = Html.fromHtml(description).toString().trim();
viewHolder.eventdesc.setText(description);
break;
case TYPE_DATE:
viewHolder.title.setText(listObjects.get(position).title);
break;
}
return convertView;
}
@Override
public boolean isItemViewTypePinned(int viewType) {
return viewType == TYPE_DATE;
}
@Override
public int getCount() {
return listObjects.size();
}
@Override
public Object getItem(int position) {
return listObjects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
static class ViewHolder {
TextView eventname;
TextView eventcourse;
TextView eventtime;
TextView eventdesc;
TextView title;
}
private void setupCalenderObjects() {
if (mEvents == null)
return;
if (mEvents.isEmpty())
return;
Collections.sort(mEvents, new Comparator<MoodleEvent>() {
public int compare(MoodleEvent o1, MoodleEvent o2) {
if (o1.getTimestart() == o2.getTimestart())
return 0;
return o1.getTimestart() < o2.getTimestart() ? -1 : 1;
}
});
// To avoid duplicates in listing
listObjects.clear();
// Build titles + events objects for pinned listview
String titlePrev = TimeFormat.getSectionTitle(mEvents.get(0)
.getTimestart());
String titleNow = "";
listObjects.add(new CalenderObject(null, CalendarListAdapter.TYPE_DATE,
titlePrev));
listObjects.add(new CalenderObject(mEvents.get(0),
CalendarListAdapter.TYPE_EVENT, titlePrev));
for (int i = 1; i < mEvents.size(); i++) {
titleNow = TimeFormat
.getSectionTitle(mEvents.get(i).getTimestart());
if (!titleNow.contentEquals(titlePrev))
listObjects.add(new CalenderObject(null,
CalendarListAdapter.TYPE_DATE, titleNow));
listObjects.add(new CalenderObject(mEvents.get(i),
CalendarListAdapter.TYPE_EVENT, titleNow));
titlePrev = titleNow;
}
}
/**
* For simplified pinned listview usage
*
* @author Praveen Kumar Pendyala (praveen@praveenkumar.co.in)
*
*/
class CalenderObject {
MoodleEvent event;
int viewType;
String title;
public CalenderObject() {
}
public CalenderObject(MoodleEvent event, int viewType, String title) {
this.event = event;
this.viewType = viewType;
this.title = title;
}
}
@Override
public void onRefresh() {
new ListEventsThread(session.getmUrl(), session.getToken(),
session.getCurrentSiteId()).execute("");
}
}