Compare commits

...

5 Commits

Author SHA1 Message Date
max
d5aa2f0ae3 feat:调整版本号 2024-07-05 17:04:58 +08:00
max
8ae56821c3 feat:私聊、公聊、房间、支持垃圾字检测 2024-07-05 16:59:34 +08:00
max
4a2b2b4c33 feat:调整启动背景-logo 2024-07-05 10:51:53 +08:00
max
f644db76da feat:配置云信-安全通ID 2024-07-05 10:27:04 +08:00
max
f00b2344d5 feat:修改启动页背景 2024-07-05 10:26:41 +08:00
16 changed files with 68 additions and 70 deletions

View File

@@ -41,6 +41,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter
import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView;
import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener;
import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView;
import com.netease.nim.uikit.common.util.AntiSpamUtil;
import com.netease.nim.uikit.common.util.media.BitmapDecoder;
import com.netease.nim.uikit.common.util.sys.ClipboardUtil;
import com.netease.nim.uikit.common.util.sys.NetworkUtil;
@@ -449,19 +450,12 @@ public class MessageListPanelEx {
int index = getItemIndex(message.getUuid());
if (index >= 0 && index < items.size()) {
IMMessage item = items.get(index);
String antiSpamRes = message.getYidunAntiSpamRes();
if (!TextUtils.isEmpty(antiSpamRes)) {
JSONObject jsonObject = JSON.parseObject(antiSpamRes);
if (jsonObject.getIntValue("suggestion") == 2) {
item.setStatus(MsgStatusEnum.fail);
NIMClient.getService(MsgService.class).updateIMMessageStatus(item);
} else {
item.setStatus(message.getStatus());
}
if (AntiSpamUtil.isAntiSpam(message)) {
item.setStatus(MsgStatusEnum.fail);
NIMClient.getService(MsgService.class).updateIMMessageStatus(item);
} else {
item.setStatus(message.getStatus());
}
item.setAttachStatus(message.getAttachStatus());
// 处理语音、音视频通话
@@ -1052,6 +1046,9 @@ public class MessageListPanelEx {
if (message.getDirect() == MsgDirectionEnum.Out) {
// 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载
if (message.getStatus() == MsgStatusEnum.fail) {
if (AntiSpamUtil.isAntiSpam(message)) {
return;
}
resendMessage(message); // 重发
} else {
if (message.getAttachment() instanceof FileAttachment) {

View File

@@ -1,24 +1,10 @@
package com.chwl.app.ui.im.chat;
import android.graphics.Color;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase;
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter;
import com.chwl.app.R;
import com.chwl.app.common.widget.OriginalDrawStatusClickSpan;
import com.chwl.app.ui.webview.SimpleWebViewActivity;
import com.chwl.core.UriProvider;
import com.chwl.core.im.custom.bean.ChatHintAttachment;
import com.chwl.library.utils.ResUtil;
public class MsgViewHolderChatHint extends MsgViewHolderBase {
@@ -58,30 +44,7 @@ public class MsgViewHolderChatHint extends MsgViewHolderBase {
ChatHintAttachment attachment = (ChatHintAttachment) message.getAttachment();
if (attachment != null) {
String content = attachment.getContent();
String restoreTitle = ResUtil.getString(R.string.im_chat_msgviewholderchathint_01);
if (TextUtils.isEmpty(content) || !content.contains(restoreTitle)) {
tvContent.setText(content);
} else {
SpannableString ss = new SpannableString(content);
int restoreTitleIndex = content.indexOf(restoreTitle);
ss.setSpan(
new ForegroundColorSpan(Color.parseColor("#FB486A")),
restoreTitleIndex,
restoreTitleIndex + restoreTitle.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
ss.setSpan(
new OriginalDrawStatusClickSpan() {
@Override
public void onClick(@NonNull View widget) {
SimpleWebViewActivity.start(context, UriProvider.getLiveAgreement());
}
},
restoreTitleIndex,
restoreTitleIndex + restoreTitle.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tvContent.setText(ss);
tvContent.setMovementMethod(new LinkMovementMethod());
}
tvContent.setText(content);
}
}

View File

@@ -29,7 +29,6 @@ import com.netease.nim.uikit.business.session.constant.Extras;
import com.netease.nim.uikit.business.session.module.Container;
import com.netease.nim.uikit.business.session.module.ModuleProxy;
import com.netease.nim.uikit.business.session.module.input.InputPanel;
import com.netease.nim.uikit.business.session.module.input.NimAudioChatEvent;
import com.netease.nim.uikit.business.session.module.input.NimImageActionEvent;
import com.netease.nim.uikit.common.fragment.TFragment;
import com.netease.nim.uikit.impl.NimUIKitImpl;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -8,7 +8,7 @@
android:src="@drawable/splash_bg" />
</item>
<item android:top="@dimen/dp_148">
<item android:top="@dimen/dp_145">
<bitmap
android:dither="true"
android:filter="true"

View File

@@ -5,12 +5,10 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.chwl.app.R;
import com.chwl.app.public_chat.core.ChatRoomClientManager;
import com.chwl.app.public_chat.core.ChatRoomMessageAdapter;
@@ -34,6 +32,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter
import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView;
import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener;
import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView;
import com.netease.nim.uikit.common.util.AntiSpamUtil;
import com.netease.nim.uikit.common.util.sys.ClipboardUtil;
import com.netease.nim.uikit.impl.NimUIKitImpl;
import com.netease.nimlib.sdk.NIMClient;
@@ -335,7 +334,12 @@ public class PublicChatRoomMessageListPanel {
int index = getItemIndex(message.getUuid());
if (index >= 0 && index < items.size()) {
ChatRoomMessage item = items.get(index);
item.setStatus(message.getStatus());
if (AntiSpamUtil.isAntiSpam(message)) {
item.setStatus(MsgStatusEnum.fail);
NIMClient.getService(MsgService.class).updateIMMessageStatus(item);
} else {
item.setStatus(message.getStatus());
}
item.setAttachStatus(message.getAttachStatus());
// 处理语音、音视频通话
@@ -622,6 +626,9 @@ public class PublicChatRoomMessageListPanel {
if (message.getDirect() == MsgDirectionEnum.Out) {
// 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载
if (message.getStatus() == MsgStatusEnum.fail) {
if (AntiSpamUtil.isAntiSpam(message)) {
return;
}
resendMessage(message); // 重发
} else {
if (message.getAttachment() instanceof FileAttachment) {

View File

@@ -78,7 +78,7 @@ public class XConstants {
/**
* 聊天室文本消息易盾反垃圾業務id
*/
public static final String CHAT_ROOM_ANTI_SPAM_CONFIG_ID = BuildConfig.DEBUG ? "8151e1245163738e1fa84db7a02f8fb9" : "bddbbb617e9da4fcd08c6baf6686ad01";
public static final String CHAT_ROOM_ANTI_SPAM_CONFIG_ID = BuildConfig.DEBUG ? "3611b99d0457202a7f69151288183236" : "bddbbb617e9da4fcd08c6baf6686ad01";
public static final int KICK_OUT_ROOM_LIMIT_ENTER_TIME = 5 * 60 * 1000;
public static final int CODE_IGNORE_TOAST = 5263;

View File

@@ -12,6 +12,10 @@ import static com.chwl.core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_HALL_
import android.util.Log;
import com.chwl.core.R;
import com.chwl.library.utils.ResUtil;
import com.chwl.library.utils.SingleToastUtil;
import com.netease.nim.uikit.common.util.AntiSpamUtil;
import com.netease.nimlib.sdk.InvocationFuture;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
@@ -85,7 +89,9 @@ public class IMMessageManager {
private void registerMsgStatusObserver() {
Observer<IMMessage> msgStatusObserver = (Observer<IMMessage>) imMessages -> {
if (imMessages != null) {
if (String.valueOf(AuthModel.get().getCurrentUid()).equals(imMessages.getFromAccount()) && AntiSpamUtil.isAntiSpam(imMessages)) {
SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05));
}
}
};
NIMClient.getService(MsgServiceObserve.class).observeMsgStatus(

View File

@@ -488,14 +488,9 @@ public final class IMNetEaseManager {
private void registerMsgStatusObserver() {
Observer<ChatRoomMessage> msgStatusObserver = (Observer<ChatRoomMessage>) message -> {
if (message != null) {
String antiSpamRes = message.getYidunAntiSpamRes();
if (!TextUtils.isEmpty(antiSpamRes) && String.valueOf(AuthModel.get().getCurrentUid()).equals(message.getFromAccount())) {
JSONObject jsonObject = JSON.parseObject(antiSpamRes);
if (jsonObject.getIntValue("suggestion") == 2) {
SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05));
}
if (String.valueOf(AuthModel.get().getCurrentUid()).equals(message.getFromAccount()) && AntiSpamUtil.isAntiSpam(message)) {
SingleToastUtil.showToast(ResUtil.getString(R.string.xchat_android_core_manager_imneteasemanager_05));
}
}
};
NIMClient.getService(ChatRoomServiceObserver.class).observeMsgStatus(
@@ -2119,9 +2114,9 @@ public final class IMNetEaseManager {
chatRoomMessage.setLocalExtension(atProxy.getAtExtensionMap());
atProxy.reset();
}
NIMAntiSpamOption antiSpamOption = new NIMAntiSpamOption();
antiSpamOption.antiSpamConfigId = XConstants.CHAT_ROOM_ANTI_SPAM_CONFIG_ID;
chatRoomMessage.setNIMAntiSpamOption(antiSpamOption);
// NIMAntiSpamOption antiSpamOption = new NIMAntiSpamOption();
// antiSpamOption.antiSpamConfigId = XConstants.CHAT_ROOM_ANTI_SPAM_CONFIG_ID;
// chatRoomMessage.setNIMAntiSpamOption(antiSpamOption);
if (AntiSpamUtil.checkLocalAntiSpam(chatRoomMessage)) {
EventBus.getDefault().post(new AntiSpamEvent());
return Single.error(new AntiSpamHitException("檢測到敏感詞,需要過濾,不能發送"));

View File

@@ -73,7 +73,7 @@
<string name="xchat_android_core_manager_imneteasemanager_02">حقل معلومات المستخدم فارغ</string>
<string name="xchat_android_core_manager_imneteasemanager_03">غير موجود في الغرفة أو معلومات الغرفة فارغة</string>
<string name="xchat_android_core_manager_imneteasemanager_04">تم استقبال معلومات الطرد</string>
<string name="xchat_android_core_manager_imneteasemanager_05">قد تحتوي الرسالة على محتوى ممنوع، يرجى التوقف عن إرسال رسائل مماثلة!</string>
<string name="xchat_android_core_manager_imneteasemanager_05">قد تحتوي الرسالة على معلومات غير قانونية، يرجى التوقف عن إرسال معلومات مماثلة مثل ذلك!</string>
<string name="xchat_android_core_manager_imneteasemanager_06">جاري الاتصال...</string>
<string name="xchat_android_core_manager_imneteasemanager_07">حالة غير طبيعية في غرفة الدردشة!</string>
<string name="xchat_android_core_manager_imneteasemanager_08">حالة الاتصال بغرفة الدردشة تصبح غير متصلة!</string>

View File

@@ -71,7 +71,7 @@
<string name="xchat_android_core_manager_imneteasemanager_02">User information field is empty</string>
<string name="xchat_android_core_manager_imneteasemanager_03">Not in the room or room information is empty</string>
<string name="xchat_android_core_manager_imneteasemanager_04">Received kick-out information</string>
<string name="xchat_android_core_manager_imneteasemanager_05">The message may contain prohibited content, please stop sending similar messages!</string>
<string name="xchat_android_core_manager_imneteasemanager_05">The message may contain illegal information, please stop sending similar information like that!</string>
<string name="xchat_android_core_manager_imneteasemanager_06">Connecting...</string>
<string name="xchat_android_core_manager_imneteasemanager_07">Chat room status abnormal!</string>
<string name="xchat_android_core_manager_imneteasemanager_08">Chat room online status becomes UNLOGIN!</string>

View File

@@ -32,8 +32,8 @@ COMPILE_SDK_VERSION=33
MIN_SDK_VERSION=21
TARGET_SDK_VERSION=33
version_name=1.0.9
version_code=12
version_name=1.0.10
version_code=13
#systemProp.https.proxyHost=127.0.0.1
#systemProp.https.proxyPort=7890

View File

@@ -25,6 +25,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter
import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView;
import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener;
import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView;
import com.netease.nim.uikit.common.util.AntiSpamUtil;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
import com.netease.nimlib.sdk.RequestCallback;
@@ -408,6 +409,9 @@ public class ChatRoomMsgListPanel {
if (message.getDirect() == MsgDirectionEnum.Out) {
// 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载
if (message.getStatus() == MsgStatusEnum.fail) {
if (AntiSpamUtil.isAntiSpam(message)) {
return;
}
resendMessage(message); // 重发
} else {
if (message.getAttachment() instanceof FileAttachment) {

View File

@@ -33,6 +33,7 @@ import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseFetchLoadAdapter
import com.netease.nim.uikit.common.ui.recyclerview.adapter.IRecyclerView;
import com.netease.nim.uikit.common.ui.recyclerview.listener.OnItemClickListener;
import com.netease.nim.uikit.common.ui.recyclerview.loadmore.MsgListFetchLoadMoreView;
import com.netease.nim.uikit.common.util.AntiSpamUtil;
import com.netease.nim.uikit.common.util.media.BitmapDecoder;
import com.netease.nim.uikit.common.util.sys.ClipboardUtil;
import com.netease.nim.uikit.common.util.sys.NetworkUtil;
@@ -723,6 +724,9 @@ public class MessageListPanelEx {
if (message.getDirect() == MsgDirectionEnum.Out) {
// 发出的消息,如果是发送失败,直接重发,否则有可能是漫游到的多媒体消息,但文件下载
if (message.getStatus() == MsgStatusEnum.fail) {
if (AntiSpamUtil.isAntiSpam(message)) {
return;
}
resendMessage(message); // 重发
} else {
if (message.getAttachment() instanceof FileAttachment) {

View File

@@ -1,12 +1,35 @@
package com.netease.nim.uikit.common.util;
import android.text.TextUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.msg.MsgService;
import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import com.netease.nimlib.sdk.msg.model.LocalAntiSpamResult;
public class AntiSpamUtil {
public static boolean isAntiSpam(IMMessage message) {
try {
if (message == null) {
return false;
}
String antiSpamRes = message.getYidunAntiSpamRes();
if (!TextUtils.isEmpty(antiSpamRes)) {
JSONObject jsonObject = JSON.parseObject(antiSpamRes);
if (jsonObject.getIntValue("suggestion") == 2) {
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 云信检验本地反垃圾词库
*
@@ -17,7 +40,7 @@ public class AntiSpamUtil {
String text = message.getContent();
LocalAntiSpamResult result = NIMClient.getService(MsgService.class)
.checkLocalAntiSpam(text, "***");
message.setContent(result.getContent()==null?"":result.getContent());
message.setContent(result.getContent() == null ? "" : result.getContent());
if (result.getOperator() != 0) {
//Map<String, Object> map = message.getRemoteExtension();