package com.instructure.canvasapi.model; import android.os.Parcel; import com.instructure.canvasapi.utilities.APIHelpers; import java.io.Serializable; import java.util.Date; import java.util.Map; /** * Created by Joshua Dutton * * Copyright (c) 2014 Instructure. All rights reserved. */ public class ToDo extends CanvasComparable<ToDo>{ public enum Type implements Serializable { SUBMITTING, GRADING, UPCOMING_EVENT, UPCOMING_ASSIGNMENT } // member variables private String start_date; private String type; private int needs_grading_count; private String ignore; private String ignore_permanently; private String html_url; private long course_id; private long group_id; // helper variables private Date startDate; private Type typeEnum = null; private CanvasContext canvasContext; private Assignment assignment; private ScheduleItem scheduleItem; private boolean checked; /////////////////////////////////////////////////////////////////////////// // Getters and Setters /////////////////////////////////////////////////////////////////////////// public Date getStartDate() { if (startDate == null) { startDate = APIHelpers.stringToDate(start_date); } return startDate; } public Type getType() { if (typeEnum == null) { if(type.equals("submitting")) { typeEnum = Type.SUBMITTING; } else if (type.equals("grading")) { typeEnum = Type.GRADING; } else if(assignment != null) { typeEnum = Type.UPCOMING_ASSIGNMENT; } else { typeEnum = Type.UPCOMING_EVENT; } } return typeEnum; } public void setType(Type type) { this.typeEnum = type; } public int getNeedsGradingCount() { return needs_grading_count; } public void setNeedsGradingCount(int needs_grading_count) { this.needs_grading_count = needs_grading_count; } public String getIgnore() { return ignore; } public void setIgnore(String ignore) { this.ignore = ignore; } public String getIgnorePermanently() { return ignore_permanently; } public void setIgnorePermanently(String ignore_permanently) { this.ignore_permanently = ignore_permanently; } public String getHtmlUrl() { return html_url; } public void setHtmlUrl(String html_url) { this.html_url = html_url; } public void setCourseId(long courseId) { this.course_id = courseId; } public CanvasContext getCanvasContext() { return canvasContext; } public void setCanvasContext(CanvasContext canvasContext) { this.canvasContext = canvasContext; } public ScheduleItem getScheduleItem() { return scheduleItem; } public void setScheduleItem(ScheduleItem scheduleItem) { this.scheduleItem = scheduleItem; } public Assignment getAssignment() { return assignment; } public void setAssignment(Assignment assignment) { this.assignment = assignment; } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } /////////////////////////////////////////////////////////////////////////// // Constructors /////////////////////////////////////////////////////////////////////////// public ToDo() {} /* Example JSON Response * [ { 'type': 'grading', // an assignment that needs grading 'assignment': { .. assignment object .. }, 'ignore': '.. url ..', 'ignore_permanently': '.. url ..', 'html_url': '.. url ..', 'needs_grading_count': 3, // number of submissions that need grading 'context_type': 'course', // course|group 'course_id': 1, 'group_id': null, }, { 'type' => 'submitting', // an assignment that needs submitting soon 'assignment' => { .. assignment object .. }, 'ignore' => '.. url ..', 'ignore_permanently' => '.. url ..', 'html_url': '.. url ..', 'context_type': 'course', 'course_id': 1, } ] */ /////////////////////////////////////////////////////////////////////////// // Overrides /////////////////////////////////////////////////////////////////////////// @Override public Date getComparisonDate() { Date date = new Date(Long.MAX_VALUE); if (getStartDate() != null) { date = getStartDate(); } // due date is more important if we have one if (getDueDate() != null) { date = getDueDate(); } return date; } @Override public String getComparisonString() { return getTitle(); } @Override public int hashCode() { return getComparisonString().hashCode() + getComparisonDate().hashCode(); } @Override public boolean equals(Object o) { try { ToDo toDo = (ToDo) o; return getComparisonString().equals(toDo.getComparisonString()) && getComparisonDate().equals(toDo.getComparisonDate()); } catch (Exception e) { return false; } } @Override public long getId() { if (assignment != null) { return assignment.getId(); } else if (scheduleItem != null) { return scheduleItem.getId(); } else { return super.getId(); } } /////////////////////////////////////////////////////////////////////////// // Helpers /////////////////////////////////////////////////////////////////////////// public String getTitle() { if (getAssignment() != null && assignment.getName() != null) { return assignment.getName(); } else if (getScheduleItem() != null && getScheduleItem().getTitle() != null) { return getScheduleItem().getTitle(); } return ""; } public Date getDueDate() { if (assignment != null) { return assignment.getDueDate(); } else { return scheduleItem.getEndDate(); } } public static void setContextInfo(ToDo toDo, Map<Long, Course> courses, Map<Long, Group> groups) { if(toDo.group_id > 0){ toDo.canvasContext = groups.get(toDo.group_id); } else { toDo.canvasContext = courses.get(toDo.course_id); } } public static ToDo toDoWithScheduleItem(ScheduleItem scheduleItem) { ToDo toDo = new ToDo(); toDo.setScheduleItem(scheduleItem); if (scheduleItem.getAssignment() == null) { toDo.setType(Type.UPCOMING_EVENT); } else { toDo.setAssignment(scheduleItem.getAssignment()); toDo.setType(Type.UPCOMING_ASSIGNMENT); } if (scheduleItem.getContextType() == CanvasContext.Type.COURSE) { toDo.setCourseId(scheduleItem.getCourseId()); } else if (scheduleItem.getContextType() == CanvasContext.Type.GROUP) { toDo.group_id = scheduleItem.getGroupId(); } return toDo; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.start_date); dest.writeString(this.type); dest.writeInt(this.needs_grading_count); dest.writeString(this.ignore); dest.writeString(this.ignore_permanently); dest.writeString(this.html_url); dest.writeLong(this.course_id); dest.writeLong(this.group_id); dest.writeLong(startDate != null ? startDate.getTime() : -1); dest.writeInt(this.typeEnum == null ? -1 : this.typeEnum.ordinal()); dest.writeParcelable(this.canvasContext, 0); dest.writeParcelable(this.assignment, flags); dest.writeParcelable(this.scheduleItem, flags); dest.writeByte(checked ? (byte) 1 : (byte) 0); } private ToDo(Parcel in) { this.start_date = in.readString(); this.type = in.readString(); this.needs_grading_count = in.readInt(); this.ignore = in.readString(); this.ignore_permanently = in.readString(); this.html_url = in.readString(); this.course_id = in.readLong(); this.group_id = in.readLong(); long tmpStartDate = in.readLong(); this.startDate = tmpStartDate == -1 ? null : new Date(tmpStartDate); int tmpTypeEnum = in.readInt(); this.typeEnum = tmpTypeEnum == -1 ? null : Type.values()[tmpTypeEnum]; this.canvasContext = in.readParcelable(CanvasContext.class.getClassLoader()); this.assignment = in.readParcelable(Assignment.class.getClassLoader()); this.scheduleItem = in.readParcelable(ScheduleItem.class.getClassLoader()); this.checked = in.readByte() != 0; } public static Creator<ToDo> CREATOR = new Creator<ToDo>() { public ToDo createFromParcel(Parcel source) { return new ToDo(source); } public ToDo[] newArray(int size) { return new ToDo[size]; } }; }