package com.wuxiaolong.wochat.ui.chat; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.avos.avoscloud.im.v2.AVIMConversation; import com.avos.avoscloud.im.v2.AVIMException; import com.avos.avoscloud.im.v2.AVIMMessage; import com.avos.avoscloud.im.v2.AVIMTypedMessage; import com.avos.avoscloud.im.v2.callback.AVIMConversationCallback; import com.avos.avoscloud.im.v2.callback.AVIMMessagesQueryCallback; import com.avos.avoscloud.im.v2.messages.AVIMTextMessage; import com.avoscloud.leanchatlib.adapter.MultipleItemAdapter; import com.avoscloud.leanchatlib.event.ImTypeMessageEvent; import com.avoscloud.leanchatlib.event.ImTypeMessageResendEvent; import com.avoscloud.leanchatlib.event.InputBottomBarTextEvent; import com.avoscloud.leanchatlib.ui.BaseFragment; import com.avoscloud.leanchatlib.view.AVInputBottomBar; import com.wuxiaolong.wochat.R; import java.util.List; import butterknife.Bind; import de.greenrobot.event.EventBus; /** */ public class ChatFragment extends BaseFragment { @Bind(R.id.swipeRefreshLayout) SwipeRefreshLayout swipeRefreshLayout; @Bind(R.id.chatRecyclerView) RecyclerView chatRecyclerView; @Bind(R.id.chatInputbottombar) AVInputBottomBar chatInputbottombar; LinearLayoutManager mLinearLayoutManager; MultipleItemAdapter mMultipleItemAdapter; protected AVIMConversation mAVIMConversation; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_chat, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); EventBus.getDefault().register(this); mLinearLayoutManager = new LinearLayoutManager(mActivity); mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); chatRecyclerView.setLayoutManager(mLinearLayoutManager); mMultipleItemAdapter = new MultipleItemAdapter(); chatRecyclerView.setAdapter(mMultipleItemAdapter); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { AVIMMessage message = mMultipleItemAdapter.getFirstMessage(); if (message != null) { mAVIMConversation.queryMessages(message.getMessageId(), message.getTimestamp(), 20, new AVIMMessagesQueryCallback() { @Override public void done(List<AVIMMessage> list, AVIMException e) { swipeRefreshLayout.setRefreshing(false); if (filterException(e)) { if (null != list && list.size() > 0) { addMessageList(list); } } } }); } else { swipeRefreshLayout.setRefreshing(false); } } }); } void addMessageList(List<AVIMMessage> list) { mMultipleItemAdapter.addMessageList(list); mMultipleItemAdapter.notifyDataSetChanged(); mLinearLayoutManager.scrollToPositionWithOffset(list.size() - 1, 0); } @Override public void onResume() { super.onResume(); Log.e("wxl", "ChatFragment onResume"); if (null != mAVIMConversation) { // NotificationUtils.addTag(mAVIMConversation.getConversationId()); } } @Override public void onPause() { super.onPause(); Log.e("wxl", "ChatFragment onPause"); if (null != mAVIMConversation) { // NotificationUtils.removeTag(mAVIMConversation.getConversationId()); } } public void setConversation(AVIMConversation conversation) { mAVIMConversation = conversation; swipeRefreshLayout.setEnabled(true); swipeRefreshLayout.setRefreshing(true); chatInputbottombar.setTag(mAVIMConversation.getConversationId()); fetchMessages(); // NotificationUtils.addTag(conversation.getConversationId()); } /** * 拉取消息,必须加入 conversation 后才能拉取消息 */ private void fetchMessages() { mAVIMConversation.queryMessages( new AVIMMessagesQueryCallback() { @Override public void done(List<AVIMMessage> list, AVIMException e) { swipeRefreshLayout.setRefreshing(false); if (filterException(e)) { if (null != list && list.size() > 0) { fetchMessages(list); } } else { Log.e("wxl", "fetchMessages AVIMException=" + e.getMessage()); } } } ); } void fetchMessages(List<AVIMMessage> list) { mMultipleItemAdapter.setMessageList(list); chatRecyclerView.setAdapter(mMultipleItemAdapter); mMultipleItemAdapter.notifyDataSetChanged(); scrollToBottom(); } private void scrollToBottom() { mLinearLayoutManager.scrollToPositionWithOffset(mMultipleItemAdapter.getItemCount() - 1, 0); } @Override public void onDestroyView() { super.onDestroyView(); EventBus.getDefault().unregister(this); } /** * 输入事件处理,接收后构造成 AVIMTextMessage 然后发送 * 因为不排除某些特殊情况会受到其他页面过来的无效消息,所以此处加了 tag 判断 */ public void onEvent(InputBottomBarTextEvent textEvent) { if (null != mAVIMConversation && null != textEvent) { if (!TextUtils.isEmpty(textEvent.sendContent) && mAVIMConversation.getConversationId().equals(textEvent.tag)) { sendText(textEvent.sendContent); } } } private void sendText(String content) { AVIMTextMessage message = new AVIMTextMessage(); message.setText(content); sendMessage(message); } public void sendMessage(AVIMTypedMessage message) { mMultipleItemAdapter.addMessage(message); mMultipleItemAdapter.notifyDataSetChanged(); scrollToBottom(); mAVIMConversation.sendMessage(message, new AVIMConversationCallback() { @Override public void done(AVIMException e) { mMultipleItemAdapter.notifyDataSetChanged(); } }); } /** * 重新发送已经发送失败的消息 */ public void onEvent(ImTypeMessageResendEvent event) { if (null != mAVIMConversation && null != event) { if (AVIMMessage.AVIMMessageStatus.AVIMMessageStatusFailed == event.message.getMessageStatus() && mAVIMConversation.getConversationId().equals(event.message.getConversationId())) { mAVIMConversation.sendMessage(event.message, new AVIMConversationCallback() { @Override public void done(AVIMException e) { mMultipleItemAdapter.notifyDataSetChanged(); } }); mMultipleItemAdapter.notifyDataSetChanged(); } } } /** * 处理推送过来的消息 * 同理,避免无效消息,此处加了 conversation id 判断 */ public void onEvent(ImTypeMessageEvent event) { Log.e("wxl", "处理推送过来的消息"); if (null != mAVIMConversation && null != event && mAVIMConversation.getConversationId().equals(event.conversation.getConversationId())) { handleMsg(event); } } public void handleMsg(ImTypeMessageEvent event) { mMultipleItemAdapter.addMessage(event.message); mMultipleItemAdapter.notifyDataSetChanged(); scrollToBottom(); } }