package com.fanxin.easeui.widget.chatrow;
import java.util.Date;
import com.hyphenate.EMCallBack;
import com.hyphenate.EMError;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMMessage.Direct;
import com.hyphenate.easeui.R;
import com.fanxin.easeui.adapter.EaseMessageAdapter;
import com.fanxin.easeui.utils.EaseUserUtils;
import com.fanxin.easeui.widget.EaseChatMessageList;
import com.fanxin.easeui.widget.EaseChatMessageList.MessageListItemClickListener;
import com.hyphenate.util.DateUtils;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public abstract class EaseChatRow extends LinearLayout {
protected static final String TAG = EaseChatRow.class.getSimpleName();
protected LayoutInflater inflater;
protected Context context;
protected BaseAdapter adapter;
protected EMMessage message;
protected int position;
protected TextView timeStampView;
protected ImageView userAvatarView;
protected View bubbleLayout;
protected TextView usernickView;
protected TextView percentageView;
protected ProgressBar progressBar;
protected ImageView statusView;
protected Activity activity;
protected TextView ackedView;
protected TextView deliveredView;
protected EMCallBack messageSendCallback;
protected EMCallBack messageReceiveCallback;
protected MessageListItemClickListener itemClickListener;
public EaseChatRow(Context context, EMMessage message, int position, BaseAdapter adapter) {
super(context);
this.context = context;
this.activity = (Activity) context;
this.message = message;
this.position = position;
this.adapter = adapter;
inflater = LayoutInflater.from(context);
initView();
}
private void initView() {
onInflatView();
timeStampView = (TextView) findViewById(R.id.timestamp);
userAvatarView = (ImageView) findViewById(R.id.iv_userhead);
bubbleLayout = findViewById(R.id.bubble);
usernickView = (TextView) findViewById(R.id.tv_userid);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
statusView = (ImageView) findViewById(R.id.msg_status);
ackedView = (TextView) findViewById(R.id.tv_ack);
deliveredView = (TextView) findViewById(R.id.tv_delivered);
onFindViewById();
}
/**
* set property according message and postion
*
* @param message
* @param position
*/
public void setUpView(EMMessage message, int position,
EaseChatMessageList.MessageListItemClickListener itemClickListener) {
this.message = message;
this.position = position;
this.itemClickListener = itemClickListener;
setUpBaseView();
onSetUpView();
setClickListener();
}
private void setUpBaseView() {
// set nickname, avatar and background of bubble
TextView timestamp = (TextView) findViewById(R.id.timestamp);
if (timestamp != null) {
if (position == 0) {
timestamp.setText(DateUtils.getTimestampString(new Date(message.getMsgTime())));
timestamp.setVisibility(View.VISIBLE);
} else {
// show time stamp if interval with last message is > 30 seconds
EMMessage prevMessage = (EMMessage) adapter.getItem(position - 1);
if (prevMessage != null && DateUtils.isCloseEnough(message.getMsgTime(), prevMessage.getMsgTime())) {
timestamp.setVisibility(View.GONE);
} else {
timestamp.setText(DateUtils.getTimestampString(new Date(message.getMsgTime())));
timestamp.setVisibility(View.VISIBLE);
}
}
}
//set nickname and avatar
if(message.direct() == Direct.SEND){
EaseUserUtils.setUserAvatar(context, EMClient.getInstance().getCurrentUser(), userAvatarView,message);
}else{
EaseUserUtils.setUserAvatar(context, message.getFrom(), userAvatarView,message);
EaseUserUtils.setUserNick(message.getFrom(), usernickView,message);
}
if(deliveredView != null){
if (message.isDelivered()) {
deliveredView.setVisibility(View.VISIBLE);
} else {
deliveredView.setVisibility(View.INVISIBLE);
}
}
if(ackedView != null){
if (message.isAcked()) {
if (deliveredView != null) {
deliveredView.setVisibility(View.INVISIBLE);
}
ackedView.setVisibility(View.VISIBLE);
} else {
ackedView.setVisibility(View.INVISIBLE);
}
}
if (adapter instanceof EaseMessageAdapter) {
if (((EaseMessageAdapter) adapter).isShowAvatar())
userAvatarView.setVisibility(View.VISIBLE);
else
userAvatarView.setVisibility(View.GONE);
if (usernickView != null) {
if (((EaseMessageAdapter) adapter).isShowUserNick())
usernickView.setVisibility(View.VISIBLE);
else
usernickView.setVisibility(View.GONE);
}
if (message.direct() == Direct.SEND) {
if (((EaseMessageAdapter) adapter).getMyBubbleBg() != null) {
bubbleLayout.setBackgroundDrawable(((EaseMessageAdapter) adapter).getMyBubbleBg());
}
} else if (message.direct() == Direct.RECEIVE) {
if (((EaseMessageAdapter) adapter).getOtherBuddleBg() != null) {
bubbleLayout.setBackgroundDrawable(((EaseMessageAdapter) adapter).getOtherBuddleBg());
}
}
}
}
/**
* set callback for sending message
*/
protected void setMessageSendCallback(){
if(messageSendCallback == null){
messageSendCallback = new EMCallBack() {
@Override
public void onSuccess() {
updateView();
}
@Override
public void onProgress(final int progress, String status) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
if(percentageView != null)
percentageView.setText(progress + "%");
}
});
}
@Override
public void onError(int code, String error) {
updateView();
}
};
}
message.setMessageStatusCallback(messageSendCallback);
}
/**
* set callback for receiving message
*/
protected void setMessageReceiveCallback(){
if(messageReceiveCallback == null){
messageReceiveCallback = new EMCallBack() {
@Override
public void onSuccess() {
updateView();
}
@Override
public void onProgress(final int progress, String status) {
activity.runOnUiThread(new Runnable() {
public void run() {
if(percentageView != null){
percentageView.setText(progress + "%");
}
}
});
}
@Override
public void onError(int code, String error) {
updateView();
}
};
}
message.setMessageStatusCallback(messageReceiveCallback);
}
private void setClickListener() {
if(bubbleLayout != null){
bubbleLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (itemClickListener != null){
if(!itemClickListener.onBubbleClick(message)){
// if listener return false, we call default handling
onBubbleClick();
}
}
}
});
bubbleLayout.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (itemClickListener != null) {
itemClickListener.onBubbleLongClick(message);
}
return true;
}
});
}
if (statusView != null) {
statusView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (itemClickListener != null) {
itemClickListener.onResendClick(message);
}
}
});
}
if(userAvatarView != null){
userAvatarView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (itemClickListener != null) {
if (message.direct() == Direct.SEND) {
itemClickListener.onUserAvatarClick(EMClient.getInstance().getCurrentUser());
} else {
itemClickListener.onUserAvatarClick(message.getFrom());
}
}
}
});
userAvatarView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(itemClickListener != null){
if (message.direct() == Direct.SEND) {
itemClickListener.onUserAvatarLongClick(EMClient.getInstance().getCurrentUser());
} else {
itemClickListener.onUserAvatarLongClick(message.getFrom());
}
return true;
}
return false;
}
});
}
}
protected void updateView() {
activity.runOnUiThread(new Runnable() {
public void run() {
if (message.status() == EMMessage.Status.FAIL) {
if (message.getError() == EMError.MESSAGE_INCLUDE_ILLEGAL_CONTENT) {
Toast.makeText(activity,activity.getString(R.string.send_fail) + activity.getString(R.string.error_send_invalid_content), Toast.LENGTH_SHORT).show();
} else if (message.getError() == EMError.GROUP_NOT_JOINED) {
Toast.makeText(activity,activity.getString(R.string.send_fail) + activity.getString(R.string.error_send_not_in_the_group), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(activity,activity.getString(R.string.send_fail) + activity.getString(R.string.connect_failuer_toast), Toast.LENGTH_SHORT).show();
}
}
onUpdateView();
}
});
}
protected abstract void onInflatView();
/**
* find view by id
*/
protected abstract void onFindViewById();
/**
* refresh list view when message status change
*/
protected abstract void onUpdateView();
/**
* setup view
*
*/
protected abstract void onSetUpView();
/**
* on bubble clicked
*/
protected abstract void onBubbleClick();
}