Browse Source

move view properties to topic view model and fiximprove quotes in the process

pull/34/head
Thodoris1999 7 years ago
parent
commit
fcf78aea5b
  1. 11
      app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java
  2. 62
      app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicAdapter.java
  3. 13
      app/src/main/java/gr/thmmy/mthmmy/activities/topic/tasks/PrepareForReply.java
  4. 46
      app/src/main/java/gr/thmmy/mthmmy/viewmodel/TopicViewModel.java

11
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(); if (!sessionManager.isLoggedIn()) replyFAB.hide();
else { else {
replyFAB.setOnClickListener(view -> { replyFAB.setOnClickListener(view -> {
if (sessionManager.isLoggedIn()) { if (sessionManager.isLoggedIn())
viewModel.prepareForReply(postsList, topicAdapter.getToQuoteList()); viewModel.prepareForReply();
}
}); });
} }
@ -232,12 +231,10 @@ public class TopicActivity extends BaseActivity implements TopicTask.TopicTaskOb
} }
progressBar.setVisibility(ProgressBar.GONE); progressBar.setVisibility(ProgressBar.GONE);
if (topicTaskResult.getReplyPageUrl() == null) { if (topicTaskResult.getReplyPageUrl() == null)
replyFAB.hide(); replyFAB.hide();
} else { else
replyFAB.show(); replyFAB.show();
}
topicAdapter.resetTopic();
recyclerView.scrollToPosition(topicTaskResult.getFocusedPostIndex()); recyclerView.scrollToPosition(topicTaskResult.getFocusedPostIndex());
break; break;
case NETWORK_ERROR: case NETWORK_ERROR:

