diff options
author | Alex Ning <chineseperson5@gmail.com> | 2019-06-22 14:20:37 +0000 |
---|---|---|
committer | Alex Ning <chineseperson5@gmail.com> | 2019-06-22 14:20:37 +0000 |
commit | 9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5 (patch) | |
tree | b2b89e2ee102c07dc0f53d7640fd1db4ec6cbd37 | |
parent | 724d3181e22a54de77ccf513dec0c19ddcfb8024 (diff) | |
download | infinity-for-reddit-9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5.tar infinity-for-reddit-9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5.tar.gz infinity-for-reddit-9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5.tar.bz2 infinity-for-reddit-9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5.tar.lz infinity-for-reddit-9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5.tar.xz infinity-for-reddit-9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5.tar.zst infinity-for-reddit-9ddf15b8fb20bb99ed94a2f2cb5e0a50780961d5.zip |
Fixed adding new comments to the wrong position. Expand all children of comments after parsing. Delete useless parameters of some methods.
5 files changed, 61 insertions, 138 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentRecyclerViewAdapter.java index f845bec0..5b704cdb 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentRecyclerViewAdapter.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.graphics.ColorFilter; import android.net.Uri; -import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -38,48 +37,21 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH private Retrofit mRetrofit; private Retrofit mOauthRetrofit; private SharedPreferences mSharedPreferences; - private ArrayList<CommentData> mCommentData; - private RecyclerView mRecyclerView; private String mSubredditNamePrefixed; - private String mArticle; private Locale mLocale; private ArrayList<CommentData> mVisibleComments; CommentRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit, - SharedPreferences sharedPreferences, ArrayList<CommentData> commentData, - RecyclerView recyclerView, - String subredditNamePrefixed, String article, Locale locale) { + SharedPreferences sharedPreferences, ArrayList<CommentData> expandedComments, + String subredditNamePrefixed, Locale locale) { mActivity = activity; mRetrofit = retrofit; mOauthRetrofit = oauthRetrofit; mSharedPreferences = sharedPreferences; - mCommentData = commentData; - mRecyclerView = recyclerView; mSubredditNamePrefixed = subredditNamePrefixed; - mArticle = article; 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); - } - if(c.hasMoreChildrenFullnames() && c.getMoreChildrenFullnames().size() > c.getMoreChildrenStartingIndex()) { - //Add a load more placeholder - visibleComments.add(new CommentData(c.getDepth() + 1)); - c.addChild(new CommentData(c.getDepth() + 1), c.getChildren().size()); - } - } + mVisibleComments = expandedComments; } @Override @@ -331,7 +303,8 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH parentComment.getMoreChildrenStartingIndex(), parentComment.getDepth() + 1, mLocale, new FetchComment.FetchMoreCommentListener() { @Override - public void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData, int childrenStartingIndex) { + public void onFetchMoreCommentSuccess(ArrayList<CommentData> expandedComments, + int childrenStartingIndex) { if(mVisibleComments.size() > parentPosition && parentComment.getFullName().equals(mVisibleComments.get(parentPosition).getFullName())) { if(mVisibleComments.get(parentPosition).isExpanded()) { @@ -346,11 +319,8 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH mVisibleComments.get(parentPosition).getChildren().get(mVisibleComments.get(parentPosition).getChildren().size() - 1) .setLoadMoreChildrenFailed(false); - mVisibleComments.addAll(parentPosition - + mVisibleComments.get(parentPosition).getChildren().size(), - commentsData); - notifyItemRangeInserted(parentPosition + mVisibleComments.get(parentPosition).getChildren().size(), - commentsData.size()); + mVisibleComments.addAll(position, expandedComments); + notifyItemRangeInserted(position, expandedComments.size()); } else { mVisibleComments.get(parentPosition).getChildren() .remove(mVisibleComments.get(parentPosition).getChildren().size() - 1); @@ -358,15 +328,12 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH notifyItemRemoved(position); mVisibleComments.get(parentPosition).removeMoreChildrenFullnames(); - mVisibleComments.addAll(parentPosition - + mVisibleComments.get(parentPosition).getChildren().size() + 1, - commentsData); - notifyItemRangeInserted(parentPosition + mVisibleComments.get(parentPosition).getChildren().size() + 1, - commentsData.size()); + mVisibleComments.addAll(position, expandedComments); + notifyItemRangeInserted(position, expandedComments.size()); } } - mVisibleComments.get(parentPosition).addChildren(commentsData); + mVisibleComments.get(parentPosition).addChildren(expandedComments); } else { for(int i = 0; i < mVisibleComments.size(); i++) { if(mVisibleComments.get(i).getFullName().equals(parentComment.getFullName())) { @@ -378,16 +345,16 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH notifyItemChanged(i + mVisibleComments.get(i).getChildren().size()); mVisibleComments.addAll(i + mVisibleComments.get(i).getChildren().size(), - commentsData); + expandedComments); notifyItemRangeInserted(i + mVisibleComments.get(i).getChildren().size(), - commentsData.size()); + expandedComments.size()); } mVisibleComments.get(i).getChildren().get(mVisibleComments.get(i).getChildren().size() - 1) .setLoadingMoreChildren(false); mVisibleComments.get(i).getChildren().get(mVisibleComments.get(i).getChildren().size() - 1) .setLoadMoreChildrenFailed(false); - mVisibleComments.get(i).addChildren(commentsData); + mVisibleComments.get(i).addChildren(expandedComments); break; } @@ -445,10 +412,6 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH comment.setExpanded(true); ArrayList<CommentData> children = comment.getChildren(); if(children != null && children.size() > 0) { - /*if(comment.hasMoreChildrenFullnames() && comment.getMoreChildrenFullnames().size() > comment.getMoreChildrenStartingIndex() - && !children.get(children.size() - 1).isPlaceHolder()) { - children.add(children.size(), new CommentData(children.get(0).getDepth())); - }*/ mVisibleComments.addAll(position + 1, children); for(int i = position + 1; i <= position + children.size(); i++) { mVisibleComments.get(i).setExpanded(false); @@ -481,7 +444,6 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH } void addComment(CommentData comment) { - mCommentData.add(0, comment); mVisibleComments.add(0, comment); notifyItemInserted(0); } @@ -508,7 +470,6 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH } void clearData() { - mCommentData.clear(); mVisibleComments.clear(); notifyDataSetChanged(); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java index 281daf1d..b2a0db3f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchComment.java @@ -14,32 +14,29 @@ import retrofit2.Retrofit; class FetchComment { interface FetchCommentListener { - void onFetchCommentSuccess(ArrayList<CommentData> commentsData, - String parentId, ArrayList<String> children); + void onFetchCommentSuccess(ArrayList<CommentData> expandedComments, String parentId, ArrayList<String> children); void onFetchCommentFailed(); } interface FetchMoreCommentListener { - void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData, int childrenStartingIndex); + void onFetchMoreCommentSuccess(ArrayList<CommentData> expandedComments, int childrenStartingIndex); void onFetchMoreCommentFailed(); } static void fetchComment(Retrofit retrofit, String subredditNamePrefixed, String article, - String comment, Locale locale, boolean isPost, int depth, - final FetchCommentListener fetchCommentListener) { + Locale locale, FetchCommentListener fetchCommentListener) { RedditAPI api = retrofit.create(RedditAPI.class); - Call<String> comments = api.getComments(subredditNamePrefixed, article, comment); + Call<String> comments = api.getComments(subredditNamePrefixed, article); comments.enqueue(new Callback<String>() { @Override public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) { if(response.isSuccessful()) { ParseComment.parseComment(response.body(), new ArrayList<>(), - locale, isPost, depth, - new ParseComment.ParseCommentListener() { + locale, new ParseComment.ParseCommentListener() { @Override - public void onParseCommentSuccess(ArrayList<CommentData> commentData, + public void onParseCommentSuccess(ArrayList<CommentData> expandedComments, String parentId, ArrayList<String> moreChildrenFullnames) { - fetchCommentListener.onFetchCommentSuccess(commentData, parentId, + fetchCommentListener.onFetchCommentSuccess(expandedComments, parentId, moreChildrenFullnames); } @@ -90,9 +87,10 @@ class FetchComment { ParseComment.parseMoreComment(response.body(), new ArrayList<>(), locale, depth, new ParseComment.ParseCommentListener() { @Override - public void onParseCommentSuccess(ArrayList<CommentData> commentData, String parentId, - ArrayList<String> moreChildrenFullnames) { - fetchMoreCommentListener.onFetchMoreCommentSuccess(commentData, startingIndex + 100); + public void onParseCommentSuccess(ArrayList<CommentData> expandedComments, + String parentId, ArrayList<String> moreChildrenFullnames) { + fetchMoreCommentListener.onFetchMoreCommentSuccess(expandedComments, + startingIndex + 100); } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java index d6ff6697..61ca80a4 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseComment.java @@ -16,35 +16,25 @@ import java.util.Locale; class ParseComment { interface ParseCommentListener { - void onParseCommentSuccess(ArrayList<CommentData> commentData, String parentId, ArrayList<String> moreChildrenFullnames); + void onParseCommentSuccess(ArrayList<CommentData> expandedComments, String parentId, + ArrayList<String> moreChildrenFullnames); void onParseCommentFailed(); } - interface ParseMoreCommentBasicInfoListener { - void onParseMoreCommentBasicInfoSuccess(String commaSeparatedChildrenId); - void onParseMoreCommentBasicInfoFailed(); - } - interface ParseSentCommentListener { void onParseSentCommentSuccess(CommentData commentData); void onParseSentCommentFailed(); } static void parseComment(String response, ArrayList<CommentData> commentData, Locale locale, - boolean isPost, int depth, ParseCommentListener parseCommentListener) { + ParseCommentListener parseCommentListener) { try { 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) { - childrenArray = childrenArray.getJSONObject(1).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY); - } else { - childrenArray = childrenArray.getJSONObject(1).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY) - .getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONObject(JSONUtils.REPLIES_KEY) - .getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY); - } + childrenArray = childrenArray.getJSONObject(1).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY); - new ParseCommentAsyncTask(childrenArray, commentData, locale, parentId, depth, parseCommentListener).execute(); + new ParseCommentAsyncTask(childrenArray, commentData, locale, parentId, 0, parseCommentListener).execute(); } catch (JSONException e) { e.printStackTrace(); if(e.getMessage() != null) { @@ -74,9 +64,10 @@ class ParseComment { } private static class ParseCommentAsyncTask extends AsyncTask<Void, Void, Void> { - private JSONArray comments; - private ArrayList<CommentData> commentData; - private ArrayList<CommentData> newcommentData; + private JSONArray commentsJSONArray; + private ArrayList<CommentData> comments; + private ArrayList<CommentData> newComments; + private ArrayList<CommentData> expandedNewComments; private ArrayList<String> moreChildrenFullnames; private Locale locale; private String parentId; @@ -84,11 +75,12 @@ class ParseComment { private ParseCommentListener parseCommentListener; private boolean parseFailed; - ParseCommentAsyncTask(JSONArray comments, ArrayList<CommentData> commentData, Locale locale, + ParseCommentAsyncTask(JSONArray commentsJSONArray, ArrayList<CommentData> comments, Locale locale, @Nullable String parentId, int depth, ParseCommentListener parseCommentListener){ + this.commentsJSONArray = commentsJSONArray; this.comments = comments; - this.commentData = commentData; - newcommentData = new ArrayList<>(); + newComments = new ArrayList<>(); + expandedNewComments = new ArrayList<>(); moreChildrenFullnames = new ArrayList<>(); this.locale = locale; this.parentId = parentId; @@ -100,7 +92,8 @@ class ParseComment { @Override protected Void doInBackground(Void... voids) { try { - parseCommentRecursion(comments, newcommentData, moreChildrenFullnames, depth, locale); + parseCommentRecursion(commentsJSONArray, newComments, moreChildrenFullnames, depth, locale); + makeChildrenVisible(newComments, expandedNewComments); } catch (JSONException e) { parseFailed = true; if(e.getMessage() != null) { @@ -113,8 +106,8 @@ class ParseComment { @Override protected void onPostExecute(Void aVoid) { if(!parseFailed) { - commentData.addAll(newcommentData); - parseCommentListener.onParseCommentSuccess(commentData, parentId, moreChildrenFullnames); + comments.addAll(expandedNewComments); + parseCommentListener.onParseCommentSuccess(comments, parentId, moreChildrenFullnames); } else { parseCommentListener.onParseCommentFailed(); } @@ -131,7 +124,7 @@ class ParseComment { JSONObject more = comments.getJSONObject(comments.length() - 1).getJSONObject(JSONUtils.DATA_KEY); - //Maybe moreChildrenFullnames contain only comments and no more info + //Maybe moreChildrenFullnames contain only commentsJSONArray and no more info if(more.has(JSONUtils.COUNT_KEY)) { JSONArray childrenArray = more.getJSONArray(JSONUtils.CHILDREN_KEY); @@ -163,47 +156,17 @@ class ParseComment { } } - private static class ParseMoreCommentBasicInfoAsyncTask extends AsyncTask<Void, Void, Void> { - private JSONArray children; - private StringBuilder commaSeparatedChildren; - private ParseMoreCommentBasicInfoListener parseMoreCommentBasicInfoListener; - private boolean parseFailed; - - ParseMoreCommentBasicInfoAsyncTask(String response, ParseMoreCommentBasicInfoListener parseMoreCommentBasicInfoListener) { - this.parseMoreCommentBasicInfoListener = parseMoreCommentBasicInfoListener; - try { - children = new JSONObject(response).getJSONObject(JSONUtils.JSON_KEY) - .getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.THINGS_KEY); - commaSeparatedChildren = new StringBuilder(); - } catch (JSONException e) { - parseMoreCommentBasicInfoListener.onParseMoreCommentBasicInfoFailed(); - e.printStackTrace(); + private static 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); } - } - - @Override - protected Void doInBackground(Void... voids) { - try { - for(int i = 0; i < children.length(); i++) { - commaSeparatedChildren.append(children.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.ID_KEY)); - commaSeparatedChildren.append(","); - } - commaSeparatedChildren.deleteCharAt(commaSeparatedChildren.length() - 1); - parseFailed = false; - } catch (JSONException e) { - parseFailed = true; - e.printStackTrace(); - } - return null; - } - - @Override - protected void onPostExecute(Void aVoid) { - super.onPostExecute(aVoid); - if(!parseFailed) { - parseMoreCommentBasicInfoListener.onParseMoreCommentBasicInfoSuccess(commaSeparatedChildren.toString()); - } else { - parseMoreCommentBasicInfoListener.onParseMoreCommentBasicInfoFailed(); + if(c.hasMoreChildrenFullnames() && c.getMoreChildrenFullnames().size() > c.getMoreChildrenStartingIndex()) { + //Add a load more placeholder + visibleComments.add(new CommentData(c.getDepth() + 1)); + c.addChild(new CommentData(c.getDepth() + 1), c.getChildren().size()); } } } @@ -246,6 +209,7 @@ class ParseComment { } } } + private static CommentData parseSingleComment(JSONObject singleCommentData, int depth, Locale locale) throws JSONException { String id = singleCommentData.getString(JSONUtils.ID_KEY); String fullName = singleCommentData.getString(JSONUtils.NAME_KEY); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java index bced4f3f..72f8c4a3 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditAPI.java @@ -18,7 +18,7 @@ public interface RedditAPI { @GET("{subredditNamePrefixed}/comments/{article}.json?raw_json=1") Call<String> getComments(@Path("subredditNamePrefixed") String subredditNamePrefixed, - @Path("article") String article, @Query("comment") String comment); + @Path("article") String article); @GET("r/{subredditName}/about.json?raw_json=1") Call<String> getSubredditData(@Path("subredditName") String subredditName); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java index 94480f98..8ab0b3f5 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java @@ -498,14 +498,14 @@ public class ViewPostDetailActivity extends AppCompatActivity { mNoCommentWrapperLinearLayout.setVisibility(View.GONE); FetchComment.fetchComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getId(), - null, mLocale, true, 0, new FetchComment.FetchCommentListener() { + mLocale, new FetchComment.FetchCommentListener() { @Override - public void onFetchCommentSuccess(ArrayList<CommentData> commentsData, + public void onFetchCommentSuccess(ArrayList<CommentData> expandedComments, String parentId, ArrayList<String> children) { ViewPostDetailActivity.this.children = children; mCommentProgressbar.setVisibility(View.GONE); - if (commentsData.size() > 0) { + if (expandedComments.size() > 0) { if(mAdapter == null) { mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { if(!isLoadingMoreChildren) { @@ -520,8 +520,8 @@ public class ViewPostDetailActivity extends AppCompatActivity { } mAdapter = new CommentRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit, - mOauthRetrofit, mSharedPreferences, commentsData, mRecyclerView, - mPost.getSubredditNamePrefixed(), mPost.getId(), mLocale); + mOauthRetrofit, mSharedPreferences, expandedComments, + mPost.getSubredditNamePrefixed(), mLocale); mRecyclerView.setAdapter(mAdapter); mCommentCardView.setVisibility(View.VISIBLE); @@ -544,8 +544,8 @@ public class ViewPostDetailActivity extends AppCompatActivity { FetchComment.fetchMoreComment(mRetrofit, mPost.getSubredditNamePrefixed(), children, startingIndex, 0, mLocale, new FetchComment.FetchMoreCommentListener() { @Override - public void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData, int childrenStartingIndex) { - mAdapter.addComments(commentsData); + public void onFetchMoreCommentSuccess(ArrayList<CommentData> expandedComments, int childrenStartingIndex) { + mAdapter.addComments(expandedComments); mChildrenStartingIndex = childrenStartingIndex; isLoadingMoreChildren = false; } |