PrivateChatActivity.java 8.95 KB
package com.cnlive.chat.ui;

import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
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;
import java.util.Collections;
import java.util.List;

public class PrivateChatActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "PrivateChatActivity";
    private ListView chatListView;
    private EditText messageContent;
    private Button sendMessageBtn;

    private static String targetId;

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

    private CNMessage cnMessage;

    private Handler mHandler;
    private CNUserInfo userInfo;

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

        userInfo = new CNUserInfo("2017010102", "J", "http://7xs9j5.com1.z0.glb.clouddn.com/liveapp/guojunwang.jpg");
        //连接服务器 当没有用户信息时可以传入null
        ChatUtil.connect(userInfo);
        targetId = "2017010101";

        mHandler = new Handler();
        ChatUtil.setOnResultListener(onResultListener);
        ChatUtil.setOnSendMessageListener(onSendMessageListener);
        ChatUtil.setOnLatestMessageListener(latestMessageListener);
        initView();
        ChatUtil.setOnReceiveMessageListener(onMessageListener);
        ChatUtil.setConnectStatusListener(onConnectStatusListener);
        ChatUtil.setOnConnectionListener(onConnectListener);
//        Intent intent = getIntent();
//        getPushMessage(intent);
    }


    private void initView() {
        chatListView = (ListView) findViewById(R.id.private_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);
    }

//    @Override
//    protected void onNewIntent(Intent intent) {
//        super.onNewIntent(intent);
//        getPushMessage(intent);
//    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.send_message:
                //发送私聊消息,需要传入目标ID与发送的消息内容
                if (messageContent.getText().toString().isEmpty()) {
                    Toast.makeText(this, "不能发送空消息呦~", Toast.LENGTH_SHORT).show();
                } else {
                    ChatUtil.sendMessage(IChat.PRIVATE, targetId, messageContent.getText().toString());
                    messageContent.setText("");
                }
                break;
        }
    }

    /**
     * 发送消息监听
     */
    private IChat.OnSendMessageListener onSendMessageListener = new IChat.OnSendMessageListener() {
        @Override
        public void onSuccess(Integer integer) {
            //聊天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());
            cnMessage = message;
        }

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

    /**
     * 获取单聊的历史消息监听,消息按照时间顺序从新到旧排列
     */
    private IChat.OnLatestMessageListener latestMessageListener = new IChat.OnLatestMessageListener() {
        @Override
        public void onSuccess(final List<CNMessage> messages) {
            for (CNMessage cnMessage : messages) {
                Log.i(TAG, "latestMessage" + cnMessage.getContent());
            }

            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    messageList.addAll(messages);
                    Collections.reverse(messageList);
                    chatListAdapter.updateItems(messageList);
                    chatListAdapter.notifyDataSetChanged();
                }
            });
        }

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

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

        @Override
        public void onSuccess(String s) {
            Log.i(TAG, "ConnectListener " + s);
            //聊天SDK若想获得聊天历史,需要调用此方法,需要传入目标ID与获取消息数量
            ChatUtil.getLatestMessages(targetId, 20);
        }

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

    /**
     * 接收消息监听
     */
    private IChat.OnReceiveMessageListener onMessageListener = new IChat.OnReceiveMessageListener() {
        @Override
        public void processMessage(final CNMessage message) {
            Log.e(TAG, 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:
                    //用户在其他设备登录,本机会被踢掉线
                    break;
            }
        }
    };

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

//    /**
//     * push消息
//     */
//    private void getPushMessage(Intent intent) {
//        if (intent != null && intent.getData() != null && intent.getData().getScheme().equals("rong")) {
//            String content = intent.getData().getQueryParameter("pushContent");
//            String id = intent.getData().getQueryParameter("pushId");
//            String extra = intent.getData().getQueryParameter("extra");
//            RongIMClient.getInstance().recordNotificationEvent(id);
//
//            Log.e("DemoView", "--content--" + content + "--id--" + id + "--extra--" + extra);
//        }
//    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        //断开连接 传入true时,可以接收push消息;传入false时,不能接收push消息
        ChatUtil.disconnect(true);
    }
}