package com.instructure.canvasapi.model; import android.os.Parcel; import com.instructure.canvasapi.utilities.APIHelpers; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; /** * @author Josh Ruesch * * Copyright (c) 2014 Instructure. All rights reserved. */ public class DiscussionEntry extends CanvasModel<DiscussionEntry>{ private long id; //Entry id. private boolean unread = false; private String updated_at; private String created_at; private DiscussionEntry parent; //Parent of the entry; private DiscussionParticipant author; private String description; //HTML formatted string used for an edge case. Converting header to entry private long user_id; //Id of the user that posted it. private long parent_id = -1; //Parent id. -1 if there isn't one. private String message; //HTML message. private boolean deleted; //Whether the quthor deleted the message. If true, the message will be null. private int totalChildren = 0; private int unreadChildren = 0; private List<DiscussionEntry> replies = new ArrayList<DiscussionEntry>(); private List<DiscussionAttachment> attachments = new ArrayList<DiscussionAttachment>(); private int rating_count; private int rating_sum; /////////////////////////////////////////////////////////////////////////// // Getters and Setters /////////////////////////////////////////////////////////////////////////// @Override public long getId() { return id; } public void setId(long id) { this.id = id; } public List<DiscussionAttachment> getAttachments() { return attachments; } public void setAttachments(List<DiscussionAttachment> attachments) { this.attachments = attachments; } public boolean isUnread() { return unread; } public void setUnread(boolean unread) { this.unread = unread; } public void setTotalChildren(int total) { totalChildren = total; } public int getTotalChildren() { return totalChildren; } public void setUnreadChildren(int unread) { unreadChildren = unread; } public int getUnreadChildren() { return unreadChildren; } public void setAuthor(DiscussionParticipant discussionParticipant) { author = discussionParticipant; } public DiscussionParticipant getAuthor() { return author; } public Date getCreatedAt() { return APIHelpers.stringToDate(created_at); } public void setCreatedAt(Date date) { created_at = APIHelpers.dateToString(date); } public Date getLastUpdated() { return APIHelpers.stringToDate(updated_at); } public void setLastUpdated(Date date) { updated_at = APIHelpers.dateToString(date); } public String getDescription() { return description; } public void setDescription(String d) { description = d; } public DiscussionEntry getParent() { return parent; } public void setParent(DiscussionEntry parent) { this.parent = parent; } public long getUserId() { return user_id; } public void setUserId(long user_id) { this.user_id = user_id; } public long getParentId() { return parent_id; } public void setParentId(long parent_id) { this.parent_id = parent_id; } public String getMessage(String localizedDeletedString) { if (message == null || message.equals("null")) { if (deleted) return localizedDeletedString; else return ""; } return message; } public void setMessage(String message) { this.message = message; } public boolean isDeleted() { return deleted; } public void setDeleted(boolean deleted) { this.deleted = deleted; } public void addReply (DiscussionEntry entry){ if(this.replies == null) { this.replies = new ArrayList<DiscussionEntry>(); } this.replies.add(entry); } public List<DiscussionEntry> getReplies() { return replies; } public void setReplies(List<DiscussionEntry> replies) { if(this.replies == null) { this.replies = new ArrayList<DiscussionEntry>(); } this.replies = replies; } public int getRatingCount() { return rating_count; } public void setRatingCount(int rating_count) { this.rating_count = rating_count; } public int getRatingSum() { return rating_sum; } public void setRatingSum(int rating_sum) { this.rating_sum = rating_sum; } /////////////////////////////////////////////////////////////////////////// // Required Overrides /////////////////////////////////////////////////////////////////////////// @Override public Date getComparisonDate() { return getLastUpdated(); } @Override public String getComparisonString() { return message; } /////////////////////////////////////////////////////////////////////////// // Constructors /////////////////////////////////////////////////////////////////////////// public DiscussionEntry() { } public void init(DiscussionTopic topic, DiscussionEntry parent) { this.parent = parent; HashMap<Long, DiscussionParticipant> participantHashMap = topic.getParticipantsMap(); DiscussionParticipant discussionParticipant = participantHashMap.get(this.getUserId()); if(discussionParticipant != null){ author = discussionParticipant; } //Get whether or not the topic is unread; unread = topic.getUnread_entriesMap().containsKey(this.getId()); for(DiscussionEntry reply : replies){ reply.init(topic,this); //Handle total and unread children. unreadChildren += reply.getUnreadChildren(); if (reply.isUnread()) unreadChildren++; totalChildren++; totalChildren += reply.getTotalChildren(); } } /////////////////////////////////////////////////////////////////////////// // Helpers /////////////////////////////////////////////////////////////////////////// public int getDepth() { int depth = 0; DiscussionEntry temp = this; while (temp.getParent() != null) { depth++; temp = temp.getParent(); } return depth; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeLong(this.id); dest.writeByte(unread ? (byte) 1 : (byte) 0); dest.writeString(this.updated_at); dest.writeString(this.created_at); //can't have a circular reference with parcelable, so it needs to be serializable dest.writeSerializable(this.parent); dest.writeParcelable(this.author, 0); dest.writeString(this.description); dest.writeLong(this.user_id); dest.writeLong(this.parent_id); dest.writeString(this.message); dest.writeByte(deleted ? (byte) 1 : (byte) 0); dest.writeInt(this.totalChildren); dest.writeInt(this.unreadChildren); //can't have a circular reference with parcelable, so it needs to be serializable dest.writeSerializable((Serializable)this.replies); dest.writeList(this.attachments); dest.writeInt(this.rating_count); dest.writeInt(this.rating_sum); } private DiscussionEntry(Parcel in) { this.id = in.readLong(); this.unread = in.readByte() != 0; this.updated_at = in.readString(); this.created_at = in.readString(); this.parent = (DiscussionEntry)in.readSerializable(); this.author = in.readParcelable(DiscussionParticipant.class.getClassLoader()); this.description = in.readString(); this.user_id = in.readLong(); this.parent_id = in.readLong(); this.message = in.readString(); this.deleted = in.readByte() != 0; this.totalChildren = in.readInt(); this.unreadChildren = in.readInt(); this.replies = (List<DiscussionEntry>)in.readSerializable(); in.readList(this.attachments, DiscussionAttachment.class.getClassLoader()); this.rating_count = in.readInt(); this.rating_sum = in.readInt(); } public static Creator<DiscussionEntry> CREATOR = new Creator<DiscussionEntry>() { public DiscussionEntry createFromParcel(Parcel source) { return new DiscussionEntry(source); } public DiscussionEntry[] newArray(int size) { return new DiscussionEntry[size]; } }; }