62
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 com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -69,23 +68,7 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static int THUMBNAIL_SIZE; private static int THUMBNAIL_SIZE;
private final Context context; private final Context context;
private final OnPostFocusChangeListener postFocusListener; private final OnPostFocusChangeListener postFocusListener;
private final ArrayList<Integer> toQuoteList = new ArrayList<>();
private final List<Post> postsList; private final List<Post> 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<boolean[]> 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; private TopicViewModel viewModel;
/** /**
@ -100,14 +83,6 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
viewModel = ViewModelProviders.of(context).get(TopicViewModel.class); viewModel = ViewModelProviders.of(context).get(TopicViewModel.class);
THUMBNAIL_SIZE = (int) context.getResources().getDimension(R.dimen.thumbnail_size); 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<Integer> getToQuoteList() {
return toQuoteList;
} }
@Override @Override
@ -318,7 +293,7 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
} else holder.cardChildLinear.setBackground(null); } else holder.cardChildLinear.setBackground(null);
//Avoid's view's visibility recycling //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.setVisibility(View.VISIBLE);
holder.userExtraInfo.setAlpha(1.0f); holder.userExtraInfo.setAlpha(1.0f);
@ -357,19 +332,14 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
}); });
holder.header.setOnClickListener(v -> { holder.header.setOnClickListener(v -> {
//Clicking the header makes it expand/collapse //Clicking the header makes it expand/collapse
boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); viewModel.toggleUserInfo(holder.getAdapterPosition());
tmp[isUserExtraInfoVisibile] = !tmp[isUserExtraInfoVisibile];
viewProperties.set(holder.getAdapterPosition(), tmp);
TopicAnimations.animateUserExtraInfoVisibility(holder.username, TopicAnimations.animateUserExtraInfoVisibility(holder.username,
holder.subject, Color.parseColor("#FFFFFF"), holder.subject, Color.parseColor("#FFFFFF"),
Color.parseColor("#757575"), holder.userExtraInfo); Color.parseColor("#757575"), holder.userExtraInfo);
}); });
//Clicking the expanded part of a header (the extra info) makes it collapse //Clicking the expanded part of a header (the extra info) makes it collapse
holder.userExtraInfo.setOnClickListener(v -> { holder.userExtraInfo.setOnClickListener(v -> {
boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); viewModel.hideUserInfo(holder.getAdapterPosition());
tmp[isUserExtraInfoVisibile] = false;
viewProperties.set(holder.getAdapterPosition(), tmp);
TopicAnimations.animateUserExtraInfoVisibility(holder.username, TopicAnimations.animateUserExtraInfoVisibility(holder.username,
holder.subject, Color.parseColor("#FFFFFF"), holder.subject, Color.parseColor("#FFFFFF"),
Color.parseColor("#757575"), (LinearLayout) v); Color.parseColor("#757575"), (LinearLayout) v);
@ -438,25 +408,17 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
if (!BaseActivity.getSessionManager().isLoggedIn() || !viewModel.canReply()) { if (!BaseActivity.getSessionManager().isLoggedIn() || !viewModel.canReply()) {
holder.quoteToggle.setVisibility(View.GONE); holder.quoteToggle.setVisibility(View.GONE);
} else { } else {
if (viewProperties.get(position)[isQuoteButtonChecked]) if (viewModel.getToQuoteList().contains(currentPost.getPostIndex()))
holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked); holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked);
else else
holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked); holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked);
//Sets graphics behavior //Sets graphics behavior
holder.quoteToggle.setOnClickListener(view -> { holder.quoteToggle.setOnClickListener(view -> {
boolean[] tmp = viewProperties.get(holder.getAdapterPosition()); viewModel.postIndexToggle(currentPost.getPostIndex());
if (tmp[isQuoteButtonChecked]) { if (viewModel.getToQuoteList().contains(currentPost.getPostIndex()))
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));
holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked); holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_checked);
} else
tmp[isQuoteButtonChecked] = !tmp[isQuoteButtonChecked]; holder.quoteToggle.setImageResource(R.drawable.ic_format_quote_unchecked);
viewProperties.set(holder.getAdapterPosition(), tmp);
}); });
} }
} else if (currentHolder instanceof QuickReplyViewHolder) { } else if (currentHolder instanceof QuickReplyViewHolder) {
@ -536,14 +498,6 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
} }
} }
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 @Override
public int getItemCount() { public int getItemCount() {
return postsList.size(); return postsList.size();

13
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 org.jsoup.select.Selector;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import gr.thmmy.mthmmy.base.BaseApplication; import gr.thmmy.mthmmy.base.BaseApplication;
import gr.thmmy.mthmmy.model.Post;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
@ -20,14 +18,12 @@ public class PrepareForReply extends AsyncTask<Integer, Void, PrepareForReplyRes
private PrepareForReplyCallbacks listener; private PrepareForReplyCallbacks listener;
private OnPrepareForReplyFinished finishListener; private OnPrepareForReplyFinished finishListener;
private String replyPageUrl; private String replyPageUrl;
private ArrayList<Post> postsList;
public PrepareForReply(PrepareForReplyCallbacks listener, OnPrepareForReplyFinished finishListener, public PrepareForReply(PrepareForReplyCallbacks listener, OnPrepareForReplyFinished finishListener,
String replyPageUrl, ArrayList<Post> postsList) { String replyPageUrl) {
this.listener = listener; this.listener = listener;
this.finishListener = finishListener; this.finishListener = finishListener;
this.replyPageUrl = replyPageUrl; this.replyPageUrl = replyPageUrl;
this.postsList = postsList;
} }
@Override @Override
@ -36,7 +32,7 @@ public class PrepareForReply extends AsyncTask<Integer, Void, PrepareForReplyRes
} }
@Override @Override
protected PrepareForReplyResult doInBackground(Integer... quoteList) { protected PrepareForReplyResult doInBackground(Integer... postIndices) {
String numReplies = null; String numReplies = null;
String seqnum = null; String seqnum = null;
String sc = null; String sc = null;
@ -61,11 +57,10 @@ public class PrepareForReply extends AsyncTask<Integer, Void, PrepareForReplyRes
Timber.e(e, "Prepare failed."); Timber.e(e, "Prepare failed.");
} }
for (Integer quotePosition : quoteList) { for (Integer postIndex : postIndices) {
request = new Request.Builder() request = new Request.Builder()
.url("https://www.thmmy.gr/smf/index.php?action=quotefast;quote=" + .url("https://www.thmmy.gr/smf/index.php?action=quotefast;quote=" +
postsList.get(quotePosition).getPostIndex() + postIndex + ";" + "sesc=" + sc + ";xml")
";" + "sesc=" + sc + ";xml")
.build(); .build();
try { try {

46
app/src/main/java/gr/thmmy/mthmmy/viewmodel/TopicViewModel.java

@ -11,10 +11,10 @@ import java.util.ArrayList;
import gr.thmmy.mthmmy.activities.settings.SettingsActivity; import gr.thmmy.mthmmy.activities.settings.SettingsActivity;
import gr.thmmy.mthmmy.activities.topic.tasks.DeleteTask; import gr.thmmy.mthmmy.activities.topic.tasks.DeleteTask;
import gr.thmmy.mthmmy.activities.topic.tasks.EditTask; import gr.thmmy.mthmmy.activities.topic.tasks.EditTask;
import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForReply;
import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForReplyResult;
import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForEditResult; import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForEditResult;
import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForEditTask; import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForEditTask;
import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForReply;
import gr.thmmy.mthmmy.activities.topic.tasks.PrepareForReplyResult;
import gr.thmmy.mthmmy.activities.topic.tasks.ReplyTask; import gr.thmmy.mthmmy.activities.topic.tasks.ReplyTask;
import gr.thmmy.mthmmy.activities.topic.tasks.TopicTask; import gr.thmmy.mthmmy.activities.topic.tasks.TopicTask;
import gr.thmmy.mthmmy.activities.topic.tasks.TopicTaskResult; import gr.thmmy.mthmmy.activities.topic.tasks.TopicTaskResult;
@ -29,6 +29,14 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa
*/ */
private boolean editingPost = false; private boolean editingPost = false;
private boolean writingReply = false; private boolean writingReply = false;
/**
* A list of {@link Post#getPostIndex()} for building quotes for replying
*/
private ArrayList<Integer> toQuoteList = new ArrayList<>();
/**
* caches the expand/collapse state of the user extra info in the current page for the recyclerview
*/
private ArrayList<Boolean> isUserExtraInfoVisibile = new ArrayList<>();
/** /**
* holds the adapter position of the post being edited * 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)); loadUrl(topicTaskResult.getValue().getPagesUrls().get(pageRequested));
} }
public void prepareForReply(ArrayList<Post> postsList, ArrayList<Integer> toQuoteList) { public void prepareForReply() {
if (topicTaskResult.getValue() == null) if (topicTaskResult.getValue() == null)
throw new NullPointerException("Topic task has not finished yet!"); throw new NullPointerException("Topic task has not finished yet!");
stopLoading(); stopLoading();
changePage(topicTaskResult.getValue().getPageCount() - 1); changePage(topicTaskResult.getValue().getPageCount() - 1);
currentPrepareForReplyTask = new PrepareForReply(prepareForReplyCallbacks, this, currentPrepareForReplyTask = new PrepareForReply(prepareForReplyCallbacks, this,
topicTaskResult.getValue().getReplyPageUrl(), postsList); topicTaskResult.getValue().getReplyPageUrl());
currentPrepareForReplyTask.execute(toQuoteList.toArray(new Integer[0])); currentPrepareForReplyTask.execute(toQuoteList.toArray(new Integer[0]));
} }
@ -98,6 +106,7 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
includeAppSignature = prefs.getBoolean(SettingsActivity.APP_SIGNATURE_ENABLE_KEY, true); includeAppSignature = prefs.getBoolean(SettingsActivity.APP_SIGNATURE_ENABLE_KEY, true);
} }
toQuoteList.clear();
new ReplyTask(replyFinishListener, includeAppSignature).execute(subject, reply, new ReplyTask(replyFinishListener, includeAppSignature).execute(subject, reply,
replyForm.getNumReplies(), replyForm.getSeqnum(), replyForm.getSc(), replyForm.getTopic()); replyForm.getNumReplies(), replyForm.getSeqnum(), replyForm.getSc(), replyForm.getTopic());
} }
@ -149,6 +158,12 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa
@Override @Override
public void onTopicTaskCompleted(TopicTaskResult result) { public void onTopicTaskCompleted(TopicTaskResult result) {
topicTaskResult.setValue(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 @Override
@ -166,6 +181,29 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa
// <-------------Just getters, setters and helper methods below here----------------> // <-------------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<Integer> 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) { public void setTopicTaskObserver(TopicTask.TopicTaskObserver topicTaskObserver) {
this.topicTaskObserver = topicTaskObserver; this.topicTaskObserver = topicTaskObserver;
} }

Loading…
Cancel
Save