blob: 7a329d689d164e7ed7f0d2506deb0ddd512d6356 [file] [log] [blame]
package org.wordpress.android.models;
import java.util.ArrayList;
public class ReaderCommentList extends ArrayList<ReaderComment> {
private boolean commentIdExists(long commentId) {
return (indexOfCommentId(commentId) > -1);
}
public int indexOfCommentId(long commentId) {
for (int i=0; i < this.size(); i++) {
if (commentId==this.get(i).commentId)
return i;
}
return -1;
}
/*
* does passed list contain the same comments as this list?
*/
public boolean isSameList(ReaderCommentList comments) {
if (comments==null || comments.size()!=this.size())
return false;
for (ReaderComment comment: comments) {
if (!commentIdExists(comment.commentId))
return false;
}
return true;
}
public boolean replaceComment(long commentId, ReaderComment newComment) {
if (newComment == null) {
return false;
}
int index = indexOfCommentId(commentId);
if (index == -1) {
return false;
}
// make sure the new comment has the same level as the old one
newComment.level = this.get(index).level;
this.set(index, newComment);
return true;
}
/*
* builds a new list from the passed one with child comments placed under their parents and indent levels applied
*/
public static ReaderCommentList getLevelList(ReaderCommentList thisList) {
if (thisList==null)
return new ReaderCommentList();
// first check if there are any child comments - if not, just return the passed list
boolean hasChildComments = false;
for (ReaderComment comment: thisList) {
if (comment.parentId!=0) {
hasChildComments = true;
break;
}
}
if (!hasChildComments)
return thisList;
ReaderCommentList result = new ReaderCommentList();
// reset all levels, and add root comments to result
for (ReaderComment comment: thisList) {
comment.level = 0;
if (comment.parentId==0)
result.add(comment);
}
// add child comments under their parents
boolean done;
do {
done = true;
for (ReaderComment comment: thisList) {
// only look at comments that have a parentId but no level assigned yet
if (comment.parentId!=0 && comment.level==0) {
int parentIndex = result.indexOfCommentId(comment.parentId);
if (parentIndex > -1) {
comment.level = result.get(parentIndex).level + 1;
// insert this comment after the last comment of this level that has this parent
int commentIndex=parentIndex+1;
while (commentIndex < result.size()) {
if (result.get(commentIndex).level!=comment.level || result.get(commentIndex).parentId!=comment.parentId)
break;
commentIndex++;
}
result.add(commentIndex, comment);
done = false;
}
}
}
} while (!done);
// handle orphans (child comments whose parents weren't found above)
for (ReaderComment comment: thisList) {
if (comment.level==0 && comment.parentId!=0) {
comment.level = 1; // give it a non-zero level so it's indented by ReaderCommentAdapter
result.add(comment);
}
}
return result;
}
}