/**
* Copyright (C) 2016 Hyphenate Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fanxin.easeui.adapter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import com.fanxin.easeui.utils.EaseCommonUtils;
import com.fanxin.easeui.widget.chatrow.EaseChatRow;
import com.fanxin.easeui.widget.chatrow.EaseChatRowFile;
import com.fanxin.easeui.widget.chatrow.EaseChatRowImage;
import com.fanxin.easeui.widget.chatrow.EaseChatRowText;
import com.fanxin.easeui.widget.chatrow.EaseChatRowVideo;
import com.fanxin.easeui.widget.chatrow.EaseChatRowVoice;
import com.fanxin.easeui.widget.chatrow.EaseCustomChatRowProvider;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMMessage;
import com.fanxin.easeui.EaseConstant;
import com.fanxin.easeui.widget.EaseChatMessageList.MessageListItemClickListener;
import com.fanxin.easeui.widget.chatrow.EaseChatRowBigExpression;
import com.fanxin.easeui.widget.chatrow.EaseChatRowLocation;
public class EaseMessageAdapter extends BaseAdapter{
private final static String TAG = "msg";
private Context context;
private static final int HANDLER_MESSAGE_REFRESH_LIST = 0;
private static final int HANDLER_MESSAGE_SELECT_LAST = 1;
private static final int HANDLER_MESSAGE_SEEK_TO = 2;
private static final int MESSAGE_TYPE_RECV_TXT = 0;
private static final int MESSAGE_TYPE_SENT_TXT = 1;
private static final int MESSAGE_TYPE_SENT_IMAGE = 2;
private static final int MESSAGE_TYPE_SENT_LOCATION = 3;
private static final int MESSAGE_TYPE_RECV_LOCATION = 4;
private static final int MESSAGE_TYPE_RECV_IMAGE = 5;
private static final int MESSAGE_TYPE_SENT_VOICE = 6;
private static final int MESSAGE_TYPE_RECV_VOICE = 7;
private static final int MESSAGE_TYPE_SENT_VIDEO = 8;
private static final int MESSAGE_TYPE_RECV_VIDEO = 9;
private static final int MESSAGE_TYPE_SENT_FILE = 10;
private static final int MESSAGE_TYPE_RECV_FILE = 11;
private static final int MESSAGE_TYPE_SENT_EXPRESSION = 12;
private static final int MESSAGE_TYPE_RECV_EXPRESSION = 13;
public int itemTypeCount;
// reference to conversation object in chatsdk
private EMConversation conversation;
EMMessage[] messages = null;
private String toChatUsername;
private MessageListItemClickListener itemClickListener;
private EaseCustomChatRowProvider customRowProvider;
private boolean showUserNick;
private boolean showAvatar;
private Drawable myBubbleBg;
private Drawable otherBuddleBg;
private ListView listView;
public EaseMessageAdapter(Context context, String username, int chatType, ListView listView) {
this.context = context;
this.listView = listView;
toChatUsername = username;
this.conversation = EMClient.getInstance().chatManager().getConversation(username, EaseCommonUtils.getConversationType(chatType), true);
}
Handler handler = new Handler() {
private void refreshList() {
// you should not call getAllMessages() in UI thread
// otherwise there is problem when refreshing UI and there is new message arrive
messages = (EMMessage[]) conversation.getAllMessages().toArray(new EMMessage[0]);
conversation.markAllMessagesAsRead();
notifyDataSetChanged();
}
@Override
public void handleMessage(android.os.Message message) {
switch (message.what) {
case HANDLER_MESSAGE_REFRESH_LIST:
refreshList();
break;
case HANDLER_MESSAGE_SELECT_LAST:
if (messages.length > 0) {
listView.setSelection(messages.length - 1);
}
break;
case HANDLER_MESSAGE_SEEK_TO:
int position = message.arg1;
listView.setSelection(position);
break;
default:
break;
}
}
};
public void refresh() {
if (handler.hasMessages(HANDLER_MESSAGE_REFRESH_LIST)) {
return;
}
android.os.Message msg = handler.obtainMessage(HANDLER_MESSAGE_REFRESH_LIST);
handler.sendMessage(msg);
}
/**
* refresh and select the last
*/
public void refreshSelectLast() {
final int TIME_DELAY_REFRESH_SELECT_LAST = 100;
handler.removeMessages(HANDLER_MESSAGE_REFRESH_LIST);
handler.removeMessages(HANDLER_MESSAGE_SELECT_LAST);
handler.sendEmptyMessageDelayed(HANDLER_MESSAGE_REFRESH_LIST, TIME_DELAY_REFRESH_SELECT_LAST);
handler.sendEmptyMessageDelayed(HANDLER_MESSAGE_SELECT_LAST, TIME_DELAY_REFRESH_SELECT_LAST);
}
/**
* refresh and seek to the position
*/
public void refreshSeekTo(int position) {
handler.sendMessage(handler.obtainMessage(HANDLER_MESSAGE_REFRESH_LIST));
android.os.Message msg = handler.obtainMessage(HANDLER_MESSAGE_SEEK_TO);
msg.arg1 = position;
handler.sendMessage(msg);
}
public EMMessage getItem(int position) {
if (messages != null && position < messages.length) {
return messages[position];
}
return null;
}
public long getItemId(int position) {
return position;
}
/**
* get count of messages
*/
public int getCount() {
return messages == null ? 0 : messages.length;
}
/**
* get number of message type, here 14 = (EMMessage.Type) * 2
*/
public int getViewTypeCount() {
if(customRowProvider != null && customRowProvider.getCustomChatRowTypeCount() > 0){
return customRowProvider.getCustomChatRowTypeCount() + 14;
}
return 14;
}
/**
* get type of item
*/
public int getItemViewType(int position) {
EMMessage message = getItem(position);
if (message == null) {
return -1;
}
if(customRowProvider != null && customRowProvider.getCustomChatRowType(message) > 0){
return customRowProvider.getCustomChatRowType(message) + 13;
}
if (message.getType() == EMMessage.Type.TXT) {
if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){
return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_EXPRESSION : MESSAGE_TYPE_SENT_EXPRESSION;
}
return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_TXT : MESSAGE_TYPE_SENT_TXT;
}
if (message.getType() == EMMessage.Type.IMAGE) {
return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_IMAGE : MESSAGE_TYPE_SENT_IMAGE;
}
if (message.getType() == EMMessage.Type.LOCATION) {
return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_LOCATION : MESSAGE_TYPE_SENT_LOCATION;
}
if (message.getType() == EMMessage.Type.VOICE) {
return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VOICE : MESSAGE_TYPE_SENT_VOICE;
}
if (message.getType() == EMMessage.Type.VIDEO) {
return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_VIDEO : MESSAGE_TYPE_SENT_VIDEO;
}
if (message.getType() == EMMessage.Type.FILE) {
return message.direct() == EMMessage.Direct.RECEIVE ? MESSAGE_TYPE_RECV_FILE : MESSAGE_TYPE_SENT_FILE;
}
return -1;// invalid
}
protected EaseChatRow createChatRow(Context context, EMMessage message, int position) {
EaseChatRow chatRow = null;
if(customRowProvider != null && customRowProvider.getCustomChatRow(message, position, this) != null){
return customRowProvider.getCustomChatRow(message, position, this);
}
switch (message.getType()) {
case TXT:
if(message.getBooleanAttribute(EaseConstant.MESSAGE_ATTR_IS_BIG_EXPRESSION, false)){
chatRow = new EaseChatRowBigExpression(context, message, position, this);
}else{
chatRow = new EaseChatRowText(context, message, position, this);
}
break;
case LOCATION:
chatRow = new EaseChatRowLocation(context, message, position, this);
break;
case FILE:
chatRow = new EaseChatRowFile(context, message, position, this);
break;
case IMAGE:
chatRow = new EaseChatRowImage(context, message, position, this);
break;
case VOICE:
chatRow = new EaseChatRowVoice(context, message, position, this);
break;
case VIDEO:
chatRow = new EaseChatRowVideo(context, message, position, this);
break;
default:
break;
}
return chatRow;
}
@SuppressLint("NewApi")
public View getView(final int position, View convertView, ViewGroup parent) {
EMMessage message = getItem(position);
if(convertView == null){
convertView = createChatRow(context, message, position);
}
//refresh ui with messages
((EaseChatRow)convertView).setUpView(message, position, itemClickListener);
return convertView;
}
public String getToChatUsername(){
return toChatUsername;
}
public void setShowUserNick(boolean showUserNick) {
this.showUserNick = showUserNick;
}
public void setShowAvatar(boolean showAvatar) {
this.showAvatar = showAvatar;
}
public void setMyBubbleBg(Drawable myBubbleBg) {
this.myBubbleBg = myBubbleBg;
}
public void setOtherBuddleBg(Drawable otherBuddleBg) {
this.otherBuddleBg = otherBuddleBg;
}
public void setItemClickListener(MessageListItemClickListener listener){
itemClickListener = listener;
}
public void setCustomChatRowProvider(EaseCustomChatRowProvider rowProvider){
customRowProvider = rowProvider;
}
public boolean isShowUserNick() {
return showUserNick;
}
public boolean isShowAvatar() {
return showAvatar;
}
public Drawable getMyBubbleBg() {
return myBubbleBg;
}
public Drawable getOtherBuddleBg() {
return otherBuddleBg;
}
}