diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java index cce74faa..10c2cf39 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java @@ -180,9 +180,8 @@ public class TopicActivity extends BaseActivity implements TopicTask.TopicTaskOb if (!sessionManager.isLoggedIn()) replyFAB.hide(); else { replyFAB.setOnClickListener(view -> { - if (sessionManager.isLoggedIn()) { - viewModel.prepareForReply(postsList, topicAdapter.getToQuoteList()); - } + if (sessionManager.isLoggedIn()) + viewModel.prepareForReply(); }); } @@ -232,12 +231,10 @@ public class TopicActivity extends BaseActivity implements TopicTask.TopicTaskOb } progressBar.setVisibility(ProgressBar.GONE); - if (topicTaskResult.getReplyPageUrl() == null) { + if (topicTaskResult.getReplyPageUrl() == null) replyFAB.hide(); - } else { + else replyFAB.show(); - } - topicAdapter.resetTopic(); recyclerView.scrollToPosition(topicTaskResult.getFocusedPostIndex()); break; case NETWORK_ERROR: diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java index 0b676153..9a0ffcdb 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java @@ -33,7 +33,6 @@ import android.widget.TextView; import com.squareup.picasso.Picasso; -import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -69,23 +68,7 @@ class TopicAdapter extends RecyclerView.Adapter { private static int THUMBNAIL_SIZE; private final Context context; private final OnPostFocusChangeListener postFocusListener; - private final ArrayList toQuoteList = new ArrayList<>(); private final List postsList; - /** - * Used to hold the state of visibility and other attributes for views that are animated or - * otherwise changed. Used in combination with {@link #isUserExtraInfoVisibile} and - * {@link #isQuoteButtonChecked}. - */ - private final ArrayList viewProperties = new ArrayList<>(); - /** - * Index of state indicator in the boolean array. If true user's extra info are expanded and - * visible. - */ - private static final int isUserExtraInfoVisibile = 0; - /** - * Index of state indicator in the boolean array. If true quote button for this post is checked. - */ - private static final int isQuoteButtonChecked = 1; private TopicViewModel viewModel; /** @@ -100,14 +83,6 @@ class TopicAdapter extends RecyclerView.Adapter { viewModel = ViewModelProviders.of(context).get(TopicViewModel.class); THUMBNAIL_SIZE = (int) context.getResources().getDimension(R.dimen.thumbnail_size); - for (int i = 0; i < postsList.size(); ++i) { - //Initializes properties, array's values will be false by default - viewProperties.add(new boolean[3]); - } - } - - ArrayList getToQuoteList() { - return toQuoteList; } @Override @@ -318,7 +293,7 @@ class TopicAdapter extends RecyclerView.Adapter { } else holder.cardChildLinear.setBackground(null); //Avoid's view's visibility recycling - if (!currentPost.isDeleted() && viewProperties.get(position)[isUserExtraInfoVisibile]) { + if (!currentPost.isDeleted() && viewModel.isUserExtraInfoVisible(holder.getAdapterPosition())) { holder.userExtraInfo.setVisibility(View.VISIBLE); holder.userExtraInfo.setAlpha(1.0f); @@ -357,19 +332,14 @@ class TopicAdapter extends RecyclerView.Adapter { }); holder.header.setOnClickListener(v -> { //Clicking the header makes it expand/collapse - boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); - tmp[isUserExtraInfoVisibile] = !tmp[isUserExtraInfoVisibile]; - viewProperties.set(holder.getAdapterPosition(), tmp); + viewModel.toggleUserInfo(holder.getAdapterPosition()); TopicAnimations.animateUserExtraInfoVisibility(holder.username, holder.subject, Color.parseColor("#FFFFFF"), Color.parseColor("#757575"), holder.userExtraInfo); }); //Clicking the expanded part of a header (the extra info) makes it collapse holder.userExtraInfo.setOnClickListener(v -> { - boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); - tmp[isUserExtraInfoVisibile] = false; - viewProperties.set(holder.getAdapterPosition(), tmp); - + viewModel.hideUserInfo(holder.getAdapterPosition()); TopicAnimations.animateUserExtraInfoVisibility(holder.username, holder.subject, Color.parseColor("#FFFFFF"), Color.parseColor("#757575"), (LinearLayout) v); @@ -438,25 +408,17 @@ class TopicAdapter extends RecyclerView.Adapter { if (!BaseActivity.getSessionManager().isLoggedIn() || !viewModel.canReply()) { holder.quoteToggle.setVisibility(View.GONE); } else { - if (viewProperties.get(position)[isQuoteButtonChecked]) + if (viewModel.getToQuoteList().contains(currentPost.getPostIndex())) holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked); else holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked); //Sets graphics behavior holder.quoteToggle.setOnClickListener(view -> { - boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); - if (tmp[isQuoteButtonChecked]) { - if (toQuoteList.contains(postsList.indexOf(currentPost))) { - toQuoteList.remove(toQuoteList.indexOf(postsList.indexOf(currentPost))); - } else - Timber.i("An error occurred while trying to exclude post fromtoQuoteList, post wasn't there!"); - holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked); - } else { - toQuoteList.add(postsList.indexOf(currentPost)); + viewModel.postIndexToggle(currentPost.getPostIndex()); + if (viewModel.getToQuoteList().contains(currentPost.getPostIndex())) holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked); - } - tmp[isQuoteButtonChecked] = !tmp[isQuoteButtonChecked]; - viewProperties.set(holder.getAdapterPosition(), tmp); + else + holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked); }); } } else if (currentHolder instanceof QuickReplyViewHolder) { @@ -536,14 +498,6 @@ class TopicAdapter extends RecyclerView.Adapter { } } - void resetTopic() { - viewProperties.clear(); - for (int i = 0; i < postsList.size(); ++i) { - //Initializes properties, array's values will be false by default - viewProperties.add(new boolean[3]); - } - } - @Override public int getItemCount() { return postsList.size(); diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java index a6ea37a1..42ea2774 100644 --- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java +++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java @@ -7,10 +7,8 @@ import org.jsoup.nodes.Document; import org.jsoup.select.Selector; import java.io.IOException; -import java.util.ArrayList; import gr.thmmy.mthmmy.base.BaseApplication; -import gr.thmmy.mthmmy.model.Post; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -20,14 +18,12 @@ public class PrepareForReply extends AsyncTask postsList; public PrepareForReply(PrepareForReplyCallbacks listener, OnPrepareForReplyFinished finishListener, - String replyPageUrl, ArrayList postsList) { + String replyPageUrl) { this.listener = listener; this.finishListener = finishListener; this.replyPageUrl = replyPageUrl; - this.postsList = postsList; } @Override @@ -36,7 +32,7 @@ public class PrepareForReply extends AsyncTask toQuoteList = new ArrayList<>(); + /** + * caches the expand/collapse state of the user extra info in the current page for the recyclerview + */ + private ArrayList isUserExtraInfoVisibile = new ArrayList<>(); /** * holds the adapter position of the post being edited */ @@ -77,13 +85,13 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa loadUrl(topicTaskResult.getValue().getPagesUrls().get(pageRequested)); } - public void prepareForReply(ArrayList postsList, ArrayList toQuoteList) { + public void prepareForReply() { if (topicTaskResult.getValue() == null) throw new NullPointerException("Topic task has not finished yet!"); stopLoading(); changePage(topicTaskResult.getValue().getPageCount() - 1); currentPrepareForReplyTask = new PrepareForReply(prepareForReplyCallbacks, this, - topicTaskResult.getValue().getReplyPageUrl(), postsList); + topicTaskResult.getValue().getReplyPageUrl()); currentPrepareForReplyTask.execute(toQuoteList.toArray(new Integer[0])); } @@ -98,6 +106,7 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); includeAppSignature = prefs.getBoolean(SettingsActivity.APP_SIGNATURE_ENABLE_KEY, true); } + toQuoteList.clear(); new ReplyTask(replyFinishListener, includeAppSignature).execute(subject, reply, replyForm.getNumReplies(), replyForm.getSeqnum(), replyForm.getSc(), replyForm.getTopic()); } @@ -149,6 +158,12 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa @Override public void onTopicTaskCompleted(TopicTaskResult result) { topicTaskResult.setValue(result); + if (result.getResultCode() == TopicTask.ResultCode.SUCCESS) { + isUserExtraInfoVisibile.clear(); + for (int i = 0; i < result.getNewPostsList().size(); i++) { + isUserExtraInfoVisibile.add(false); + } + } } @Override @@ -166,6 +181,29 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa // <-------------Just getters, setters and helper methods below here----------------> + public boolean isUserExtraInfoVisible(int position) { + return isUserExtraInfoVisibile.get(position); + } + + public void hideUserInfo(int position) { + isUserExtraInfoVisibile.set(position, false); + } + + public void toggleUserInfo(int position) { + isUserExtraInfoVisibile.set(position, !isUserExtraInfoVisibile.get(position)); + } + + public ArrayList getToQuoteList() { + return toQuoteList; + } + + public void postIndexToggle(Integer postIndex) { + if (toQuoteList.contains(postIndex)) + toQuoteList.remove(postIndex); + else + toQuoteList.add(postIndex); + } + public void setTopicTaskObserver(TopicTask.TopicTaskObserver topicTaskObserver) { this.topicTaskObserver = topicTaskObserver; }