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();
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:

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 java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@ -69,23 +68,7 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static int THUMBNAIL_SIZE;
private final Context context;
private final OnPostFocusChangeListener postFocusListener;
private final ArrayList<Integer> toQuoteList = new ArrayList<>();
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;
/**
@ -100,14 +83,6 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
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<Integer> getToQuoteList() {
return toQuoteList;
}
@Override
@ -318,7 +293,7 @@ class TopicAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
} 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<RecyclerView.ViewHolder> {
});
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<RecyclerView.ViewHolder> {
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<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
public int getItemCount() {
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 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<Integer, Void, PrepareForReplyRes
private PrepareForReplyCallbacks listener;
private OnPrepareForReplyFinished finishListener;
private String replyPageUrl;
private ArrayList<Post> postsList;
public PrepareForReply(PrepareForReplyCallbacks listener, OnPrepareForReplyFinished finishListener,
String replyPageUrl, ArrayList<Post> 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<Integer, Void, PrepareForReplyRes
}
@Override
protected PrepareForReplyResult doInBackground(Integer... quoteList) {
protected PrepareForReplyResult doInBackground(Integer... postIndices) {
String numReplies = null;
String seqnum = null;
String sc = null;
@ -61,11 +57,10 @@ public class PrepareForReply extends AsyncTask<Integer, Void, PrepareForReplyRes
Timber.e(e, "Prepare failed.");
}
for (Integer quotePosition : quoteList) {
for (Integer postIndex : postIndices) {
request = new Request.Builder()
.url("https://www.thmmy.gr/smf/index.php?action=quotefast;quote=" +
postsList.get(quotePosition).getPostIndex() +
";" + "sesc=" + sc + ";xml")
postIndex + ";" + "sesc=" + sc + ";xml")
.build();
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.topic.tasks.DeleteTask;
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.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.TopicTask;
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 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
*/
@ -77,13 +85,13 @@ public class TopicViewModel extends BaseViewModel implements TopicTask.OnTopicTa
loadUrl(topicTaskResult.getValue().getPagesUrls().get(pageRequested));
}
public void prepareForReply(ArrayList<Post> postsList, ArrayList<Integer> 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<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) {
this.topicTaskObserver = topicTaskObserver;
}

Loading…
Cancel
Save