package com.pinthecloud.athere.adapter; import android.app.Fragment; import android.content.Context; import android.content.res.Resources; import android.os.Bundle; 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.ArrayAdapter; import android.widget.ImageButton; 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.database.MessageDBHelper; import com.pinthecloud.athere.dialog.AhAlertDialog; import com.pinthecloud.athere.fragment.ChupaChatFragment; import com.pinthecloud.athere.interfaces.AhDialogCallback; import com.pinthecloud.athere.model.AhMessage; public class ChupaChatListAdapter extends ArrayAdapter<AhMessage> { private enum TYPE{ EXIT_NOTIFICATION, SEND, RECEIVE } private Context context; private Fragment frag; private LayoutInflater inflater; private MessageDBHelper messageDBHelper; public ChupaChatListAdapter(Context context, Fragment frag) { super(context, 0); this.context = context; this.frag = frag; this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); AhApplication app = AhApplication.getInstance(); this.messageDBHelper = app.getMessageDBHelper(); } @Override public View getView(final int position, View convertView, ViewGroup parent){ View view = convertView; int type = getItemViewType(position); if (view == null) { if(type == TYPE.EXIT_NOTIFICATION.ordinal()){ view = inflater.inflate(R.layout.row_chat_list_enter_notification, parent, false); } else if(type == TYPE.SEND.ordinal()){ view = inflater.inflate(R.layout.row_chupa_chat_list_send, parent, false); } else if(type == TYPE.RECEIVE.ordinal()){ view = inflater.inflate(R.layout.row_chupa_chat_list_receive, parent, false); } } final AhMessage message = this.getItem(position); if (message != null) { TextView messageText = null; if(type == TYPE.EXIT_NOTIFICATION.ordinal()){ /* * Find and Set all UI component */ TextView nickNameText = (TextView)view.findViewById(R.id.row_chat_list_enter_exit_notification_nick_name); nickNameText.setText(message.getSender()); messageText = (TextView)view.findViewById(R.id.row_chat_list_enter_exit_notification_message); }else if(type == TYPE.SEND.ordinal()){ /* * Find UI component only in receive list */ TextView timeText = (TextView)view.findViewById(R.id.row_chupa_chat_list_send_time); ImageButton failButton = (ImageButton)view.findViewById(R.id.row_chupa_chat_list_send_fail); ProgressBar progressBar = (ProgressBar)view.findViewById(R.id.row_chupa_chat_list_send_progress_bar); /* * Set UI component only in send list */ failButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showReSendOrCancelDialog(message, position, true); } }); final int status = message.getStatus(); if(status == AhMessage.STATUS.SENDING.getValue()){ timeText.setVisibility(View.GONE); failButton.setVisibility(View.GONE); progressBar.setVisibility(View.VISIBLE); }else if(status == AhMessage.STATUS.SENT.getValue()){ String time = message.getTimeStamp(); String hour = time.substring(8, 10); String minute = time.substring(10, 12); timeText.setText(hour + ":" + minute); timeText.setVisibility(View.VISIBLE); failButton.setVisibility(View.GONE); progressBar.setVisibility(View.GONE); }else if(status == AhMessage.STATUS.FAIL.getValue()){ timeText.setVisibility(View.GONE); failButton.setVisibility(View.VISIBLE); progressBar.setVisibility(View.GONE); } /* * Common UI component */ messageText = (TextView)view.findViewById(R.id.row_chupa_chat_list_send_message); messageText.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { boolean cancel = true; if(status == AhMessage.STATUS.SENT.getValue()){ cancel = false; } showReSendOrCancelDialog(message, position, cancel); return false; } }); } else if(type == TYPE.RECEIVE.ordinal()){ /* * Get other user and find Common UI component */ messageText = (TextView)view.findViewById(R.id.row_chupa_chat_list_receive_message); messageText.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { showReSendOrCancelDialog(message, position, false); return false; } }); TextView timeText = (TextView)view.findViewById(R.id.row_chupa_chat_list_receive_time); String time = message.getTimeStamp(); String hour = time.substring(8, 10); String minute = time.substring(10, 12); timeText.setText(hour + ":" + minute); } /* * Set Shared UI component */ messageText.setText(message.getContent()); } return view; } @Override public boolean isEnabled(int position) { return false; } @Override public int getViewTypeCount() { return TYPE.values().length; } @Override public int getItemViewType(int position) { // Inflate different layout by user AhMessage message = getItem(position); if(message.isEnterExitNotification()){ return TYPE.EXIT_NOTIFICATION.ordinal(); }else{ if(message.isMine()){ return TYPE.SEND.ordinal(); } else{ return TYPE.RECEIVE.ordinal(); } } } private void showReSendOrCancelDialog(final AhMessage message, final int position, 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); AhAlertDialog reSendOrCancelDialog = new AhAlertDialog(null, dialogMessage, delete, resend, cancel, new AhDialogCallback() { @Override public void doPositiveThing(Bundle bundle) { // Delete messageDBHelper.deleteMessage(message.getId()); remove(getItem(position)); } @Override public void doNegativeThing(Bundle bundle) { // Re Send messageDBHelper.deleteMessage(message.getId()); remove(getItem(position)); ChupaChatFragment squareChatFragment = (ChupaChatFragment)frag; squareChatFragment.sendChupa(message); } }); reSendOrCancelDialog.show(frag.getFragmentManager(), AhGlobalVariable.DIALOG_KEY); } }