ChatRoomActivity.java 11.3 KB
package com.cnlive.chat.ui;

import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.cnlive.chat.R;
import com.cnlive.chat.adapter.ChatListAdapter;
import com.cnlive.libs.chat.ChatUtil;
import com.cnlive.libs.chat.base.IChat;
import com.cnlive.libs.chat.model.CNMessage;
import com.cnlive.libs.chat.model.CNUserInfo;

import java.util.ArrayList;

public class ChatRoomActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "ChatRoomActivity";
    private ListView chatListView;
    private EditText messageContent;
    private Button sendMessageBtn;
    private Button changeUserInfo;
    private Button exchangeUser;

    private String roomId = "ChatRoom01";
    private CNUserInfo userInfo;

    private ChatListAdapter chatListAdapter;
    private ArrayList<CNMessage> messageList = new ArrayList<>();
    private CNMessage cnMessage;

    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat_room);
        initView();

        ChatUtil.setOnConnectionListener(onConnectListener);

        userInfo = new CNUserInfo("2017010102", "J", "http://7xs9j5.com1.z0.glb.clouddn.com/liveapp/guojunwang.jpg");

        //连接服务器 当没有用户信息时,可以传入null
        ChatUtil.connect(userInfo);
//        ChatUtil.connect(null);

        mHandler = new Handler(this.getMainLooper());
        ChatUtil.setOnCNChatListener(onCNChatListener);
        ChatUtil.setOnSendMessageListener(onSendMessageListener);
        ChatUtil.setOnOperationListener(onOperationListener);
        ChatUtil.setOnResultListener(onResultListener);
