package de.tum.in.tumcampusapp.adapters; import android.content.Context; import android.database.Cursor; import android.support.v4.widget.CursorAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import de.tum.in.tumcampusapp.R; import de.tum.in.tumcampusapp.auxiliary.DateUtils; import de.tum.in.tumcampusapp.managers.ChatMessageManager; import de.tum.in.tumcampusapp.models.tumcabe.ChatMember; import de.tum.in.tumcampusapp.models.tumcabe.ChatMessage; public class ChatHistoryAdapter extends CursorAdapter { private final Context mContext; private final LayoutInflater inflater; private final ChatMember currentChatMember; private List<ChatMessage> unsentMessages = new ArrayList<>(); public ChatMessage mCheckedItem; public ChatMessage mEditedItem; public int getSentCount() { return super.getCount(); } public void removeUnsent(ChatMessage msg) { unsentMessages.remove(msg); } // Layout of the list row static class ViewHolder { TextView tvUser; TextView tvMessage; TextView tvTimestamp; public ProgressBar pbSending; public ImageView ivSent; public LinearLayout layout; } public ChatHistoryAdapter(Context context, Cursor messageHistory, ChatMember member) { super(context, messageHistory, false); inflater = LayoutInflater.from(context); currentChatMember = member; mContext = context; } @Override public int getCount() { return super.getCount() + unsentMessages.size(); } @Override public Object getItem(int position) { int count = super.getCount(); if (position < count) { Cursor cursor = getCursor(); cursor.moveToPosition(position); return ChatMessageManager.toObject(cursor); } else { return unsentMessages.get(position - count); } } @Override public long getItemId(int position) { int count = super.getCount(); if (position < count) { Cursor cursor = getCursor(); cursor.moveToPosition(position); return cursor.getLong(ChatMessageManager.COL_ID); } else { return 0; } } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { if (position > super.getCount()) { return 0; } ChatMessage msg = (ChatMessage) getItem(position); return currentChatMember.getId() == msg.getMember().getId() ? 0 : 1; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { int count = super.getCount(); if (position < count) { return super.getView(position, convertView, viewGroup); } ChatMessage chatMessage = unsentMessages.get(position - count); View v = newView(mContext, null, viewGroup); bindViewChatMessage(v, chatMessage); return v; } @Override public View newView(Context context, Cursor cursor, ViewGroup viewGroup) { ViewHolder holder; boolean outgoing = true; if (cursor != null) { ChatMessage msg = ChatMessageManager.toObject(cursor); outgoing = currentChatMember.getId() == msg.getMember().getId(); } int layout = outgoing ? R.layout.activity_chat_history_row_outgoing : R.layout.activity_chat_history_row_incoming; View view = inflater.inflate(layout, viewGroup, false); holder = new ViewHolder(); // set UI elements holder.layout = (LinearLayout) view.findViewById(R.id.chatMessageLayout); holder.tvMessage = (TextView) view.findViewById(R.id.tvMessage); holder.tvTimestamp = (TextView) view.findViewById(R.id.tvTime); if (outgoing) { holder.pbSending = (ProgressBar) view.findViewById(R.id.progressBar); holder.ivSent = (ImageView) view.findViewById(R.id.sentImage); } else { //We only got the user on receiving things holder.tvUser = (TextView) view.findViewById(R.id.tvUser); } view.setTag(holder); return view; } @Override public void bindView(View view, Context context, Cursor cursor) { ChatMessage chatMessage = ChatMessageManager.toObject(cursor); bindViewChatMessage(view, chatMessage); } private void bindViewChatMessage(View view, ChatMessage chatMessage) { ViewHolder holder = (ViewHolder) view.getTag(); holder.tvMessage.setText(chatMessage.getText()); holder.tvTimestamp.setText(DateUtils.getTimeOrDayISO(chatMessage.getTimestamp(), mContext)); if (holder.ivSent == null) { holder.tvUser.setText(chatMessage.getMember().getDisplayName()); } else {// Set status for outgoing messages (ivSent is not null) boolean sending = chatMessage.getStatus() == ChatMessage.STATUS_SENDING; holder.ivSent.setVisibility(sending ? View.GONE : View.VISIBLE); holder.pbSending.setVisibility(sending ? View.VISIBLE : View.GONE); } if (chatMessage.getMember().getLrzId().equals("bot")) { holder.tvUser.setText(""); holder.tvTimestamp.setText(""); } if ((mCheckedItem != null && mCheckedItem.getId() == chatMessage.getId() && (mCheckedItem.getStatus() == chatMessage.getStatus())) || (mEditedItem != null && mEditedItem.getId() == chatMessage.getId() && mEditedItem.getStatus() == chatMessage.getStatus())) { holder.layout.setBackgroundResource(R.drawable.bg_message_outgoing_selected); } else if (holder.ivSent != null) { holder.layout.setBackgroundResource(R.drawable.bg_message_outgoing); } } public void add(ChatMessage unsentMessage) { unsentMessages.add(unsentMessage); notifyDataSetChanged(); } public void setUnsentMessages(List<ChatMessage> unsent) { unsentMessages = unsent; } }