package com.pinthecloud.athere.adapter;
import java.util.List;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.pinthecloud.athere.AhApplication;
import com.pinthecloud.athere.AhGlobalVariable;
import com.pinthecloud.athere.R;
import com.pinthecloud.athere.activity.ChupaChatActivity;
import com.pinthecloud.athere.activity.ProfileImageActivity;
import com.pinthecloud.athere.database.MessageDBHelper;
import com.pinthecloud.athere.database.UserDBHelper;
import com.pinthecloud.athere.dialog.AhAlertDialog;
import com.pinthecloud.athere.dialog.ProfileDialog;
import com.pinthecloud.athere.fragment.AhFragment;
import com.pinthecloud.athere.fragment.ChatFragment;
import com.pinthecloud.athere.helper.BlobStorageHelper;
import com.pinthecloud.athere.helper.CachedBlobStorageHelper;
import com.pinthecloud.athere.interfaces.AhDialogCallback;
import com.pinthecloud.athere.model.AhMessage;
import com.pinthecloud.athere.model.AhUser;
public class ChatListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private enum TYPE{
ADMIN,
ENTER_NOTIFICATION,
NOTIFICATION,
SEND,
RECEIVE
}
private AhApplication app;
private Context context;
private AhFragment frag;
private List<AhMessage> chatList;
private UserDBHelper userDBHelper;
private MessageDBHelper messageDBHelper;
private CachedBlobStorageHelper blobStorageHelper;
public ChatListAdapter(Context context, AhFragment frag, List<AhMessage> chatList) {
this.app = AhApplication.getInstance();
this.context = context;
this.frag = frag;
this.chatList = chatList;
this.userDBHelper = app.getUserDBHelper();
this.blobStorageHelper = app.getBlobStorageHelper();
this.messageDBHelper = app.getMessageDBHelper();
}
public static class AdminViewHolder extends RecyclerView.ViewHolder {
public View view;
public TextView messageText;
public TextView timeText;
public AdminViewHolder(View view) {
super(view);
this.view = view;
this.messageText = (TextView)view.findViewById(R.id.row_chat_list_admin_message);
this.timeText = (TextView)view.findViewById(R.id.row_chat_list_admin_time);
}
}
public static class EnterNotificationViewHolder extends RecyclerView.ViewHolder {
public View view;
public TextView nickNameText;
public TextView messageText;
public EnterNotificationViewHolder(View view) {
super(view);
this.view = view;
this.nickNameText = (TextView)view.findViewById(R.id.row_chat_list_enter_exit_notification_nick_name);
this.messageText = (TextView)view.findViewById(R.id.row_chat_list_enter_exit_notification_message);
}
}
public static class NotificationViewHolder extends RecyclerView.ViewHolder {
public View view;
public TextView messageText;
public NotificationViewHolder(View view) {
super(view);
this.view = view;
this.messageText = (TextView)view.findViewById(R.id.row_chat_list_notification_message);
}
}
public static class SendViewHolder extends RecyclerView.ViewHolder {
public View view;
public TextView timeText;
public ImageButton failButton;
public ProgressBar progressBar;
public TextView messageText;
public SendViewHolder(View view) {
super(view);
this.view = view;
this.timeText = (TextView)view.findViewById(R.id.row_chat_list_send_time);
this.failButton = (ImageButton)view.findViewById(R.id.row_chat_list_send_fail);
this.progressBar = (ProgressBar)view.findViewById(R.id.row_chat_list_send_progress_bar);
this.messageText = (TextView)view.findViewById(R.id.row_chat_list_send_message);
}
}
public static class ReceiveViewHolder extends RecyclerView.ViewHolder {
public View view;
public TextView timeText;
public TextView nickNameText;
public ImageView profileImage;
public TextView messageText;
public ReceiveViewHolder(View view) {
super(view);
this.view = view;
this.timeText = (TextView)view.findViewById(R.id.row_chat_list_receive_time);
this.nickNameText = (TextView)view.findViewById(R.id.row_chat_list_receive_nick_name_gender);
this.profileImage = (ImageView)view.findViewById(R.id.row_chat_list_receive_profile_image);
this.messageText = (TextView)view.findViewById(R.id.row_chat_list_receive_message);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
ViewHolder viewHolder = null;
if(viewType == TYPE.ADMIN.ordinal()){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_chat_list_admin, parent, false);
viewHolder = new AdminViewHolder(view);
} else if(viewType == TYPE.ENTER_NOTIFICATION.ordinal()){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_chat_list_enter_notification, parent, false);
viewHolder = new EnterNotificationViewHolder(view);
} else if(viewType == TYPE.NOTIFICATION.ordinal()){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_chat_list_notification, parent, false);
viewHolder = new NotificationViewHolder(view);
} else if(viewType == TYPE.SEND.ordinal()){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_chat_list_send, parent, false);
viewHolder = new SendViewHolder(view);
} else if(viewType == TYPE.RECEIVE.ordinal()){
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_chat_list_receive, parent, false);
viewHolder = new ReceiveViewHolder(view);
}
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
AhMessage chat = chatList.get(position);
int viewType = getItemViewType(position);
if(viewType == TYPE.ADMIN.ordinal()){
AdminViewHolder viewHolder = (AdminViewHolder)holder;
setAdminComponent(viewHolder, chat);
} else if(viewType == TYPE.ENTER_NOTIFICATION.ordinal()){
EnterNotificationViewHolder viewHolder = (EnterNotificationViewHolder)holder;
setEnterNotificationComponent(viewHolder, chat);
} else if(viewType == TYPE.NOTIFICATION.ordinal()){
NotificationViewHolder viewHolder = (NotificationViewHolder)holder;
setNotificationComponent(viewHolder, chat);
} else if(viewType == TYPE.SEND.ordinal()){
SendViewHolder viewHolder = (SendViewHolder)holder;
setSendComponent(viewHolder, chat);
} else if(viewType == TYPE.RECEIVE.ordinal()){
ReceiveViewHolder viewHolder = (ReceiveViewHolder)holder;
setReceiveComponent(viewHolder, chat);
}
}
@Override
public int getItemCount() {
return this.chatList.size();
}
@Override
public int getItemViewType(int position) {
AhMessage message = chatList.get(position);
if(message.isAdmin()){
return TYPE.ADMIN.ordinal();
} else if (message.isEnterExitNotification()){
return TYPE.ENTER_NOTIFICATION.ordinal();
} else if (message.isNotification()){
return TYPE.NOTIFICATION.ordinal();
} else {
if(message.isMine()){
return TYPE.SEND.ordinal();
} else{
return TYPE.RECEIVE.ordinal();
}
}
}
private void setAdminComponent(AdminViewHolder holder, AhMessage chat){
String time = chat.getTimeStamp();
String hour = time.substring(8, 10);
String minute = time.substring(10, 12);
holder.timeText.setText(hour + ":" + minute);
holder.messageText.setText(chat.getContent());
}
private void setEnterNotificationComponent(EnterNotificationViewHolder holder, AhMessage chat){
holder.nickNameText.setText(chat.getSender());
holder.messageText.setText(chat.getContent());
}
private void setNotificationComponent(NotificationViewHolder holder, AhMessage chat){
holder.messageText.setText(chat.getContent());
}
private void setSendComponent(SendViewHolder holder, final AhMessage chat){
holder.failButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showReSendOrCancelDialog(chat, true);
}
});
final int status = chat.getStatus();
if(status == AhMessage.STATUS.SENDING.getValue()){
holder.timeText.setVisibility(View.GONE);
holder.failButton.setVisibility(View.GONE);
holder.progressBar.setVisibility(View.VISIBLE);
}else if(status == AhMessage.STATUS.SENT.getValue()){
String time = chat.getTimeStamp();
String hour = time.substring(8, 10);
String minute = time.substring(10, 12);
holder.timeText.setText(hour + ":" + minute);
holder.timeText.setVisibility(View.VISIBLE);
holder.failButton.setVisibility(View.GONE);
holder.progressBar.setVisibility(View.GONE);
}else if(status == AhMessage.STATUS.FAIL.getValue()){
holder.timeText.setVisibility(View.GONE);
holder.failButton.setVisibility(View.VISIBLE);
holder.progressBar.setVisibility(View.GONE);
}
/*
* Find and Set Common UI component
*/
holder.messageText.setText(chat.getContent());
holder.messageText.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
boolean cancel = true;
if(status == AhMessage.STATUS.SENT.getValue()){
cancel = false;
}
showReSendOrCancelDialog(chat, cancel);
return false;
}
});
}
private void setReceiveComponent(ReceiveViewHolder holder, final AhMessage chat){
final AhUser user = userDBHelper.getUser(chat.getSenderId(), true);
if (user == null) return;
holder.messageText.setText(chat.getContent());
holder.messageText.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showReSendOrCancelDialog(chat, false);
return false;
}
});
holder.nickNameText.setText(chat.getSender());
if(user.isMale()){
holder.nickNameText.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.general_gender_m, 0);
} else{
holder.nickNameText.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.general_gender_w, 0);
}
String time = chat.getTimeStamp();
String hour = time.substring(8, 10);
String minute = time.substring(10, 12);
holder.timeText.setText(hour + ":" + minute);
blobStorageHelper.setImageViewAsync(frag, BlobStorageHelper.USER_PROFILE,
user.getId()+AhGlobalVariable.SMALL, R.drawable.profile_default, holder.profileImage, true);
holder.profileImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
app.getGAHelper().sendEventGA(
frag.getClass().getSimpleName(),
"ViewOthersProfile",
"ChatProfile");
ProfileDialog profileDialog = new ProfileDialog(frag, user,
new AhDialogCallback() {
@Override
public void doPositiveThing(Bundle bundle) {
app.getGAHelper().sendEventGA(
frag.getClass().getSimpleName(),
"SendChupa",
"ChatSendChupa");
Intent intent = new Intent(context, ChupaChatActivity.class);
intent.putExtra(AhGlobalVariable.USER_KEY, user);
context.startActivity(intent);
}
@Override
public void doNegativeThing(Bundle bundle) {
Intent intent = new Intent(context, ProfileImageActivity.class);
intent.putExtra(AhGlobalVariable.USER_KEY, user);
context.startActivity(intent);
}
});
profileDialog.show(frag.getFragmentManager(), AhGlobalVariable.DIALOG_KEY);
}
});
}
private void showReSendOrCancelDialog(final AhMessage chat, boolean cancel){
Resources resources = context.getResources();
String dialogMessage = resources.getString(R.string.send_message_fail_message);
String resend = resources.getString(R.string.re_send);
String delete = resources.getString(R.string.delete);
final ChatFragment chatFragment = (ChatFragment)frag;
AhAlertDialog reSendOrCancelDialog = new AhAlertDialog(null, dialogMessage, delete, resend, cancel, new AhDialogCallback() {
@Override
public void doPositiveThing(Bundle bundle) {
removeChat(chat);
}
@Override
public void doNegativeThing(Bundle bundle) {
// Re Send
removeChat(chat);
chatFragment.sendChat(chat);
}
});
reSendOrCancelDialog.show(frag.getFragmentManager(), AhGlobalVariable.DIALOG_KEY);
}
private void removeChat(AhMessage chat){
messageDBHelper.deleteMessage(chat.getId());
notifyItemRemoved(chatList.indexOf(chat));
chatList.remove(chat);
}
}