package it.slyce.messaging.utils.asyncTasks;
import android.content.Context;
import android.os.AsyncTask;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import it.slyce.messaging.R;
import java.util.List;
import it.slyce.messaging.message.Message;
import it.slyce.messaging.message.MessageSource;
import it.slyce.messaging.message.messageItem.MessageItem;
import it.slyce.messaging.message.messageItem.MessageRecyclerAdapter;
import it.slyce.messaging.utils.CustomSettings;
import it.slyce.messaging.utils.MessageUtils;
import it.slyce.messaging.utils.ScrollUtils;
public class AddNewMessageTask extends AsyncTask {
private List<Message> messages;
private List<MessageItem> mMessageItems;
private MessageRecyclerAdapter mRecyclerAdapter;
private RecyclerView mRecyclerView;
private Context context;
private CustomSettings customSettings;
private int rangeStartingPoint;
public AddNewMessageTask(
List<Message> messages,
List<MessageItem> mMessageItems,
MessageRecyclerAdapter mRecyclerAdapter,
RecyclerView mRecyclerView,
Context context,
CustomSettings customSettings) {
this.messages = messages;
this.mMessageItems = mMessageItems;
this.mRecyclerAdapter = mRecyclerAdapter;
this.mRecyclerView = mRecyclerView;
this.context = context;
this.customSettings = customSettings;
}
@Override
protected Object doInBackground(Object[] objects) {
this.rangeStartingPoint = mMessageItems.size() - 1;
for (Message message : messages) {
if (context == null) {
return null;
}
mMessageItems.add(message.toMessageItem(context)); // this call is why we need the AsyncTask
}
for (int i = rangeStartingPoint; i < mMessageItems.size(); i++) {
MessageUtils.markMessageItemAtIndexIfFirstOrLastFromSource(i, mMessageItems);
}
return null;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
if (o != null)
return;
boolean isAtBottom = !mRecyclerView.canScrollVertically(1);
boolean isAtTop = !mRecyclerView.canScrollVertically(-1);
mRecyclerAdapter.notifyItemRangeInserted(rangeStartingPoint + 1, messages.size() - rangeStartingPoint - 1);
mRecyclerAdapter.notifyItemChanged(rangeStartingPoint);
if (isAtBottom || messages.get(messages.size() - 1).getSource() == MessageSource.LOCAL_USER)
mRecyclerView.scrollToPosition(mRecyclerAdapter.getItemCount() - 1);
else {
if (isAtTop) {
ScrollUtils.scrollToTopAfterDelay(mRecyclerView, mRecyclerAdapter);
}
Snackbar snackbar = Snackbar.make(mRecyclerView, context.getText(R.string.message_new), Snackbar.LENGTH_SHORT)
.setAction(context.getText(R.string.message_view), new View.OnClickListener() {
@Override
public void onClick(View view) {
mRecyclerView.smoothScrollToPosition(mRecyclerAdapter.getItemCount() - 1);
}
}).setActionTextColor(customSettings.snackbarButtonColor);
ViewGroup group = (ViewGroup) snackbar.getView();
for (int i = 0; i < group.getChildCount(); i++) {
View v = group.getChildAt(i);
if (v instanceof TextView) {
TextView textView = (TextView) v;
textView.setTextColor(customSettings.snackbarTitleColor);
}
}
snackbar.getView().setBackgroundColor(customSettings.snackbarBackground);
snackbar.show();
}
}
}