ChatRoomConnect.java 7.03 KB
package com.cnlive.goldenline.util;

import android.text.TextUtils;

import com.cnlive.libs.util.chat.ChatUtil;
import com.cnlive.libs.util.chat.base.IChat;
import com.cnlive.libs.util.chat.model.CNMessage;
import com.cnlive.libs.util.chat.model.CNUserInfo;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

/**
 * Created by xiansong on 2016/5/13.
 */
public class ChatRoomConnect implements IChat.OnReceiveMessageListener, IChat.OnConnectStatusListener, IChat.OnLatestMessageListener {

    public static final int StateConnect = 2001;
    public static final int StateJoin = 2004;
    public static final int StateDisconnect = 2002;
    public static final int StateConnecting = 2003;

    public static final int ErrorConnect = 1001;
    public static final int ErrorChat = 1002;
    public static final int ErrorDisconnect = 1003;
    public static final int ErrorSend = 1005;

    private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.getDefault());

    private String mRoomId, mUserName, mUserIcon, mUserId;

    private ChatCallback callback;

    static {
        simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+8"));
    }

    public ChatRoomConnect(ChatCallback callback) {
        this.callback = callback;
    }

    public interface ChatCallback {
        void onChatState(int what);

        void onChatMessage(String type, String uid, String from, String icon, String body, Date date, boolean self);
    }


    public void connect(String roomId, String userId, String userName, String userIcon) {
        mRoomId = roomId;
        mUserName = userName;
        mUserIcon = userIcon;
        mUserId = userId;
        ChatUtil.setOnReceiveMessageListener(this);
        ChatUtil.setConnectStatusListener(this);

        ChatUtil.connect(new CNUserInfo(userId, userName, userIcon), new IChat.OnConnectListener() {
            @Override
            public void onSuccess(String s) {
                onState(StateConnect);
                if (!TextUtils.isEmpty(mRoomId))
                    ChatUtil.joinChatRoom(mRoomId, 0, new IChat.OnOperationListener() {
                        @Override
                        public void onSuccess(int i, String s) {
                            onState(StateJoin);
                        }

                        @Override
                        public void onError(int i, String s) {
                            onState(ErrorChat);
                        }
                    });
            }

            @Override
            public void onTokenIncorrect() {
                onState(ErrorConnect);
            }

            @Override
            public void onError(int i, String s) {
                onState(ErrorConnect);
            }
        });
    }

    public void disconnect() {
        if (!TextUtils.isEmpty(mRoomId))
            ChatUtil.quitChatRoom(mRoomId, new IChat.OnOperationListener() {
                @Override
                public void onSuccess(int i, String s) {
                }

                @Override
                public void onError(int i, String s) {
                    onState(ErrorDisconnect);
                }
            });
        ChatUtil.removeReceiveMessageListener(this);
        ChatUtil.disconnect(false);
        callback = null;
    }

    public void sendRoomMessage(String message) {
        if (!TextUtils.isEmpty(mRoomId)) sendMessage(IChat.CHATROOM, mRoomId, message);
    }

    public void sendPrivateMessage(String userId, String message) {
        if (!TextUtils.isEmpty(userId)) sendMessage(IChat.PRIVATE, userId, message);
    }

    public void sendMessage(final String type, String id, String message) {
        ChatUtil.sendMessage(type, id, message, new IChat.OnSendMessageListener() {
            @Override
            public void onAttached(CNMessage cnMessage) {

            }

            @Override
            public void onSuccess(CNMessage cnMessage) {
                String body = cnMessage.getContent();
                Date date = new Date();

                onMessage(type, mUserId, mUserName, mUserIcon, body, date, true);
            }

            @Override
            public void onError(CNMessage cnMessage, int i, String s) {
                onState(ErrorSend);
            }
        });
    }

    @Override
    public void processMessage(CNMessage cnMessage) {
        if (cnMessage == null) return;
        switch (cnMessage.getConversationType()) {
            case IChat.PRIVATE:
                if (!TextUtils.isEmpty(mUserId) && mUserId.equals(cnMessage.getTargetId()))
                    onMessage(cnMessage);
                break;
            case IChat.CHATROOM:
                if (!TextUtils.isEmpty(mRoomId) && mRoomId.equals(cnMessage.getTargetId()))
                    onMessage(cnMessage);
                break;

        }

    }

    private void onMessage(CNMessage cnMessage) {
        String from = cnMessage.getUserInfo() == null ? "" : cnMessage.getUserInfo().getUserName();
        String body = cnMessage.getContent();
        String icon = cnMessage.getUserInfo() == null ? "" : cnMessage.getUserInfo().getHeadUrl();
        String fromid = cnMessage.getUserInfo() == null ? "" : cnMessage.getUserInfo().getUserId();
        Date date = new Date();
        String type = cnMessage.getConversationType();
        onMessage(type, fromid, from, icon, body, date, fromid != null && fromid.equals(mUserId));
    }

    @Override
    public void onConnectStatus(int i, String s) {
        switch (i) {
            case IChat.CONNECTED:
                onState(StateConnect);
                break;
            case IChat.CONNECTING:
                onState(StateConnecting);
                break;
            case IChat.DISCONNECTED:
            case IChat.NETWORK_UNAVAILABLE:
                onState(StateDisconnect);
                break;
        }
    }

    public interface OnPrivateConnectListener {
        void onSuccess();

        void onError(int i, String s);
    }

    private OnPrivateConnectListener mPrivateConnectListener;

    public void getLatestMessages(String privateId, int count, OnPrivateConnectListener listener) {
        this.mPrivateConnectListener = listener;
        ChatUtil.getLatestMessages(privateId, count, this);
    }

    @Override
    public void onSuccess(List<CNMessage> list) {
        if (mPrivateConnectListener != null) mPrivateConnectListener.onSuccess();
        for (int i = list.size() - 1; i >= 0; i--) onMessage(list.get(i));
    }

    @Override
    public void onError(int i, String s) {
        if (mPrivateConnectListener != null) mPrivateConnectListener.onError(i, s);
    }

    private void onState(int what) {
        if (callback != null) callback.onChatState(what);
    }

    private void onMessage(String type, String fromid, String from, String icon, String body, Date date, boolean self) {
        if (callback != null) callback.onChatMessage(type, fromid, from, icon, body, date, self);
    }

    public void setCallback(ChatCallback callback) {
        this.callback = callback;
    }

}