ChatUtil.java 6.68 KB
package com.cnlive.demo.chat.util;

import android.content.Context;
import android.graphics.Color;
import android.os.Handler;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.cnlive.libs.chat.Chat;
import com.cnlive.libs.chat.base.IChat;

import org.jivesoftware.smack.packet.Message;

import java.util.ArrayList;
import java.util.List;

public class ChatUtil implements IChatUtil, IChat.OnInfoListener, IChat.OnErrorListener, IChat.OnMessageListener {

    public interface OnMessageListener {
        void onMessage(String message);
    }

    private TextView mStateTextView;

    private Chat mChat;

    private Handler mHandler;

    private Context mContext;

    private OnMessageListener mMessageListener;

    private List<String> mMessageList;

    private class UpdateMessageCallback implements Handler.Callback {
        @Override
        public boolean handleMessage(android.os.Message msg)  {
            String message = null;
            if (mMessageList.size() > 0) message = mMessageList.remove(0);
            if (mMessageListener != null && message != null)
                mMessageListener.onMessage(message);
            mHandler.sendEmptyMessageDelayed(0, 500);
            return true;
        }
    }


    public ChatUtil(Context context) {
        mContext = context;
        mChat = new Chat(context);
        mMessageList = new ArrayList<>();
    }

    @Override
    public void setStateView(TextView textView) {
        mStateTextView = textView;
        if (mStateTextView != null) mStateTextView.setVisibility(View.GONE);
    }

    @Override
    public void showMessage(String msg, View.OnClickListener listener) {
        if (mStateTextView != null) mStateTextView.setOnClickListener(listener);
        showMessage(msg);
    }

    @Override
    public void showMessage(SpannableString msg, View.OnClickListener listener) {
        if (mStateTextView != null) mStateTextView.setOnClickListener(listener);
        showMessage(msg);
    }

    @Override
    public void showMessage(String msg) {
        if (mStateTextView == null) return;
        mStateTextView.setVisibility(View.VISIBLE);
        mStateTextView.setText(msg);
    }

    @Override
    public void showMessage(SpannableString msg) {
        if (mStateTextView == null) return;
        mStateTextView.setVisibility(View.VISIBLE);
        mStateTextView.setText(msg);
    }

    @Override
    public void hideMessage() {
        if (mStateTextView == null) return;
        mStateTextView.setVisibility(View.GONE);
    }

    @Override
    public void initChat(String room, String name) {
        destroy();

        mChat.setMaxStanzas(10);
        mChat.init(room, name);
        mChat.setOnMessageListener(this);
        mChat.setOnInfoListener(this);
        mChat.setOnErrorListener(this);

        mHandler = new Handler(new UpdateMessageCallback());
        mHandler.sendEmptyMessageDelayed(0, 1_000);

        mMessageList.clear();
    }

    @Override
    public void connectChat() {
        showMessage("正在连接聊天室...");
        mChat.connect();
    }

    @Override
    public boolean isJoin() {
        return mChat != null && mChat.isJoin();
    }

    @Override
    public void sendMessage(String message) {
        mChat.send(message);
    }

    public void destroy() {
        if (mMessageList != null) mMessageList.clear();
        if (mChat != null) mChat.destroy();
        if (mHandler != null) {
            mHandler.removeMessages(0);
            mHandler.removeCallbacks(null);
            mHandler = null;
        }
    }

    @Override
    public void setOnMessageListener(OnMessageListener listener) {
        mMessageListener = listener;
    }

    @Override
    public void onError(int what, String s) {
        switch (what) {
            case IChat.ErrorRoomIdNotFound://聊天室Roomid未找到
                showMessage("聊天室无法连接,点击重试");
                break;
            case IChat.ErrorInitRoomId://RoomId为空
            case IChat.ErrorInitAuth://认证失败
            case IChat.ErrorInitNetwork://未检测到网络
            case IChat.ErrorInitOther://初始化失败
                showMessage("聊天室初始化失败,点击重试", clickErrorConnect);//设置错误信息
                break;
            case IChat.ErrorConnect://连接服务器失败
            case IChat.ErrorChat://聊天室连接失败
            case IChat.ErrorName://昵称冲突
                String message = "聊天室连接失败,点击重试";
                SpannableString spannableString = new SpannableString(message); //定义文字样式
                spannableString.setSpan(new UnderlineSpan(), message.length() - 2, message.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                spannableString.setSpan(new ForegroundColorSpan(Color.rgb(255, 213, 0)), message.length() - 2, message.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                showMessage(spannableString, clickErrorConnect);//设置错误信息
                break;
            case IChat.ErrorConnectCloseOnError://聊天室异常断开
                showMessage("聊天室已断开,请检查网络");
                break;
            case IChat.ErrorSendNoConnect://消息发送失败 没有连接聊天室
                Toast.makeText(mContext, "聊天室未连接", Toast.LENGTH_SHORT).show();
                break;
            case IChat.ErrorSendOther://消息发送失败
                Toast.makeText(mContext, "消息发送失败", Toast.LENGTH_SHORT).show();
                break;
        }
    }

    @Override
    public void onInfo(int what, String s) {
        switch (what) {
            case IChat.StateInitDone:
                //初始化完成
                break;
            case IChat.StateConnect:
                //服务器连接成功
                break;
            case IChat.StateJoin:
                //登录成功
                hideMessage();
                break;
            case IChat.StateReconnect:
                //重连成功
                connectChat();
                break;
        }
    }


    @Override
    public void processMessage(Message message) {
        String from = message.getFrom().substring(message.getFrom().indexOf("/") + 1);
        String body = message.getBody();

        mMessageList.add(from + " : " + body);
    }

    //聊天室连接失败 点击事件
    private View.OnClickListener clickErrorConnect = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            v.setOnClickListener(null);
            connectChat();
        }
    };
}