mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2024-12-25 02:18:23 +01:00
Reimplemented parsing comments using recursion to parse all the child comments. Reimplemented CommentRecyclerView (some methods need proper implementation. Minor bugs fixed.
This commit is contained in:
parent
502cbe02ba
commit
25f2a35d22
BIN
.idea/caches/build_file_checksums.ser
generated
BIN
.idea/caches/build_file_checksums.ser
generated
Binary file not shown.
BIN
.idea/caches/gradle_models.ser
generated
BIN
.idea/caches/gradle_models.ser
generated
Binary file not shown.
@ -61,7 +61,6 @@ dependencies {
|
|||||||
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
|
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
|
||||||
implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'
|
implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'
|
||||||
implementation 'jp.wasabeef:glide-transformations:4.0.0'
|
implementation 'jp.wasabeef:glide-transformations:4.0.0'
|
||||||
implementation 'com.muditsen.multilevelrecyclerview:multilevelview:1.0.0'
|
|
||||||
implementation 'com.google.dagger:dagger:2.17'
|
implementation 'com.google.dagger:dagger:2.17'
|
||||||
annotationProcessor 'com.google.dagger:dagger-compiler:2.17'
|
annotationProcessor 'com.google.dagger:dagger-compiler:2.17'
|
||||||
implementation 'com.jakewharton:butterknife:10.1.0'
|
implementation 'com.jakewharton:butterknife:10.1.0'
|
||||||
|
@ -3,7 +3,6 @@ package ml.docilealligator.infinityforreddit;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
@ -70,7 +69,6 @@ public class CommentActivity extends AppCompatActivity {
|
|||||||
toolbar.setTitle(getString(R.string.comment_activity_label_is_replying));
|
toolbar.setTitle(getString(R.string.comment_activity_label_is_replying));
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.i("fullname", parentFullname);
|
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,14 +3,15 @@ package ml.docilealligator.infinityforreddit;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
import com.multilevelview.models.RecyclerViewItem;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
class CommentData extends RecyclerViewItem implements Parcelable {
|
class CommentData implements Parcelable {
|
||||||
private String id;
|
private String id;
|
||||||
private String fullName;
|
private String fullName;
|
||||||
private String author;
|
private String author;
|
||||||
private String commentTime;
|
private String commentTime;
|
||||||
private String commentContent;
|
private String commentContent;
|
||||||
|
private String parentId;
|
||||||
private int score;
|
private int score;
|
||||||
private int voteType;
|
private int voteType;
|
||||||
private boolean isSubmitter;
|
private boolean isSubmitter;
|
||||||
@ -19,16 +20,217 @@ class CommentData extends RecyclerViewItem implements Parcelable {
|
|||||||
private boolean collapsed;
|
private boolean collapsed;
|
||||||
private boolean hasReply;
|
private boolean hasReply;
|
||||||
private boolean scoreHidden;
|
private boolean scoreHidden;
|
||||||
|
private boolean isExpanded;
|
||||||
|
private ArrayList<CommentData> children;
|
||||||
|
private ArrayList<String> moreChildrenIds;
|
||||||
|
|
||||||
CommentData(String id, String fullName, String author, String commentTime, String commentContent,
|
CommentData(String id, String fullName, String author, String commentTime, String commentContent,
|
||||||
int score, boolean isSubmitter, String permalink, int depth, boolean collapsed,
|
String parentId, int score, boolean isSubmitter, String permalink, int depth,
|
||||||
boolean hasReply, boolean scoreHidden) {
|
boolean collapsed, boolean hasReply, boolean scoreHidden) {
|
||||||
|
this.id = id;
|
||||||
|
this.fullName = fullName;
|
||||||
|
this.author = author;
|
||||||
|
this.commentTime = commentTime;
|
||||||
|
this.commentContent = commentContent;
|
||||||
|
this.parentId = parentId;
|
||||||
|
this.score = score;
|
||||||
|
this.isSubmitter = isSubmitter;
|
||||||
|
this.permalink = RedditUtils.API_BASE_URI + permalink;
|
||||||
|
this.depth = depth;
|
||||||
|
this.collapsed = collapsed;
|
||||||
|
this.hasReply = hasReply;
|
||||||
|
this.scoreHidden = scoreHidden;
|
||||||
|
this.isExpanded = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CommentData(Parcel in) {
|
||||||
|
id = in.readString();
|
||||||
|
fullName = in.readString();
|
||||||
|
author = in.readString();
|
||||||
|
commentTime = in.readString();
|
||||||
|
commentContent = in.readString();
|
||||||
|
parentId = in.readString();
|
||||||
|
score = in.readInt();
|
||||||
|
voteType = in.readInt();
|
||||||
|
isSubmitter = in.readByte() != 0;
|
||||||
|
permalink = in.readString();
|
||||||
|
depth = in.readInt();
|
||||||
|
collapsed = in.readByte() != 0;
|
||||||
|
hasReply = in.readByte() != 0;
|
||||||
|
scoreHidden = in.readByte() != 0;
|
||||||
|
isExpanded = in.readByte() != 0;
|
||||||
|
in.readStringList(moreChildrenIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Creator<CommentData> CREATOR = new Creator<CommentData>() {
|
||||||
|
@Override
|
||||||
|
public CommentData createFromParcel(Parcel in) {
|
||||||
|
return new CommentData(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommentData[] newArray(int size) {
|
||||||
|
return new CommentData[size];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFullName() {
|
||||||
|
return fullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAuthor() {
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCommentTime() {
|
||||||
|
return commentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCommentContent() {
|
||||||
|
return commentContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParentId() {
|
||||||
|
return parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentId(String parentId) {
|
||||||
|
this.parentId = parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getScore() {
|
||||||
|
return score;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScore(int score) {
|
||||||
|
this.score = score;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSubmitter() {
|
||||||
|
return isSubmitter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPermalink() {
|
||||||
|
return permalink;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDepth() {
|
||||||
|
return depth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCollapsed() {
|
||||||
|
return collapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasReply() {
|
||||||
|
return hasReply;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHasReply(boolean hasReply) {
|
||||||
|
this.hasReply = hasReply;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isScoreHidden() {
|
||||||
|
return scoreHidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExpanded() {
|
||||||
|
return isExpanded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExpanded(boolean isExpanded) {
|
||||||
|
this.isExpanded = isExpanded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVoteType() {
|
||||||
|
return voteType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVoteType(int voteType) {
|
||||||
|
this.voteType = voteType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<CommentData> getChildren() {
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChildren(ArrayList<CommentData> children) {
|
||||||
|
this.children = children;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addChildren(ArrayList<CommentData> moreChildren) {
|
||||||
|
if(children == null) {
|
||||||
|
setChildren(moreChildren);
|
||||||
|
} else {
|
||||||
|
children.addAll(moreChildren);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<String> getMoreChildrenIds() {
|
||||||
|
return moreChildrenIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreChildrenIds(ArrayList<String> moreChildrenIds) {
|
||||||
|
this.moreChildrenIds = moreChildrenIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int describeContents() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToParcel(Parcel parcel, int i) {
|
||||||
|
parcel.writeString(id);
|
||||||
|
parcel.writeString(fullName);
|
||||||
|
parcel.writeString(author);
|
||||||
|
parcel.writeString(commentTime);
|
||||||
|
parcel.writeString(commentContent);
|
||||||
|
parcel.writeString(parentId);
|
||||||
|
parcel.writeInt(score);
|
||||||
|
parcel.writeInt(voteType);
|
||||||
|
parcel.writeByte((byte) (isSubmitter ? 1 : 0));
|
||||||
|
parcel.writeString(permalink);
|
||||||
|
parcel.writeInt(depth);
|
||||||
|
parcel.writeByte((byte) (collapsed ? 1 : 0));
|
||||||
|
parcel.writeByte((byte) (hasReply ? 1 : 0));
|
||||||
|
parcel.writeByte((byte) (scoreHidden ? 1 : 0));
|
||||||
|
parcel.writeByte((byte) (isExpanded ? 1 : 0));
|
||||||
|
parcel.writeStringList(moreChildrenIds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*class CommentData extends RecyclerViewItem implements Parcelable {
|
||||||
|
private String id;
|
||||||
|
private String fullName;
|
||||||
|
private String author;
|
||||||
|
private String commentTime;
|
||||||
|
private String commentContent;
|
||||||
|
private String parentId;
|
||||||
|
private int score;
|
||||||
|
private int voteType;
|
||||||
|
private boolean isSubmitter;
|
||||||
|
private String permalink;
|
||||||
|
private int depth;
|
||||||
|
private boolean collapsed;
|
||||||
|
private boolean hasReply;
|
||||||
|
private boolean scoreHidden;
|
||||||
|
private ArrayList<String> moreChildrenIds;
|
||||||
|
|
||||||
|
CommentData(String id, String fullName, String author, String commentTime, String commentContent,
|
||||||
|
String parentId, int score, boolean isSubmitter, String permalink, int depth,
|
||||||
|
boolean collapsed, boolean hasReply, boolean scoreHidden) {
|
||||||
super(depth);
|
super(depth);
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.fullName = fullName;
|
this.fullName = fullName;
|
||||||
this.author = author;
|
this.author = author;
|
||||||
this.commentTime = commentTime;
|
this.commentTime = commentTime;
|
||||||
this.commentContent = commentContent;
|
this.commentContent = commentContent;
|
||||||
|
this.parentId = parentId;
|
||||||
this.score = score;
|
this.score = score;
|
||||||
this.isSubmitter = isSubmitter;
|
this.isSubmitter = isSubmitter;
|
||||||
this.permalink = RedditUtils.API_BASE_URI + permalink;
|
this.permalink = RedditUtils.API_BASE_URI + permalink;
|
||||||
@ -45,6 +247,7 @@ class CommentData extends RecyclerViewItem implements Parcelable {
|
|||||||
author = in.readString();
|
author = in.readString();
|
||||||
commentTime = in.readString();
|
commentTime = in.readString();
|
||||||
commentContent = in.readString();
|
commentContent = in.readString();
|
||||||
|
parentId = in.readString();
|
||||||
score = in.readInt();
|
score = in.readInt();
|
||||||
voteType = in.readInt();
|
voteType = in.readInt();
|
||||||
isSubmitter = in.readByte() != 0;
|
isSubmitter = in.readByte() != 0;
|
||||||
@ -53,6 +256,7 @@ class CommentData extends RecyclerViewItem implements Parcelable {
|
|||||||
collapsed = in.readByte() != 0;
|
collapsed = in.readByte() != 0;
|
||||||
hasReply = in.readByte() != 0;
|
hasReply = in.readByte() != 0;
|
||||||
scoreHidden = in.readByte() != 0;
|
scoreHidden = in.readByte() != 0;
|
||||||
|
in.readStringList(moreChildrenIds);
|
||||||
super.setLevel(depth);
|
super.setLevel(depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,6 +292,14 @@ class CommentData extends RecyclerViewItem implements Parcelable {
|
|||||||
return commentContent;
|
return commentContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getParentId() {
|
||||||
|
return parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentId(String parentId) {
|
||||||
|
this.parentId = parentId;
|
||||||
|
}
|
||||||
|
|
||||||
public int getScore() {
|
public int getScore() {
|
||||||
return score;
|
return score;
|
||||||
}
|
}
|
||||||
@ -132,6 +344,14 @@ class CommentData extends RecyclerViewItem implements Parcelable {
|
|||||||
this.voteType = voteType;
|
this.voteType = voteType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ArrayList<String> getMoreChildrenIds() {
|
||||||
|
return moreChildrenIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMoreChildrenIds(ArrayList<String> moreChildrenIds) {
|
||||||
|
this.moreChildrenIds = moreChildrenIds;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
return 0;
|
return 0;
|
||||||
@ -144,6 +364,7 @@ class CommentData extends RecyclerViewItem implements Parcelable {
|
|||||||
parcel.writeString(author);
|
parcel.writeString(author);
|
||||||
parcel.writeString(commentTime);
|
parcel.writeString(commentTime);
|
||||||
parcel.writeString(commentContent);
|
parcel.writeString(commentContent);
|
||||||
|
parcel.writeString(parentId);
|
||||||
parcel.writeInt(score);
|
parcel.writeInt(score);
|
||||||
parcel.writeInt(voteType);
|
parcel.writeInt(voteType);
|
||||||
parcel.writeByte((byte) (isSubmitter ? 1 : 0));
|
parcel.writeByte((byte) (isSubmitter ? 1 : 0));
|
||||||
@ -152,5 +373,6 @@ class CommentData extends RecyclerViewItem implements Parcelable {
|
|||||||
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));
|
||||||
|
parcel.writeStringList(moreChildrenIds);
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
@ -5,6 +5,7 @@ import android.content.Intent;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.graphics.ColorFilter;
|
import android.graphics.ColorFilter;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Handler;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@ -18,12 +19,7 @@ import androidx.browser.customtabs.CustomTabsIntent;
|
|||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.multilevelview.MultiLevelAdapter;
|
|
||||||
import com.multilevelview.MultiLevelRecyclerView;
|
|
||||||
import com.multilevelview.models.RecyclerViewItem;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
@ -32,42 +28,59 @@ import retrofit2.Retrofit;
|
|||||||
import ru.noties.markwon.SpannableConfiguration;
|
import ru.noties.markwon.SpannableConfiguration;
|
||||||
import ru.noties.markwon.view.MarkwonView;
|
import ru.noties.markwon.view.MarkwonView;
|
||||||
|
|
||||||
class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
|
class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
private Activity mActivity;
|
private Activity mActivity;
|
||||||
private Retrofit mRetrofit;
|
private Retrofit mRetrofit;
|
||||||
private Retrofit mOauthRetrofit;
|
private Retrofit mOauthRetrofit;
|
||||||
private SharedPreferences mSharedPreferences;
|
private SharedPreferences mSharedPreferences;
|
||||||
private ArrayList<CommentData> mCommentData;
|
private ArrayList<CommentData> mCommentData;
|
||||||
private MultiLevelRecyclerView mMultiLevelRecyclerView;
|
private RecyclerView mRecyclerView;
|
||||||
private String subredditNamePrefixed;
|
private String mSubredditNamePrefixed;
|
||||||
private String article;
|
private String mArticle;
|
||||||
private Locale locale;
|
private Locale mLocale;
|
||||||
|
|
||||||
CommentMultiLevelRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit,
|
private ArrayList<CommentData> mVisibleComments;
|
||||||
|
|
||||||
|
CommentRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit,
|
||||||
SharedPreferences sharedPreferences, ArrayList<CommentData> commentData,
|
SharedPreferences sharedPreferences, ArrayList<CommentData> commentData,
|
||||||
MultiLevelRecyclerView multiLevelRecyclerView,
|
RecyclerView recyclerView,
|
||||||
String subredditNamePrefixed, String article, Locale locale) {
|
String subredditNamePrefixed, String article, Locale locale) {
|
||||||
super(commentData);
|
|
||||||
mActivity = activity;
|
mActivity = activity;
|
||||||
mRetrofit = retrofit;
|
mRetrofit = retrofit;
|
||||||
mOauthRetrofit = oauthRetrofit;
|
mOauthRetrofit = oauthRetrofit;
|
||||||
mSharedPreferences = sharedPreferences;
|
mSharedPreferences = sharedPreferences;
|
||||||
mCommentData = commentData;
|
mCommentData = commentData;
|
||||||
mMultiLevelRecyclerView = multiLevelRecyclerView;
|
mRecyclerView = recyclerView;
|
||||||
this.subredditNamePrefixed = subredditNamePrefixed;
|
mSubredditNamePrefixed = subredditNamePrefixed;
|
||||||
this.article = article;
|
mArticle = article;
|
||||||
this.locale = locale;
|
mLocale = locale;
|
||||||
|
mVisibleComments = new ArrayList<>();
|
||||||
|
|
||||||
|
new Handler().post(() -> {
|
||||||
|
makeChildrenVisible(commentData, mVisibleComments);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void makeChildrenVisible(ArrayList<CommentData> comments, ArrayList<CommentData> visibleComments) {
|
||||||
|
for(CommentData c : comments) {
|
||||||
|
visibleComments.add(c);
|
||||||
|
if(c.hasReply()) {
|
||||||
|
c.setExpanded(true);
|
||||||
|
makeChildrenVisible(c.getChildren(), visibleComments);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false));
|
return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
|
||||||
final CommentData commentItem = mCommentData.get(position);
|
final CommentData commentItem = mVisibleComments.get(position);
|
||||||
|
|
||||||
String authorPrefixed = "u/" + commentItem.getAuthor();
|
String authorPrefixed = "u/" + commentItem.getAuthor();
|
||||||
((CommentViewHolder) holder).authorTextView.setText(authorPrefixed);
|
((CommentViewHolder) holder).authorTextView.setText(authorPrefixed);
|
||||||
@ -78,6 +91,7 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
|
|||||||
});
|
});
|
||||||
|
|
||||||
((CommentViewHolder) holder).commentTimeTextView.setText(commentItem.getCommentTime());
|
((CommentViewHolder) holder).commentTimeTextView.setText(commentItem.getCommentTime());
|
||||||
|
|
||||||
SpannableConfiguration spannableConfiguration = SpannableConfiguration.builder(mActivity).linkResolver((view, link) -> {
|
SpannableConfiguration spannableConfiguration = SpannableConfiguration.builder(mActivity).linkResolver((view, link) -> {
|
||||||
if (link.startsWith("/u/") || link.startsWith("u/")) {
|
if (link.startsWith("/u/") || link.startsWith("u/")) {
|
||||||
Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
|
Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
|
||||||
@ -101,35 +115,49 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
|
|||||||
((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(commentItem.getScore()));
|
((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(commentItem.getScore()));
|
||||||
|
|
||||||
((CommentViewHolder) holder).verticalBlock.getLayoutParams().width = commentItem.getDepth() * 16;
|
((CommentViewHolder) holder).verticalBlock.getLayoutParams().width = commentItem.getDepth() * 16;
|
||||||
if (commentItem.hasReply()) {
|
|
||||||
setExpandButton(((CommentViewHolder) holder).expandButton, commentItem.isExpanded());
|
|
||||||
}
|
|
||||||
|
|
||||||
((CommentViewHolder) holder).shareButton.setOnClickListener(new View.OnClickListener() {
|
((CommentViewHolder) holder).shareButton.setOnClickListener(view -> {
|
||||||
@Override
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
public void onClick(View view) {
|
intent.setType("text/plain");
|
||||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
String extraText = commentItem.getPermalink();
|
||||||
intent.setType("text/plain");
|
intent.putExtra(Intent.EXTRA_TEXT, extraText);
|
||||||
String extraText = commentItem.getPermalink();
|
mActivity.startActivity(Intent.createChooser(intent, "Share"));
|
||||||
intent.putExtra(Intent.EXTRA_TEXT, extraText);
|
|
||||||
mActivity.startActivity(Intent.createChooser(intent, "Share"));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (commentItem.hasReply()) {
|
||||||
|
if(commentItem.isExpanded()) {
|
||||||
|
((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_less_black_20dp);
|
||||||
|
} else {
|
||||||
|
((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_more_black_20dp);
|
||||||
|
}
|
||||||
|
((CommentViewHolder) holder).expandButton.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
((CommentViewHolder) holder).expandButton.setOnClickListener(view -> {
|
((CommentViewHolder) holder).expandButton.setOnClickListener(view -> {
|
||||||
if (commentItem.hasChildren() && commentItem.getChildren().size() > 0) {
|
if(commentItem.isExpanded()) {
|
||||||
mMultiLevelRecyclerView.toggleItemsGroup(holder.getAdapterPosition());
|
collapseChildren(holder.getAdapterPosition());
|
||||||
setExpandButton(((CommentViewHolder) holder).expandButton, commentItem.isExpanded());
|
((CommentViewHolder) holder).expandButton
|
||||||
|
.setImageResource(R.drawable.ic_expand_more_black_20dp);
|
||||||
|
} else {
|
||||||
|
expandChildren(holder.getAdapterPosition());
|
||||||
|
commentItem.setExpanded(true);
|
||||||
|
((CommentViewHolder) holder).expandButton
|
||||||
|
.setImageResource(R.drawable.ic_expand_less_black_20dp);
|
||||||
|
}
|
||||||
|
/*if (commentItem.hasReply() && commentItem.getChildren().size() > 0) {
|
||||||
|
collapseChildren(holder.getAdapterPosition());
|
||||||
|
((CommentViewHolder) holder).expandButton
|
||||||
|
.setImageResource(R.drawable.ic_expand_more_black_20dp);
|
||||||
} else {
|
} else {
|
||||||
((CommentViewHolder) holder).loadMoreCommentsProgressBar.setVisibility(View.VISIBLE);
|
((CommentViewHolder) holder).loadMoreCommentsProgressBar.setVisibility(View.VISIBLE);
|
||||||
FetchComment.fetchAllComment(mRetrofit, subredditNamePrefixed, article, commentItem.getId(),
|
FetchComment.fetchAllComment(mRetrofit, mSubredditNamePrefixed, article, commentItem.getId(),
|
||||||
locale, false, commentItem.getDepth(), new FetchComment.FetchAllCommentListener() {
|
locale, false, commentItem.getDepth(), new FetchComment.FetchAllCommentListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onFetchAllCommentSuccess(List<?> commentData) {
|
public void onFetchAllCommentSuccess(List<?> commentData) {
|
||||||
commentItem.addChildren((List<RecyclerViewItem>) commentData);
|
commentItem.addChildren((ArrayList<CommentData>) commentData);
|
||||||
((CommentViewHolder) holder).loadMoreCommentsProgressBar
|
((CommentViewHolder) holder).loadMoreCommentsProgressBar
|
||||||
.setVisibility(View.GONE);
|
.setVisibility(View.GONE);
|
||||||
mMultiLevelRecyclerView.toggleItemsGroup(holder.getAdapterPosition());
|
expandChildren(holder.getAdapterPosition());
|
||||||
((CommentViewHolder) holder).expandButton
|
((CommentViewHolder) holder).expandButton
|
||||||
.setImageResource(R.drawable.ic_expand_less_black_20dp);
|
.setImageResource(R.drawable.ic_expand_less_black_20dp);
|
||||||
}
|
}
|
||||||
@ -140,7 +168,7 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
|
|||||||
.setVisibility(View.GONE);
|
.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}*/
|
||||||
});
|
});
|
||||||
|
|
||||||
((CommentViewHolder) holder).replyButton.setOnClickListener(view -> {
|
((CommentViewHolder) holder).replyButton.setOnClickListener(view -> {
|
||||||
@ -149,6 +177,7 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
|
|||||||
intent.putExtra(CommentActivity.EXTRA_COMMENT_PARENT_TEXT_KEY, commentItem.getCommentContent());
|
intent.putExtra(CommentActivity.EXTRA_COMMENT_PARENT_TEXT_KEY, commentItem.getCommentContent());
|
||||||
intent.putExtra(CommentActivity.EXTRA_PARENT_FULLNAME_KEY, commentItem.getFullName());
|
intent.putExtra(CommentActivity.EXTRA_PARENT_FULLNAME_KEY, commentItem.getFullName());
|
||||||
intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, true);
|
intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, true);
|
||||||
|
intent.putExtra(CommentActivity.EXTRA_PARENT_POSITION_KEY, holder.getAdapterPosition());
|
||||||
mActivity.startActivityForResult(intent, CommentActivity.WRITE_COMMENT_REQUEST_CODE);
|
mActivity.startActivityForResult(intent, CommentActivity.WRITE_COMMENT_REQUEST_CODE);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -264,6 +293,58 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void expandChildren(int position) {
|
||||||
|
mVisibleComments.get(position).setExpanded(true);
|
||||||
|
ArrayList<CommentData> children = mVisibleComments.get(position).getChildren();
|
||||||
|
if(children != null && children.size() > 0) {
|
||||||
|
mVisibleComments.addAll(position + 1, children);
|
||||||
|
for(int i = position + 1; i <= position + children.size(); i++) {
|
||||||
|
mVisibleComments.get(i).setExpanded(false);
|
||||||
|
}
|
||||||
|
notifyItemRangeInserted(position + 1, children.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void collapseChildren(int position) {
|
||||||
|
mVisibleComments.get(position).setExpanded(false);
|
||||||
|
int depth = mVisibleComments.get(position).getDepth();
|
||||||
|
int allChildrenSize = 0;
|
||||||
|
for(int i = position + 1; i < mVisibleComments.size(); i++) {
|
||||||
|
if(mVisibleComments.get(i).getDepth() > depth) {
|
||||||
|
allChildrenSize++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mVisibleComments.subList(position + 1, position + 1 + allChildrenSize).clear();
|
||||||
|
notifyItemRangeRemoved(position + 1, allChildrenSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void addComments(ArrayList<CommentData> comments) {
|
||||||
|
int sizeBefore = mVisibleComments.size();
|
||||||
|
mVisibleComments.addAll(comments);
|
||||||
|
notifyItemRangeInserted(sizeBefore, comments.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
//Need proper implementation
|
||||||
|
void addComment(CommentData comment) {
|
||||||
|
mCommentData.add(0, comment);
|
||||||
|
notifyItemInserted(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Need proper implementation
|
||||||
|
void addChildComment(CommentData comment, int parentPosition) {
|
||||||
|
ArrayList<CommentData> childComments = mCommentData.get(parentPosition).getChildren();
|
||||||
|
if(childComments == null) {
|
||||||
|
childComments = new ArrayList<>();
|
||||||
|
}
|
||||||
|
childComments.add(0, comment);
|
||||||
|
mCommentData.get(parentPosition).addChildren(childComments);
|
||||||
|
mCommentData.get(parentPosition).setHasReply(true);
|
||||||
|
notifyItemChanged(parentPosition);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||||
if (holder instanceof CommentViewHolder) {
|
if (holder instanceof CommentViewHolder) {
|
||||||
@ -272,33 +353,9 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void addComments(ArrayList<CommentData> comments) {
|
@Override
|
||||||
int sizeBefore = mCommentData.size();
|
public int getItemCount() {
|
||||||
mCommentData.addAll(comments);
|
return mVisibleComments.size();
|
||||||
notifyItemRangeInserted(sizeBefore, mCommentData.size() - sizeBefore);
|
|
||||||
}
|
|
||||||
|
|
||||||
void addComment(CommentData comment) {
|
|
||||||
mCommentData.add(0, comment);
|
|
||||||
notifyItemInserted(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void addChildComment(CommentData comment, int parentPosition) {
|
|
||||||
List<RecyclerViewItem> childComments = mCommentData.get(parentPosition).getChildren();
|
|
||||||
if(childComments == null) {
|
|
||||||
childComments = new ArrayList<>();
|
|
||||||
}
|
|
||||||
childComments.add(0, comment);
|
|
||||||
mCommentData.get(parentPosition).addChildren(childComments);
|
|
||||||
mCommentData.get(parentPosition).setHasReply(true);
|
|
||||||
notifyItemChanged(parentPosition);
|
|
||||||
mMultiLevelRecyclerView.toggleItemsGroup(parentPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setExpandButton(ImageView expandButton, boolean isExpanded) {
|
|
||||||
// set the icon based on the current state
|
|
||||||
expandButton.setVisibility(View.VISIBLE);
|
|
||||||
expandButton.setImageResource(isExpanded ? R.drawable.ic_expand_less_black_20dp : R.drawable.ic_expand_more_black_20dp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CommentViewHolder extends RecyclerView.ViewHolder {
|
class CommentViewHolder extends RecyclerView.ViewHolder {
|
@ -5,7 +5,6 @@ import android.util.Log;
|
|||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import retrofit2.Call;
|
import retrofit2.Call;
|
||||||
@ -15,18 +14,18 @@ import retrofit2.Retrofit;
|
|||||||
|
|
||||||
class FetchComment {
|
class FetchComment {
|
||||||
interface FetchCommentListener {
|
interface FetchCommentListener {
|
||||||
void onFetchCommentSuccess(List<?> commentsData,
|
void onFetchCommentSuccess(ArrayList<CommentData> commentsData,
|
||||||
String parentId, ArrayList<String> children);
|
String parentId, ArrayList<String> children);
|
||||||
void onFetchCommentFailed();
|
void onFetchCommentFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FetchMoreCommentListener {
|
interface FetchMoreCommentListener {
|
||||||
void onFetchMoreCommentSuccess(List<?> commentsData, int childrenStartingIndex);
|
void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData, int childrenStartingIndex);
|
||||||
void onFetchMoreCommentFailed();
|
void onFetchMoreCommentFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
interface FetchAllCommentListener {
|
interface FetchAllCommentListener {
|
||||||
void onFetchAllCommentSuccess(List<?> commentData);
|
void onFetchAllCommentSuccess(ArrayList<CommentData> commentData);
|
||||||
void onFetchAllCommentFailed();
|
void onFetchAllCommentFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,10 +42,10 @@ class FetchComment {
|
|||||||
locale, isPost, parentDepth,
|
locale, isPost, parentDepth,
|
||||||
new ParseComment.ParseCommentListener() {
|
new ParseComment.ParseCommentListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onParseCommentSuccess(List<?> commentData,
|
public void onParseCommentSuccess(ArrayList<CommentData> commentData,
|
||||||
String parentId, ArrayList<String> children) {
|
String parentId, ArrayList<String> moreChildrenIds) {
|
||||||
fetchCommentListener.onFetchCommentSuccess(commentData, parentId,
|
fetchCommentListener.onFetchCommentSuccess(commentData, parentId,
|
||||||
children);
|
moreChildrenIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -104,8 +103,8 @@ class FetchComment {
|
|||||||
ParseComment.parseMoreComment(response.body(), new ArrayList<>(), locale,
|
ParseComment.parseMoreComment(response.body(), new ArrayList<>(), locale,
|
||||||
0, new ParseComment.ParseCommentListener() {
|
0, new ParseComment.ParseCommentListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onParseCommentSuccess(List<?> commentData, String parentId,
|
public void onParseCommentSuccess(ArrayList<CommentData> commentData, String parentId,
|
||||||
ArrayList<String> children) {
|
ArrayList<String> moreChildrenIds) {
|
||||||
fetchMoreCommentListener.onFetchMoreCommentSuccess(commentData, startingIndex + 100);
|
fetchMoreCommentListener.onFetchMoreCommentSuccess(commentData, startingIndex + 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,12 +154,12 @@ class FetchComment {
|
|||||||
fetchComment(retrofit, subredditNamePrefixed, article, comment, locale, isPost, parentDepth,
|
fetchComment(retrofit, subredditNamePrefixed, article, comment, locale, isPost, parentDepth,
|
||||||
new FetchCommentListener() {
|
new FetchCommentListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onFetchCommentSuccess(List<?> commentsData, String parentId, ArrayList<String> children) {
|
public void onFetchCommentSuccess(ArrayList<CommentData> commentsData, String parentId, ArrayList<String> children) {
|
||||||
if(children.size() != 0) {
|
if(children.size() != 0) {
|
||||||
fetchMoreComment(retrofit, subredditNamePrefixed, parentId, children,
|
fetchMoreComment(retrofit, subredditNamePrefixed, parentId, children,
|
||||||
0, locale, new FetchMoreCommentListener() {
|
0, locale, new FetchMoreCommentListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onFetchMoreCommentSuccess(List<?> commentsData,
|
public void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData,
|
||||||
int childrenStartingIndex) {
|
int childrenStartingIndex) {
|
||||||
((ArrayList<CommentData>) commentsData).addAll((ArrayList<CommentData>) commentsData);
|
((ArrayList<CommentData>) commentsData).addAll((ArrayList<CommentData>) commentsData);
|
||||||
fetchAllCommentListener.onFetchAllCommentSuccess(commentsData);
|
fetchAllCommentListener.onFetchAllCommentSuccess(commentsData);
|
||||||
|
@ -3,6 +3,8 @@ package ml.docilealligator.infinityforreddit;
|
|||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
@ -10,12 +12,11 @@ import org.json.JSONObject;
|
|||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
class ParseComment {
|
class ParseComment {
|
||||||
interface ParseCommentListener {
|
interface ParseCommentListener {
|
||||||
void onParseCommentSuccess(List<?> commentData, String parentId, ArrayList<String> children);
|
void onParseCommentSuccess(ArrayList<CommentData> commentData, String parentId, ArrayList<String> moreChildrenIds);
|
||||||
void onParseCommentFailed();
|
void onParseCommentFailed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,7 +34,8 @@ class ParseComment {
|
|||||||
boolean isPost, int parentDepth, ParseCommentListener parseCommentListener) {
|
boolean isPost, int parentDepth, ParseCommentListener parseCommentListener) {
|
||||||
try {
|
try {
|
||||||
JSONArray childrenArray = new JSONArray(response);
|
JSONArray childrenArray = new JSONArray(response);
|
||||||
|
String parentId = childrenArray.getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY)
|
||||||
|
.getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.NAME_KEY);
|
||||||
if(isPost) {
|
if(isPost) {
|
||||||
childrenArray = childrenArray.getJSONObject(1).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
|
childrenArray = childrenArray.getJSONObject(1).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
|
||||||
} else {
|
} else {
|
||||||
@ -41,7 +43,8 @@ class ParseComment {
|
|||||||
.getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONObject(JSONUtils.REPLIES_KEY)
|
.getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONObject(JSONUtils.REPLIES_KEY)
|
||||||
.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
|
.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
|
||||||
}
|
}
|
||||||
new ParseCommentAsyncTask(childrenArray, commentData, locale, parentDepth, parseCommentListener).execute();
|
|
||||||
|
new ParseCommentAsyncTask(childrenArray, commentData, locale, parentId, parentDepth, parseCommentListener).execute();
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
if(e.getMessage() != null) {
|
if(e.getMessage() != null) {
|
||||||
@ -59,7 +62,7 @@ class ParseComment {
|
|||||||
int parentDepth, ParseCommentListener parseCommentListener) {
|
int parentDepth, ParseCommentListener parseCommentListener) {
|
||||||
try {
|
try {
|
||||||
JSONArray childrenArray = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
|
JSONArray childrenArray = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
|
||||||
new ParseCommentAsyncTask(childrenArray, commentData, locale, parentDepth, parseCommentListener).execute();
|
new ParseCommentAsyncTask(childrenArray, commentData, locale, null, parentDepth, parseCommentListener).execute();
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
if(e.getMessage() != null) {
|
if(e.getMessage() != null) {
|
||||||
@ -78,20 +81,21 @@ class ParseComment {
|
|||||||
private JSONArray comments;
|
private JSONArray comments;
|
||||||
private ArrayList<CommentData> commentData;
|
private ArrayList<CommentData> commentData;
|
||||||
private ArrayList<CommentData> newcommentData;
|
private ArrayList<CommentData> newcommentData;
|
||||||
private ArrayList<String> children;
|
private ArrayList<String> moreChildrenIds;
|
||||||
private Locale locale;
|
private Locale locale;
|
||||||
|
private String parentId;
|
||||||
private int parentDepth;
|
private int parentDepth;
|
||||||
private ParseCommentListener parseCommentListener;
|
private ParseCommentListener parseCommentListener;
|
||||||
private boolean parseFailed;
|
private boolean parseFailed;
|
||||||
private String parentId;
|
|
||||||
|
|
||||||
ParseCommentAsyncTask(JSONArray comments, ArrayList<CommentData> commentData, Locale locale,
|
ParseCommentAsyncTask(JSONArray comments, ArrayList<CommentData> commentData, Locale locale,
|
||||||
int parentDepth, ParseCommentListener parseCommentListener){
|
@Nullable String parentId, int parentDepth, ParseCommentListener parseCommentListener){
|
||||||
this.comments = comments;
|
this.comments = comments;
|
||||||
this.commentData = commentData;
|
this.commentData = commentData;
|
||||||
newcommentData = new ArrayList<>();
|
newcommentData = new ArrayList<>();
|
||||||
children = new ArrayList<>();
|
moreChildrenIds = new ArrayList<>();
|
||||||
this.locale = locale;
|
this.locale = locale;
|
||||||
|
this.parentId = parentId;
|
||||||
this.parentDepth = parentDepth;
|
this.parentDepth = parentDepth;
|
||||||
parseFailed = false;
|
parseFailed = false;
|
||||||
this.parseCommentListener = parseCommentListener;
|
this.parseCommentListener = parseCommentListener;
|
||||||
@ -100,32 +104,7 @@ class ParseComment {
|
|||||||
@Override
|
@Override
|
||||||
protected Void doInBackground(Void... voids) {
|
protected Void doInBackground(Void... voids) {
|
||||||
try {
|
try {
|
||||||
int actualCommentLength;
|
parseCommentRecursion(comments, newcommentData, moreChildrenIds, parentDepth, locale);
|
||||||
|
|
||||||
if(comments.length() == 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject more = comments.getJSONObject(comments.length() - 1).getJSONObject(JSONUtils.DATA_KEY);
|
|
||||||
|
|
||||||
//Maybe children contain only comments and no more info
|
|
||||||
if(more.has(JSONUtils.COUNT_KEY)) {
|
|
||||||
JSONArray childrenArray = more.getJSONArray(JSONUtils.CHILDREN_KEY);
|
|
||||||
|
|
||||||
parentId = more.getString(JSONUtils.PARENT_ID_KEY);
|
|
||||||
for(int i = 0; i < childrenArray.length(); i++) {
|
|
||||||
children.add(childrenArray.getString(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
actualCommentLength = comments.length() - 1;
|
|
||||||
} else {
|
|
||||||
actualCommentLength = comments.length();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < actualCommentLength; i++) {
|
|
||||||
JSONObject data = comments.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
|
|
||||||
newcommentData.add(parseSingleComment(data, parentDepth, locale));
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
parseFailed = true;
|
parseFailed = true;
|
||||||
if(e.getMessage() != null) {
|
if(e.getMessage() != null) {
|
||||||
@ -139,13 +118,55 @@ class ParseComment {
|
|||||||
protected void onPostExecute(Void aVoid) {
|
protected void onPostExecute(Void aVoid) {
|
||||||
if(!parseFailed) {
|
if(!parseFailed) {
|
||||||
commentData.addAll(newcommentData);
|
commentData.addAll(newcommentData);
|
||||||
parseCommentListener.onParseCommentSuccess(commentData, parentId, children);
|
parseCommentListener.onParseCommentSuccess(commentData, parentId, moreChildrenIds);
|
||||||
} else {
|
} else {
|
||||||
parseCommentListener.onParseCommentFailed();
|
parseCommentListener.onParseCommentFailed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void parseCommentRecursion(JSONArray comments, ArrayList<CommentData> newCommentData,
|
||||||
|
ArrayList<String> moreChildrenIds, int parentDepth, Locale locale) throws JSONException {
|
||||||
|
int actualCommentLength;
|
||||||
|
|
||||||
|
if(comments.length() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject more = comments.getJSONObject(comments.length() - 1).getJSONObject(JSONUtils.DATA_KEY);
|
||||||
|
|
||||||
|
//Maybe moreChildrenIds contain only comments and no more info
|
||||||
|
if(more.has(JSONUtils.COUNT_KEY)) {
|
||||||
|
JSONArray childrenArray = more.getJSONArray(JSONUtils.CHILDREN_KEY);
|
||||||
|
|
||||||
|
for(int i = 0; i < childrenArray.length(); i++) {
|
||||||
|
moreChildrenIds.add(childrenArray.getString(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
actualCommentLength = comments.length() - 1;
|
||||||
|
} else {
|
||||||
|
actualCommentLength = comments.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < actualCommentLength; i++) {
|
||||||
|
JSONObject data = comments.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
|
||||||
|
CommentData singleComment = parseSingleComment(data, parentDepth, locale);
|
||||||
|
|
||||||
|
if(data.get(JSONUtils.REPLIES_KEY) instanceof JSONObject) {
|
||||||
|
JSONArray childrenArray = data.getJSONObject(JSONUtils.REPLIES_KEY)
|
||||||
|
.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
|
||||||
|
ArrayList<CommentData> children = new ArrayList<>();
|
||||||
|
ArrayList<String> nextMoreChildrenIds = new ArrayList<>();
|
||||||
|
parseCommentRecursion(childrenArray, children, nextMoreChildrenIds, singleComment.getDepth(),
|
||||||
|
locale);
|
||||||
|
singleComment.addChildren(children);
|
||||||
|
singleComment.setMoreChildrenIds(nextMoreChildrenIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
newCommentData.add(singleComment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class ParseMoreCommentBasicInfoAsyncTask extends AsyncTask<Void, Void, Void> {
|
private static class ParseMoreCommentBasicInfoAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
private JSONArray children;
|
private JSONArray children;
|
||||||
private StringBuilder commaSeparatedChildren;
|
private StringBuilder commaSeparatedChildren;
|
||||||
@ -229,11 +250,11 @@ class ParseComment {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CommentData parseSingleComment(JSONObject singleCommentData, int parentDepth, Locale locale) throws JSONException {
|
private static CommentData parseSingleComment(JSONObject singleCommentData, int parentDepth, Locale locale) throws JSONException {
|
||||||
String id = singleCommentData.getString(JSONUtils.ID_KEY);
|
String id = singleCommentData.getString(JSONUtils.ID_KEY);
|
||||||
String fullName = singleCommentData.getString(JSONUtils.NAME_KEY);
|
String fullName = singleCommentData.getString(JSONUtils.NAME_KEY);
|
||||||
String author = singleCommentData.getString(JSONUtils.AUTHOR_KEY);
|
String author = singleCommentData.getString(JSONUtils.AUTHOR_KEY);
|
||||||
|
String parentId = singleCommentData.getString(JSONUtils.PARENT_ID_KEY);
|
||||||
boolean isSubmitter = singleCommentData.getBoolean(JSONUtils.IS_SUBMITTER_KEY);
|
boolean isSubmitter = singleCommentData.getBoolean(JSONUtils.IS_SUBMITTER_KEY);
|
||||||
String commentContent = "";
|
String commentContent = "";
|
||||||
if(!singleCommentData.isNull(JSONUtils.BODY_HTML_KEY)) {
|
if(!singleCommentData.isNull(JSONUtils.BODY_HTML_KEY)) {
|
||||||
@ -251,14 +272,14 @@ class ParseComment {
|
|||||||
|
|
||||||
int depth;
|
int depth;
|
||||||
if(singleCommentData.has(JSONUtils.DEPTH_KEY)) {
|
if(singleCommentData.has(JSONUtils.DEPTH_KEY)) {
|
||||||
depth = singleCommentData.getInt(JSONUtils.DEPTH_KEY) + parentDepth;
|
depth = singleCommentData.getInt(JSONUtils.DEPTH_KEY);
|
||||||
} else {
|
} else {
|
||||||
depth = parentDepth;
|
depth = parentDepth;
|
||||||
}
|
}
|
||||||
boolean collapsed = singleCommentData.getBoolean(JSONUtils.COLLAPSED_KEY);
|
boolean collapsed = singleCommentData.getBoolean(JSONUtils.COLLAPSED_KEY);
|
||||||
boolean hasReply = !(singleCommentData.get(JSONUtils.REPLIES_KEY) instanceof String);
|
boolean hasReply = !(singleCommentData.get(JSONUtils.REPLIES_KEY) instanceof String);
|
||||||
|
|
||||||
return new CommentData(id, fullName, author, formattedSubmitTime, commentContent, score,
|
return new CommentData(id, fullName, author, formattedSubmitTime, commentContent, parentId, score,
|
||||||
isSubmitter, permalink, depth, collapsed, hasReply, scoreHidden);
|
isSubmitter, permalink, depth, collapsed, hasReply, scoreHidden);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat;
|
|||||||
import androidx.core.widget.NestedScrollView;
|
import androidx.core.widget.NestedScrollView;
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
import androidx.recyclerview.widget.DividerItemDecoration;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
import com.bumptech.glide.RequestBuilder;
|
import com.bumptech.glide.RequestBuilder;
|
||||||
@ -41,14 +42,12 @@ import com.google.android.material.card.MaterialCardView;
|
|||||||
import com.google.android.material.chip.Chip;
|
import com.google.android.material.chip.Chip;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar;
|
import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar;
|
||||||
import com.multilevelview.MultiLevelRecyclerView;
|
|
||||||
import com.santalu.aspectratioimageview.AspectRatioImageView;
|
import com.santalu.aspectratioimageview.AspectRatioImageView;
|
||||||
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.Subscribe;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
@ -90,7 +89,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
private ArrayList<String> children;
|
private ArrayList<String> children;
|
||||||
private int mChildrenStartingIndex = 0;
|
private int mChildrenStartingIndex = 0;
|
||||||
|
|
||||||
private CommentMultiLevelRecyclerViewAdapter mAdapter;
|
private CommentRecyclerViewAdapter mAdapter;
|
||||||
private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask;
|
private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask;
|
||||||
|
|
||||||
@BindView(R.id.coordinator_layout_view_post_detail) CoordinatorLayout mCoordinatorLayout;
|
@BindView(R.id.coordinator_layout_view_post_detail) CoordinatorLayout mCoordinatorLayout;
|
||||||
@ -120,7 +119,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
@BindView(R.id.share_button_view_post_detail) ImageView mShareButton;
|
@BindView(R.id.share_button_view_post_detail) ImageView mShareButton;
|
||||||
@BindView(R.id.comment_progress_bar_view_post_detail) CircleProgressBar mCommentProgressbar;
|
@BindView(R.id.comment_progress_bar_view_post_detail) CircleProgressBar mCommentProgressbar;
|
||||||
@BindView(R.id.comment_card_view_view_post_detail) MaterialCardView mCommentCardView;
|
@BindView(R.id.comment_card_view_view_post_detail) MaterialCardView mCommentCardView;
|
||||||
@BindView(R.id.recycler_view_view_post_detail) MultiLevelRecyclerView mRecyclerView;
|
@BindView(R.id.recycler_view_view_post_detail) RecyclerView mRecyclerView;
|
||||||
@BindView(R.id.no_comment_wrapper_linear_layout_view_post_detail) LinearLayout mNoCommentWrapperLinearLayout;
|
@BindView(R.id.no_comment_wrapper_linear_layout_view_post_detail) LinearLayout mNoCommentWrapperLinearLayout;
|
||||||
@BindView(R.id.no_comment_image_view_view_post_detail) ImageView mNoCommentImageView;
|
@BindView(R.id.no_comment_image_view_view_post_detail) ImageView mNoCommentImageView;
|
||||||
|
|
||||||
@ -504,23 +503,18 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
FetchComment.fetchComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getId(),
|
FetchComment.fetchComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getId(),
|
||||||
null, mLocale, true, 0, new FetchComment.FetchCommentListener() {
|
null, mLocale, true, 0, new FetchComment.FetchCommentListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onFetchCommentSuccess(List<?> commentsData,
|
public void onFetchCommentSuccess(ArrayList<CommentData> commentsData,
|
||||||
String parentId, ArrayList<String> children) {
|
String parentId, ArrayList<String> children) {
|
||||||
ViewPostDetailActivity.this.children = children;
|
ViewPostDetailActivity.this.children = children;
|
||||||
mCommentProgressbar.setVisibility(View.GONE);
|
mCommentProgressbar.setVisibility(View.GONE);
|
||||||
mCommentsData.addAll((ArrayList<CommentData>) commentsData);
|
mCommentsData.addAll(commentsData);
|
||||||
|
|
||||||
if (mCommentsData.size() > 0) {
|
if (mCommentsData.size() > 0) {
|
||||||
if(mAdapter == null) {
|
if(mAdapter == null) {
|
||||||
mAdapter = new CommentMultiLevelRecyclerViewAdapter(
|
mAdapter = new CommentRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
|
||||||
ViewPostDetailActivity.this, mRetrofit, mOauthRetrofit,
|
mOauthRetrofit, mSharedPreferences, commentsData, mRecyclerView,
|
||||||
mSharedPreferences, mCommentsData,
|
mPost.getSubredditNamePrefixed(), mPost.getId(), mLocale);
|
||||||
mRecyclerView, mPost.getSubredditNamePrefixed(),
|
|
||||||
mPost.getId(), mLocale);
|
|
||||||
mRecyclerView.setAdapter(mAdapter);
|
mRecyclerView.setAdapter(mAdapter);
|
||||||
mRecyclerView.removeItemClickListeners();
|
|
||||||
mRecyclerView.setToggleItemOnClick(false);
|
|
||||||
mRecyclerView.setAccordion(false);
|
|
||||||
|
|
||||||
mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> {
|
mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> {
|
||||||
if(!isLoadingMoreChildren) {
|
if(!isLoadingMoreChildren) {
|
||||||
@ -556,8 +550,8 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
FetchComment.fetchMoreComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getFullName(),
|
FetchComment.fetchMoreComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getFullName(),
|
||||||
children, startingIndex, mLocale, new FetchComment.FetchMoreCommentListener() {
|
children, startingIndex, mLocale, new FetchComment.FetchMoreCommentListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onFetchMoreCommentSuccess(List<?> commentsData, int childrenStartingIndex) {
|
public void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData, int childrenStartingIndex) {
|
||||||
mAdapter.addComments((ArrayList<CommentData>) commentsData);
|
mAdapter.addComments(commentsData);
|
||||||
mChildrenStartingIndex = childrenStartingIndex;
|
mChildrenStartingIndex = childrenStartingIndex;
|
||||||
isLoadingMoreChildren = false;
|
isLoadingMoreChildren = false;
|
||||||
}
|
}
|
||||||
@ -678,7 +672,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
case R.id.action_refresh_view_post_detail_activity:
|
case R.id.action_refresh_view_post_detail_activity:
|
||||||
refresh();
|
refresh();
|
||||||
|
@ -319,7 +319,12 @@
|
|||||||
android:textColor="@color/primaryTextColor"
|
android:textColor="@color/primaryTextColor"
|
||||||
android:textSize="18sp" />
|
android:textSize="18sp" />
|
||||||
|
|
||||||
<com.multilevelview.MultiLevelRecyclerView
|
<!--<com.multilevelview.MultiLevelRecyclerView
|
||||||
|
android:id="@+id/recycler_view_view_post_detail"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />-->
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/recycler_view_view_post_detail"
|
android:id="@+id/recycler_view_view_post_detail"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content" />
|
||||||
|
@ -107,6 +107,7 @@
|
|||||||
android:layout_toStartOf="@id/share_button_item_post_comment"
|
android:layout_toStartOf="@id/share_button_item_post_comment"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
|
android:src="@drawable/ic_expand_less_black_20dp"
|
||||||
android:tint="@android:color/tab_indicator_text"
|
android:tint="@android:color/tab_indicator_text"
|
||||||
android:background="?actionBarItemBackground"
|
android:background="?actionBarItemBackground"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
|
Loading…
Reference in New Issue
Block a user