package org.jorge.cmp.ui.adapter;
import android.os.AsyncTask;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.jorge.cmp.R;
import org.jorge.cmp.datamodel.ChatMessageWrapper;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Executors;
public class ChatRoomAdapter extends RecyclerView.Adapter<ChatRoomAdapter.ViewHolder> {
private static final Integer MESSAGE_TYPE_SENT_BY_ME = 0, MESSAGE_TYPE_SENT_BY_OTHER = 1;
private final List<ChatMessageWrapper> mData = new LinkedList<>();
private static final SimpleDateFormat TIMESTAMP_FORMAT = new SimpleDateFormat("HH:mm",
Locale.ENGLISH);
private final RecyclerView mRecyclerView;
public ChatRoomAdapter(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
}
@Override
public ChatRoomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View v = LayoutInflater.from(parent.getContext()).inflate(viewType ==
MESSAGE_TYPE_SENT_BY_ME ? R.layout
.list_item_chat_room_sent_by_me : R.layout
.list_item_chat_room_sent_by_other,
parent, Boolean.FALSE);
return new ChatRoomAdapter.ViewHolder(v);
}
@Override
public int getItemViewType(int position) {
final ChatMessageWrapper messageWrapper = getItem(position);
if (messageWrapper == null)
throw new IllegalArgumentException("Illegal message index requested " + position + " " +
"on list" +
" sized " + mData.size());
return messageWrapper.getSender() == null ? MESSAGE_TYPE_SENT_BY_ME :
MESSAGE_TYPE_SENT_BY_OTHER;
}
@Override
public void onBindViewHolder(ChatRoomAdapter.ViewHolder holder, int position) {
final ChatMessageWrapper messageWrapper = getItem(position);
if (messageWrapper != null) {
holder.mContentsView.setText(messageWrapper.getText());
holder.mTimeView.setText(TIMESTAMP_FORMAT.format(messageWrapper.getTime()));
}
}
@Override
public int getItemCount() {
return mData.size();
}
@Nullable
private synchronized ChatMessageWrapper getItem(Integer i) {
if (i < 0 || i > mData.size())
throw new IllegalArgumentException("Illegal message index requested " + i + " on list" +
" sized " + mData.size());
return mData.get(i);
}
public void addItem(ChatMessageWrapper chatMessageWrapper) {
mData.add(chatMessageWrapper);
}
public void notifyItemAdded() {
new AsyncTask<Void, Void, Void>() {
final Integer lastPos = mData.size() - 1;
@Override
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
notifyItemChanged(lastPos);
mRecyclerView.smoothScrollToPosition(lastPos);
}
}.executeOnExecutor(Executors.newSingleThreadExecutor());
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final TextView mContentsView, mTimeView;
public ViewHolder(View v) {
super(v);
mContentsView = (TextView) v.findViewById(R.id.contents_view);
mTimeView = (TextView) v.findViewById(R.id.time_view);
}
}
}