Show child reply count in comments.

This commit is contained in:
Alex Ning 2022-01-17 17:30:56 +08:00
parent 9ab1e6904c
commit 5eaf4ab8fe
8 changed files with 95 additions and 11 deletions

View File

@ -374,7 +374,7 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
@BindView(R.id.save_button_item_post_comment) @BindView(R.id.save_button_item_post_comment)
ImageView saveButton; ImageView saveButton;
@BindView(R.id.expand_button_item_post_comment) @BindView(R.id.expand_button_item_post_comment)
ImageView expandButton; TextView expandButton;
@BindView(R.id.reply_button_item_post_comment) @BindView(R.id.reply_button_item_post_comment)
ImageView replyButton; ImageView replyButton;
@BindView(R.id.divider_item_comment) @BindView(R.id.divider_item_comment)
@ -434,7 +434,6 @@ public class CommentsListingRecyclerViewAdapter extends PagedListAdapter<Comment
scoreTextView.setTextColor(mCommentIconAndInfoColor); scoreTextView.setTextColor(mCommentIconAndInfoColor);
downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
moreButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); moreButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
expandButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
saveButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); saveButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
commentDivider.setBackgroundColor(mDividerColor); commentDivider.setBackgroundColor(mDividerColor);

View File

@ -114,6 +114,8 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
private boolean isInitiallyLoadingFailed; private boolean isInitiallyLoadingFailed;
private boolean mHasMoreComments; private boolean mHasMoreComments;
private boolean loadMoreCommentsFailed; private boolean loadMoreCommentsFailed;
private Drawable expandDrawable;
private Drawable collapseDrawable;
private int depthThreshold = 5; private int depthThreshold = 5;
private int mColorPrimaryLightTheme; private int mColorPrimaryLightTheme;
@ -236,6 +238,9 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
mHasMoreComments = false; mHasMoreComments = false;
loadMoreCommentsFailed = false; loadMoreCommentsFailed = false;
expandDrawable = Utils.getTintedDrawable(activity, R.drawable.ic_expand_more_grey_24dp, customThemeWrapper.getCommentIconAndInfoColor());
collapseDrawable = Utils.getTintedDrawable(activity, R.drawable.ic_expand_less_grey_24dp, customThemeWrapper.getCommentIconAndInfoColor());
mColorPrimaryLightTheme = customThemeWrapper.getColorPrimaryLightTheme(); mColorPrimaryLightTheme = customThemeWrapper.getColorPrimaryLightTheme();
mColorAccent = customThemeWrapper.getColorAccent(); mColorAccent = customThemeWrapper.getColorAccent();
mCircularProgressBarBackgroundColor = customThemeWrapper.getCircularProgressBarBackground(); mCircularProgressBarBackgroundColor = customThemeWrapper.getCircularProgressBarBackground();
@ -430,10 +435,13 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
} }
if (comment.hasReply()) { if (comment.hasReply()) {
if (comment.getChildCount() > 0) {
((CommentViewHolder) holder).expandButton.setText("+" + comment.getChildCount());
}
if (comment.isExpanded()) { if (comment.isExpanded()) {
((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_less_grey_24dp); ((CommentViewHolder) holder).expandButton.setCompoundDrawablesWithIntrinsicBounds(collapseDrawable, null, null, null);
} else { } else {
((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_more_grey_24dp); ((CommentViewHolder) holder).expandButton.setCompoundDrawablesWithIntrinsicBounds(expandDrawable, null, null, null);
} }
((CommentViewHolder) holder).expandButton.setVisibility(View.VISIBLE); ((CommentViewHolder) holder).expandButton.setVisibility(View.VISIBLE);
} }
@ -486,6 +494,12 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
if (comment != null) { if (comment != null) {
String authorWithPrefix = "u/" + comment.getAuthor(); String authorWithPrefix = "u/" + comment.getAuthor();
((CommentFullyCollapsedViewHolder) holder).usernameTextView.setText(authorWithPrefix); ((CommentFullyCollapsedViewHolder) holder).usernameTextView.setText(authorWithPrefix);
if (comment.getChildCount() > 0) {
((CommentFullyCollapsedViewHolder) holder).childCountTextView.setVisibility(View.VISIBLE);
((CommentFullyCollapsedViewHolder) holder).childCountTextView.setText("+" + comment.getChildCount());
} else {
((CommentFullyCollapsedViewHolder) holder).childCountTextView.setVisibility(View.GONE);
}
if (mShowElapsedTime) { if (mShowElapsedTime) {
((CommentFullyCollapsedViewHolder) holder).commentTimeTextView.setText(Utils.getElapsedTime(mActivity, comment.getCommentTimeMillis())); ((CommentFullyCollapsedViewHolder) holder).commentTimeTextView.setText(Utils.getElapsedTime(mActivity, comment.getCommentTimeMillis()));
} else { } else {
@ -603,6 +617,11 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
} }
mVisibleComments.get(parentPosition).addChildren(expandedComments); mVisibleComments.get(parentPosition).addChildren(expandedComments);
if (mIsSingleCommentThreadMode) {
notifyItemChanged(parentPosition + 1);
} else {
notifyItemChanged(parentPosition);
}
} else { } else {
for (int i = 0; i < mVisibleComments.size(); i++) { for (int i = 0; i < mVisibleComments.size(); i++) {
if (mVisibleComments.get(i).getFullName().equals(parentComment.getFullName())) { if (mVisibleComments.get(i).getFullName().equals(parentComment.getFullName())) {
@ -635,6 +654,11 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
mVisibleComments.get(i).getChildren().get(mVisibleComments.get(i).getChildren().size() - 1) mVisibleComments.get(i).getChildren().get(mVisibleComments.get(i).getChildren().size() - 1)
.setLoadMoreChildrenFailed(false); .setLoadMoreChildrenFailed(false);
mVisibleComments.get(i).addChildren(expandedComments); mVisibleComments.get(i).addChildren(expandedComments);
if (mIsSingleCommentThreadMode) {
notifyItemChanged(i + 1);
} else {
notifyItemChanged(i);
}
break; break;
} }
@ -846,8 +870,10 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
} else { } else {
mVisibleComments.add(parentPosition + 1, comment); mVisibleComments.add(parentPosition + 1, comment);
if (mIsSingleCommentThreadMode) { if (mIsSingleCommentThreadMode) {
notifyItemChanged(parentPosition + 1);
notifyItemInserted(parentPosition + 2); notifyItemInserted(parentPosition + 2);
} else { } else {
notifyItemChanged(parentPosition);
notifyItemInserted(parentPosition + 1); notifyItemInserted(parentPosition + 1);
} }
} }
@ -1017,6 +1043,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); ((CommentViewHolder) holder).upvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor); ((CommentViewHolder) holder).scoreTextView.setTextColor(mCommentIconAndInfoColor);
((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); ((CommentViewHolder) holder).downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
((CommentViewHolder) holder).expandButton.setText("");
((CommentViewHolder) holder).replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); ((CommentViewHolder) holder).replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
} }
} }
@ -1076,7 +1103,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
@BindView(R.id.save_button_item_post_comment) @BindView(R.id.save_button_item_post_comment)
ImageView saveButton; ImageView saveButton;
@BindView(R.id.expand_button_item_post_comment) @BindView(R.id.expand_button_item_post_comment)
ImageView expandButton; TextView expandButton;
@BindView(R.id.reply_button_item_post_comment) @BindView(R.id.reply_button_item_post_comment)
ImageView replyButton; ImageView replyButton;
@BindView(R.id.vertical_block_indentation_item_comment) @BindView(R.id.vertical_block_indentation_item_comment)
@ -1125,6 +1152,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
topScoreTextView.setTypeface(mActivity.typeface); topScoreTextView.setTypeface(mActivity.typeface);
awardsTextView.setTypeface(mActivity.typeface); awardsTextView.setTypeface(mActivity.typeface);
scoreTextView.setTypeface(mActivity.typeface); scoreTextView.setTypeface(mActivity.typeface);
expandButton.setTypeface(mActivity.typeface);
} }
if (mActivity.contentTypeface != null) { if (mActivity.contentTypeface != null) {
commentMarkdownView.setTypeface(mActivity.contentTypeface); commentMarkdownView.setTypeface(mActivity.contentTypeface);
@ -1141,7 +1169,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
scoreTextView.setTextColor(mCommentIconAndInfoColor); scoreTextView.setTextColor(mCommentIconAndInfoColor);
downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); downvoteButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
moreButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); moreButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
expandButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); expandButton.setTextColor(mCommentIconAndInfoColor);
saveButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); saveButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN); replyButton.setColorFilter(mCommentIconAndInfoColor, PorterDuff.Mode.SRC_IN);
@ -1426,7 +1454,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
if (comment != null) { if (comment != null) {
if (mVisibleComments.get(commentPosition).isExpanded()) { if (mVisibleComments.get(commentPosition).isExpanded()) {
collapseChildren(commentPosition); collapseChildren(commentPosition);
expandButton.setImageResource(R.drawable.ic_expand_more_grey_24dp); expandButton.setCompoundDrawablesWithIntrinsicBounds(expandDrawable, null, null, null);
} else { } else {
comment.setExpanded(true); comment.setExpanded(true);
ArrayList<Comment> newList = new ArrayList<>(); ArrayList<Comment> newList = new ArrayList<>();
@ -1439,7 +1467,7 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
} else { } else {
notifyItemRangeInserted(commentPosition + 1, newList.size()); notifyItemRangeInserted(commentPosition + 1, newList.size());
} }
expandButton.setImageResource(R.drawable.ic_expand_less_grey_24dp); expandButton.setCompoundDrawablesWithIntrinsicBounds(collapseDrawable, null, null, null);
} }
} }
} else if (mFullyCollapseComment) { } else if (mFullyCollapseComment) {
@ -1536,6 +1564,8 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
CommentIndentationView commentIndentationView; CommentIndentationView commentIndentationView;
@BindView(R.id.user_name_text_view_item_comment_fully_collapsed) @BindView(R.id.user_name_text_view_item_comment_fully_collapsed)
TextView usernameTextView; TextView usernameTextView;
@BindView(R.id.child_count_text_view_item_comment_fully_collapsed)
TextView childCountTextView;
@BindView(R.id.score_text_view_item_comment_fully_collapsed) @BindView(R.id.score_text_view_item_comment_fully_collapsed)
TextView scoreTextView; TextView scoreTextView;
@BindView(R.id.time_text_view_item_comment_fully_collapsed) @BindView(R.id.time_text_view_item_comment_fully_collapsed)
@ -1549,11 +1579,13 @@ public class CommentsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVi
if (mActivity.typeface != null) { if (mActivity.typeface != null) {
usernameTextView.setTypeface(mActivity.typeface); usernameTextView.setTypeface(mActivity.typeface);
childCountTextView.setTypeface(mActivity.typeface);
scoreTextView.setTypeface(mActivity.typeface); scoreTextView.setTypeface(mActivity.typeface);
commentTimeTextView.setTypeface(mActivity.typeface); commentTimeTextView.setTypeface(mActivity.typeface);
} }
itemView.setBackgroundColor(mFullyCollapsedCommentBackgroundColor); itemView.setBackgroundColor(mFullyCollapsedCommentBackgroundColor);
usernameTextView.setTextColor(mUsernameColor); usernameTextView.setTextColor(mUsernameColor);
childCountTextView.setTextColor(mSecondaryTextColor);
scoreTextView.setTextColor(mSecondaryTextColor); scoreTextView.setTextColor(mSecondaryTextColor);
commentTimeTextView.setTextColor(mSecondaryTextColor); commentTimeTextView.setTextColor(mSecondaryTextColor);

View File

@ -1046,6 +1046,13 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
} }
} }
public void addOneComment() {
if (mPost != null) {
mPost.setNComments(mPost.getNComments() + 1);
notifyItemChanged(0);
}
}
@Override @Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
if (holder instanceof PostDetailBaseViewHolder) { if (holder instanceof PostDetailBaseViewHolder) {

View File

@ -44,6 +44,7 @@ public class Comment implements Parcelable {
private String permalink; private String permalink;
private String awards; private String awards;
private int depth; private int depth;
private int childCount;
private boolean collapsed; private boolean collapsed;
private boolean hasReply; private boolean hasReply;
private boolean scoreHidden; private boolean scoreHidden;
@ -130,6 +131,7 @@ public class Comment implements Parcelable {
permalink = in.readString(); permalink = in.readString();
awards = in.readString(); awards = in.readString();
depth = in.readInt(); depth = in.readInt();
childCount = in.readInt();
collapsed = in.readByte() != 0; collapsed = in.readByte() != 0;
hasReply = in.readByte() != 0; hasReply = in.readByte() != 0;
scoreHidden = in.readByte() != 0; scoreHidden = in.readByte() != 0;
@ -239,6 +241,14 @@ public class Comment implements Parcelable {
return depth; return depth;
} }
public int getChildCount() {
return childCount;
}
public void setChildCount(int childCount) {
this.childCount = childCount;
}
public boolean isCollapsed() { public boolean isCollapsed() {
return collapsed; return collapsed;
} }
@ -304,10 +314,12 @@ public class Comment implements Parcelable {
children.addAll(moreChildren); children.addAll(moreChildren);
} }
} }
childCount += moreChildren == null ? 0 : moreChildren.size();
} }
public void addChild(Comment comment) { public void addChild(Comment comment) {
addChild(comment, 0); addChild(comment, 0);
childCount++;
} }
public void addChild(Comment comment, int position) { public void addChild(Comment comment, int position) {
@ -387,6 +399,7 @@ public class Comment implements Parcelable {
parcel.writeString(permalink); parcel.writeString(permalink);
parcel.writeString(awards); parcel.writeString(awards);
parcel.writeInt(depth); parcel.writeInt(depth);
parcel.writeInt(childCount);
parcel.writeByte((byte) (collapsed ? 1 : 0)); parcel.writeByte((byte) (collapsed ? 1 : 0));
parcel.writeByte((byte) (hasReply ? 1 : 0)); parcel.writeByte((byte) (hasReply ? 1 : 0));
parcel.writeByte((byte) (scoreHidden ? 1 : 0)); parcel.writeByte((byte) (scoreHidden ? 1 : 0));

View File

@ -135,12 +135,24 @@ public class ParseComment {
parseCommentRecursion(childrenArray, children, nextMoreChildrenFullnames, singleComment.getDepth()); parseCommentRecursion(childrenArray, children, nextMoreChildrenFullnames, singleComment.getDepth());
singleComment.addChildren(children); singleComment.addChildren(children);
singleComment.setMoreChildrenFullnames(nextMoreChildrenFullnames); singleComment.setMoreChildrenFullnames(nextMoreChildrenFullnames);
singleComment.setChildCount(getChildCount(singleComment));
} }
newCommentData.add(singleComment); newCommentData.add(singleComment);
} }
} }
private static int getChildCount(Comment comment) {
if (comment.getChildren() == null) {
return 0;
}
int count = 0;
for (Comment c : comment.getChildren()) {
count += getChildCount(c);
}
return comment.getChildren().size() + count;
}
private static void expandChildren(ArrayList<Comment> comments, ArrayList<Comment> visibleComments, private static void expandChildren(ArrayList<Comment> comments, ArrayList<Comment> visibleComments,
boolean setExpanded) { boolean setExpanded) {
for (Comment c : comments) { for (Comment c : comments) {

View File

@ -703,12 +703,18 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic
if (mCommentsAdapter != null) { if (mCommentsAdapter != null) {
mCommentsAdapter.addComment(comment); mCommentsAdapter.addComment(comment);
} }
if (mPostAdapter != null) {
mPostAdapter.addOneComment();
}
} }
public void addChildComment(Comment comment, String parentFullname, int parentPosition) { public void addChildComment(Comment comment, String parentFullname, int parentPosition) {
if (mCommentsAdapter != null) { if (mCommentsAdapter != null) {
mCommentsAdapter.addChildComment(comment, parentFullname, parentPosition); mCommentsAdapter.addChildComment(comment, parentFullname, parentPosition);
} }
if (mPostAdapter != null) {
mPostAdapter.addOneComment();
}
} }
public void editComment(String commentAuthor, String commentContentMarkdown, int position) { public void editComment(String commentAuthor, String commentContentMarkdown, int position) {

View File

@ -171,15 +171,18 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/> app:layout_constraintBottom_toBottomOf="parent"/>
<ImageView <TextView
android:id="@+id/expand_button_item_post_comment" android:id="@+id/expand_button_item_post_comment"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="8dp" android:gravity="center"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family"
android:background="?actionBarItemBackground" android:background="?actionBarItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:src="@drawable/ic_expand_less_grey_24dp"
android:visibility="gone" android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/save_button_item_post_comment" app:layout_constraintEnd_toStartOf="@+id/save_button_item_post_comment"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"

View File

@ -22,6 +22,18 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:maxLines="1"
android:fontFamily="?attr/font_family"
android:paddingStart="16dp"
android:paddingTop="12dp"
android:paddingEnd="8dp"
android:paddingBottom="12dp"
android:textSize="?attr/font_default" />
<TextView
android:id="@+id/child_count_text_view_item_comment_fully_collapsed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="?attr/font_family" android:fontFamily="?attr/font_family"
android:paddingStart="16dp" android:paddingStart="16dp"
android:paddingTop="12dp" android:paddingTop="12dp"