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

View File

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

View File

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

View File

@ -135,12 +135,24 @@ public class ParseComment {
parseCommentRecursion(childrenArray, children, nextMoreChildrenFullnames, singleComment.getDepth());
singleComment.addChildren(children);
singleComment.setMoreChildrenFullnames(nextMoreChildrenFullnames);
singleComment.setChildCount(getChildCount(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,
boolean setExpanded) {
for (Comment c : comments) {

View File

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

View File

@ -171,15 +171,18 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<ImageView
<TextView
android:id="@+id/expand_button_item_post_comment"
android:layout_width="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:clickable="true"
android:focusable="true"
android:src="@drawable/ic_expand_less_grey_24dp"
android:visibility="gone"
app:layout_constraintEnd_toStartOf="@+id/save_button_item_post_comment"
app:layout_constraintTop_toTopOf="parent"

View File

@ -22,6 +22,18 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
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:paddingStart="16dp"
android:paddingTop="12dp"