//        joinChatRoom();
        ChatUtil.setOnReceiveMessageListener(onMessageListener);
        ChatUtil.setConnectStatusListener(onConnectStatusListener);
        ChatUtil.setOnChatRoomActionListener(onChatRoomActionListener);
    }

    private void initView() {
        chatListView = (ListView) findViewById(R.id.chat_list_view);
        chatListAdapter = new ChatListAdapter(this);
        chatListView.setAdapter(chatListAdapter);
        messageContent = (EditText) findViewById(R.id.message_content);
        sendMessageBtn = (Button) findViewById(R.id.send_message);
        sendMessageBtn.setOnClickListener(this);
        changeUserInfo = (Button) findViewById(R.id.change_user_info);
        changeUserInfo.setOnClickListener(this);
        exchangeUser = (Button) findViewById(R.id.exchange_user);
        exchangeUser.setOnClickListener(this);
    }

    //加入聊天室
    private void joinChatRoom() {
        joinChatRoom(roomId);
    }

    private void joinChatRoom(final String roomId) {
        ChatUtil.joinExistChatRoom(roomId, 2);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.send_message:
                //发送聊天室消息
                if (messageContent.getText().toString().isEmpty()) {
                    Toast.makeText(this, "不能发送空消息呦~", Toast.LENGTH_SHORT).show();
                } else {
                    ChatUtil.sendMessage(IChat.CHATROOM, roomId, messageContent.getText().toString());
                    messageContent.setText("");
                }
                break;
            case R.id.change_user_info:
                ChatUtil.modifyUser("安生", "");
                break;
            case R.id.exchange_user:
                ChatUtil.exchangeUser(new CNUserInfo("2017010199", "七月", ""));
        }
    }


    /**
     * 发送消息监听
     */
    private IChat.OnSendMessageListener onSendMessageListener = new IChat.OnSendMessageListener() {
        @Override
        public void onSuccess(Integer integer) {
            Log.i(TAG, "SendMessageListener SUCCESS");
            //聊天SDK屏蔽用户自己发送的消息,所以在发送消息成功的时候需要根据需要处理自己的消息
            //本demo操作是在发送消息成功后,将发送消息结果监听中的message添加到listview中

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    messageList.add(cnMessage);
                    chatListAdapter.updateItems(messageList);
                    chatListAdapter.notifyDataSetChanged();
                }
            });
        }

        @Override
        public void onError(Integer integer, int what, String extra) {
            Log.e(TAG, "SendMessageListener errorCode : " + what + " errorMessage : " + extra);
        }
    };

    /**
     * 发送消息结果监听
     * 在onSuccess中返回发送的消息体
     */
    private IChat.OnResultListener onResultListener = new IChat.OnResultListener() {
        @Override
        public void onSuccess(CNMessage message) {
            Log.i(TAG, "ResultListener SUCCESS " + message.getContent() + " : " + message.getUserInfo().getUserId());
            cnMessage = message;
        }

        @Override
        public void onError(int what, String extra) {
            Log.e(TAG, "ResultListener errorCode : " + what + " errorMessage : " + extra);
        }
    };

    /**
     * 加入或退出聊天室监听
     */
    private IChat.OnOperationListener onOperationListener = new IChat.OnOperationListener() {
        @Override
        public void onSuccess(int what, String extra) {
            switch (what) {
                case IChat.SUCCESS_JOIN_EXIST_CHATROOM:
                    Log.i(TAG, "加入聊天室成功");
                    break;
                case IChat.SUCCESS_QUIT_CHATROOM:
                    Log.i(TAG, "退出聊天室成功");
                    //断开连接
                    ChatUtil.disconnect(false);
                    break;
            }
        }

        @Override
        public void onError(int what, String extra) {
            Log.e(TAG, "OperationListener errorCode : " + what + " errorMessage : " + extra);
        }
    };

    /**
     * 接收消息监听
     */
    private IChat.OnReceiveMessageListener onMessageListener = new IChat.OnReceiveMessageListener() {
        @Override
        public void processMessage(final CNMessage message) {
            Log.e(TAG, message.getUserInfo().getUserId() + " : " + message.getUserInfo().getUserName() + " : " + message.getContent());

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    messageList.add(message);
                    chatListAdapter.updateItems(messageList);
                    chatListAdapter.notifyDataSetChanged();
                }
            });
        }
    };

    /**
     * 连接状态监听
     */
    private IChat.OnConnectStatusListener onConnectStatusListener = new IChat.OnConnectStatusListener() {
        @Override
        public void onConnectStatus(int what, String extra) {
            Log.e(TAG, "errorCode : " + what + " errorMessage : " + extra);
            switch (what) {
                case IChat.CONNECTED:
                    //连接成功
                    break;
                case IChat.CONNECTING:
                    //连接中
                    break;
                case IChat.DISCONNECTED:
                    //断开连接
                    break;
                case IChat.NETWORK_UNAVAILABLE:
                    //网络不可以
                    break;
                case IChat.TOKEN_INCORRECT:
                    //Token错误
                    break;
                case IChat.SERVER_INVALID:
                    //服务器无效
                    break;
                case IChat.KICKED_OFFLINE_BY_OTHER_CLIENT:
                    //用户在其他设备登录,本机会被踢掉线
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(ChatRoomActivity.this, "用户在其他设备登录,你被挤掉啦T_T", Toast.LENGTH_SHORT).show();
                        }
                    });
                    break;
            }
        }
    };

    /**
     * 聊天室动作监听
     */
    private IChat.OnChatRoomActionListener onChatRoomActionListener = new IChat.OnChatRoomActionListener() {
        @Override
        public void onJoining(String s) {
            //加入中。。。
            Log.i(TAG, s);
        }

        @Override
        public void onJoined(String s) {
            //成功加入聊天室
            Log.i(TAG, s);
        }

        @Override
        public void onQuited(String s) {
            //退出聊天室
            Log.i(TAG, s);
        }

        @Override
        public void onError(String s, int errorCode, String errorMessage) {
            Log.e(TAG, s + " errorCode : " + errorCode + " errorMessage : " + errorMessage);
        }
    };

    /**
     * 连接服务器监听
     */
    protected IChat.OnConnectListener onConnectListener = new IChat.OnConnectListener() {
        @Override
        public void onTokenIncorrect() {
            //Token错误
            Log.e(TAG, "ConnectListener TokenIncorrect");
        }

        @Override
        public void onSuccess(String s) {
            Log.i(TAG, "ConnectListener " + s);
            joinChatRoom();
        }

        @Override
        public void onError(int what, String extra) {
            Log.e(TAG, "ConnectListener errorCode : " + what + " : errorMessage : " + extra);
        }
    };

    private IChat.OnCNChatListener onCNChatListener = new IChat.OnCNChatListener() {
        @Override
        public void onError(int what, String extra) {
            Log.e(TAG, what + " : " + extra);
            switch (what) {
                case IChat.ERROR_CHECK_AUTH:
                    //鉴权失败
                    break;
                case IChat.ERROR_CHECK_AUTH_NETWORK:
                    //鉴权时网络出错
                    break;
                case IChat.ERROR_CHECK_AUTH_OTHER:
                    //鉴权时内部出现错误
                    break;
                case IChat.ERROR_GET_TOKEN:
                    //获取token失败
                    break;
                case IChat.ERROR_GET_TOKEN_NETWORK:
                    //获取token时网络错误
                    break;
                case IChat.ERROR_GET_TOKEN_OTHER:
                    //获取token时内部出现错误
                    break;
            }
        }

        @Override
        public void onInfo(int what, String extra) {
            Log.e(TAG, what + " : " + extra);
            switch (what) {
                case IChat.SUCCESS_CHECK_AUTH:
                    //鉴权成功
                    break;
                case IChat.SUCCESS_GET_TOKEN:
                    //获取token成功
                    break;
            }
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        //退出聊天室
        ChatUtil.quitChatRoom(roomId);
    }
}