ChatUtil.java
6.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
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.removeCallbacks(null);
}
@Override
public void setOnMessageListener(OnMessageListener listener) {
mMessageListener = listener;
}
@Override
public void onError(int what, String s) {
switch (what) {
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();
}
};
}