diff --git a/app/src/main/java/com/yizhuan/erban/ui/im/MessageListPanelEx.java b/app/src/main/java/com/yizhuan/erban/ui/im/MessageListPanelEx.java index 2ecddc4c1..d0870162c 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/im/MessageListPanelEx.java +++ b/app/src/main/java/com/yizhuan/erban/ui/im/MessageListPanelEx.java @@ -7,13 +7,16 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.CountDownTimer; import android.os.Handler; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import android.text.TextUtils; import android.util.Pair; import android.view.View; import android.widget.ImageView; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.netease.nim.uikit.R; import com.netease.nim.uikit.api.NimUIKit; import com.netease.nim.uikit.api.model.user.UserInfoObserver; @@ -63,9 +66,6 @@ import com.netease.nimlib.sdk.robot.model.RobotMsgType; import com.netease.nimlib.sdk.team.constant.TeamMemberType; import com.netease.nimlib.sdk.team.model.TeamMember; import com.yizhuan.xchat_android_core.room.event.MessageSizeEvent; -import com.yizhuan.xchat_android_core.auth.AuthModel; -import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; -import com.yizhuan.xchat_android_core.im.custom.bean.ImTipAttachment; import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import org.greenrobot.eventbus.EventBus; @@ -85,35 +85,140 @@ public class MessageListPanelEx { private static final int REQUEST_CODE_FORWARD_PERSON = 0x01; private static final int REQUEST_CODE_FORWARD_TEAM = 0x02; + // 背景图片缓存 + private static Pair background; + private static Comparator comp = new Comparator() { + @Override + public int compare(IMMessage o1, IMMessage o2) { + long time = o1.getTime() - o2.getTime(); + return time == 0 ? 0 : (time < 0 ? -1 : 1); + } + }; // container private Container container; private View rootView; - // message list view private RecyclerView messageListView; private List items; private MsgAdapter adapter; private ImageView listviewBk; - // 新消息到达提醒 private IncomingMsgPrompt incomingMsgPrompt; private Handler uiHandler; - // 仅显示消息记录,不接收和发送消息 private boolean recordOnly; // 从服务器拉取消息记录 private boolean remote; - // 语音转文字 private VoiceTrans voiceTrans; - // 待转发消息 private IMMessage forwardMessage; - - // 背景图片缓存 - private static Pair background; private CountDownTimer countDownTimer; + private OnItemClickListener listener = new OnItemClickListener() { + @Override + public void onItemClick(IRecyclerView adapter, View view, int position) { + + } + + @Override + public void onItemLongClick(IRecyclerView adapter, View view, int position) { + } + + @Override + public void onItemChildClick(IRecyclerView adapter2, View view, int position) { + if (isSessionMode() && view != null && view instanceof RobotLinkView) { + RobotLinkView robotLinkView = (RobotLinkView) view; + // robotLinkView.onClick(); + LinkElement element = robotLinkView.getElement(); + if (element != null) { + element.getTarget(); + if (LinkElement.TYPE_URL.equals(element.getType())) { + Intent intent = new Intent(); + intent.setAction("android.intent.action.VIEW"); + Uri content_url = Uri.parse(element.getTarget()); + intent.setData(content_url); + try { + container.activity.startActivity(intent); + } catch (ActivityNotFoundException e) { +// Toast.makeText(container.activity, "路径错误", Toast.LENGTH_SHORT).show(); + SingleToastUtil.showToastShort("路径错误"); + } + + } else if (LinkElement.TYPE_BLOCK.equals(element.getType())) { + // 发送点击的block + IMMessage message = adapter.getItem(position); + if (message != null) { + String robotAccount = ((RobotAttachment) message.getAttachment()).getFromRobotAccount(); + IMMessage robotMsg = MessageBuilder.createRobotMessage(message.getSessionId(), message.getSessionType(), robotAccount, + robotLinkView.getShowContent(), RobotMsgType.LINK, "", element.getTarget(), element.getParams()); + container.proxy.sendMessage(robotMsg); + } + } + } + } + } + }; + /** + * 消息状态变化观察者 + */ + private Observer messageStatusObserver = new Observer() { + @Override + public void onEvent(IMMessage message) { + if (isMyMessage(message)) { + onMessageStatusChange(message); + } + } + }; + /** + * 消息附件上传/下载进度观察者 + */ + private Observer attachmentProgressObserver = new Observer() { + @Override + public void onEvent(AttachmentProgress progress) { + onAttachmentProgressChange(progress); + } + }; + /** + * 本地消息接收观察者 + */ + private MessageListPanelHelper.LocalMessageObserver incomingLocalMessageObserver = new MessageListPanelHelper.LocalMessageObserver() { + @Override + public void onAddMessage(IMMessage message) { + if (message == null || !container.account.equals(message.getSessionId())) { + return; + } + + onMsgSend(message); + } + + @Override + public void onClearMessages(String account) { + items.clear(); + refreshMessageList(); + adapter.fetchMoreEnd(null, true); + } + }; + /** + * 消息撤回观察者 + */ + private Observer revokeMessageObserver = new Observer() { + @Override + public void onEvent(RevokeMsgNotification notification) { + if (notification == null || notification.getMessage() == null) { + return; + } + IMMessage message = notification.getMessage(); + + if (!container.account.equals(message.getSessionId())) { + return; + } + + deleteItem(message, false); + } + }; + private UserInfoObserver uinfoObserver; + private OnMessageFilterListener onMessageFilterListener; public MessageListPanelEx(Container container, View rootView, boolean recordOnly, boolean remote) { this(container, rootView, null, recordOnly, remote); @@ -205,51 +310,6 @@ public class MessageListPanelEx { messageListView.addOnItemTouchListener(listener); } - private OnItemClickListener listener = new OnItemClickListener() { - @Override - public void onItemClick(IRecyclerView adapter, View view, int position) { - - } - - @Override - public void onItemLongClick(IRecyclerView adapter, View view, int position) { - } - - @Override - public void onItemChildClick(IRecyclerView adapter2, View view, int position) { - if (isSessionMode() && view != null && view instanceof RobotLinkView) { - RobotLinkView robotLinkView = (RobotLinkView) view; - // robotLinkView.onClick(); - LinkElement element = robotLinkView.getElement(); - if (element != null) { - element.getTarget(); - if (LinkElement.TYPE_URL.equals(element.getType())) { - Intent intent = new Intent(); - intent.setAction("android.intent.action.VIEW"); - Uri content_url = Uri.parse(element.getTarget()); - intent.setData(content_url); - try { - container.activity.startActivity(intent); - } catch (ActivityNotFoundException e) { -// Toast.makeText(container.activity, "路径错误", Toast.LENGTH_SHORT).show(); - SingleToastUtil.showToastShort("路径错误"); - } - - } else if (LinkElement.TYPE_BLOCK.equals(element.getType())) { - // 发送点击的block - IMMessage message = adapter.getItem(position); - if (message != null) { - String robotAccount = ((RobotAttachment) message.getAttachment()).getFromRobotAccount(); - IMMessage robotMsg = MessageBuilder.createRobotMessage(message.getSessionId(), message.getSessionType(), robotAccount, - robotLinkView.getShowContent(), RobotMsgType.LINK, "", element.getTarget(), element.getParams()); - container.proxy.sendMessage(robotMsg); - } - } - } - } - } - }; - public boolean isSessionMode() { return !recordOnly && !remote; } @@ -348,15 +408,6 @@ public class MessageListPanelEx { Collections.sort(list, comp); } - private static Comparator comp = new Comparator() { - - @Override - public int compare(IMMessage o1, IMMessage o2) { - long time = o1.getTime() - o2.getTime(); - return time == 0 ? 0 : (time < 0 ? -1 : 1); - } - }; - /** * ************************* 观察者 ******************************** */ @@ -375,73 +426,23 @@ public class MessageListPanelEx { MessageListPanelHelper.getInstance().registerObserver(incomingLocalMessageObserver, register); } - /** - * 消息状态变化观察者 - */ - private Observer messageStatusObserver = new Observer() { - @Override - public void onEvent(IMMessage message) { - if (isMyMessage(message)) { - onMessageStatusChange(message); - } - } - }; - - /** - * 消息附件上传/下载进度观察者 - */ - private Observer attachmentProgressObserver = new Observer() { - @Override - public void onEvent(AttachmentProgress progress) { - onAttachmentProgressChange(progress); - } - }; - - /** - * 本地消息接收观察者 - */ - private MessageListPanelHelper.LocalMessageObserver incomingLocalMessageObserver = new MessageListPanelHelper.LocalMessageObserver() { - @Override - public void onAddMessage(IMMessage message) { - if (message == null || !container.account.equals(message.getSessionId())) { - return; - } - - onMsgSend(message); - } - - @Override - public void onClearMessages(String account) { - items.clear(); - refreshMessageList(); - adapter.fetchMoreEnd(null, true); - } - }; - - /** - * 消息撤回观察者 - */ - private Observer revokeMessageObserver = new Observer() { - @Override - public void onEvent(RevokeMsgNotification notification) { - if (notification == null || notification.getMessage() == null) { - return; - } - IMMessage message = notification.getMessage(); - - if (!container.account.equals(message.getSessionId())) { - return; - } - - deleteItem(message, false); - } - }; - private void onMessageStatusChange(IMMessage message) { int index = getItemIndex(message.getUuid()); if (index >= 0 && index < items.size()) { IMMessage item = items.get(index); - item.setStatus(message.getStatus()); + 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()); + } + } else { + item.setStatus(message.getStatus()); + } + item.setAttachStatus(message.getAttachStatus()); // 处理语音、音视频通话 @@ -525,6 +526,216 @@ public class MessageListPanelEx { } } + private void setEarPhoneMode(boolean earPhoneMode, boolean update) { + if (update) { + UserPreferences.setEarPhoneModeEnable(earPhoneMode); + } + MessageAudioControl.getInstance(container.activity).setEarPhoneModeEnable(earPhoneMode); + } + + private Bitmap getBackground(String path) { + if (background != null && path.equals(background.first) && background.second != null) { + return background.second; + } + + if (background != null && background.second != null) { + background.second.recycle(); + } + + Bitmap bitmap = null; + if (path.startsWith("/android_asset")) { + String asset = path.substring(path.indexOf("/", 1) + 1); + try { + InputStream ais = container.activity.getAssets().open(asset); + bitmap = BitmapDecoder.decodeSampled(ais, ScreenUtil.screenWidth, ScreenUtil.screenHeight); + ais.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + bitmap = BitmapDecoder.decodeSampled(path, ScreenUtil.screenWidth, ScreenUtil.screenHeight); + } + background = new Pair<>(path, bitmap); + return bitmap; + } + + private void registerUserInfoObserver() { + if (uinfoObserver == null) { + uinfoObserver = new UserInfoObserver() { + @Override + public void onUserInfoChanged(List accounts) { + if (container.sessionType == SessionTypeEnum.P2P) { + if (accounts.contains(container.account) || accounts.contains(NimUIKit.getAccount())) { + adapter.notifyDataSetChanged(); + } + } else { // 群的,简单的全部重刷 + adapter.notifyDataSetChanged(); + } + } + }; + } + + NimUIKit.getUserInfoObservable().registerObserver(uinfoObserver, true); + } + + private void unregisterUserInfoObserver() { + if (uinfoObserver != null) { + NimUIKit.getUserInfoObservable().registerObserver(uinfoObserver, false); + } + } + + /** + * 收到已读回执(更新VH的已读label) + */ + + public void receiveReceipt() { + updateReceipt(items); + refreshMessageList(); + } + + public void updateReceipt(final List messages) { + for (int i = messages.size() - 1; i >= 0; i--) { + if (receiveReceiptCheck(messages.get(i))) { + adapter.setUuid(messages.get(i).getUuid()); + break; + } + } + } + + private boolean receiveReceiptCheck(final IMMessage msg) { + if (msg != null && msg.getSessionType() == SessionTypeEnum.P2P + && msg.getDirect() == MsgDirectionEnum.Out + && msg.getMsgType() != MsgTypeEnum.tip + && msg.getMsgType() != MsgTypeEnum.notification + && msg.isRemoteRead()) { + return true; + } + + return false; + } + + /** + * 发送已读回执(需要过滤) + */ + + public void sendReceipt() { + // 查询全局已读回执功能开关配置 + if (!NimUIKitImpl.getOptions().shouldHandleReceipt) { + return; + } + + if (container.account == null || container.sessionType != SessionTypeEnum.P2P) { + return; + } + + IMMessage message = getLastReceivedMessage(); + if (!sendReceiptCheck(message)) { + return; + } + + NIMClient.getService(MsgService.class).sendMessageReceipt(container.account, message); + } + + private IMMessage getLastReceivedMessage() { + IMMessage lastMessage = null; + for (int i = items.size() - 1; i >= 0; i--) { + if (sendReceiptCheck(items.get(i))) { + lastMessage = items.get(i); + break; + } + } + + return lastMessage; + } + + private boolean sendReceiptCheck(final IMMessage msg) { + if (msg == null || msg.getDirect() != MsgDirectionEnum.In || + msg.getMsgType() == MsgTypeEnum.tip || msg.getMsgType() == MsgTypeEnum.notification) { + return false; // 非收到的消息,Tip消息和通知类消息,不要发已读回执 + } + + return true; + } + + // 删除消息 + private void deleteItem(IMMessage messageItem, boolean isRelocateTime) { + NIMClient.getService(MsgService.class).deleteChattingHistory(messageItem); + List messages = new ArrayList<>(); + for (IMMessage message : items) { + if (message.getUuid().equals(messageItem.getUuid())) { + continue; + } + messages.add(message); + } + updateReceipt(messages); + adapter.deleteItem(messageItem, isRelocateTime); + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode != Activity.RESULT_OK) { + return; + } + final ArrayList selected = data.getStringArrayListExtra(ContactSelectActivity.RESULT_DATA); + if (selected != null && !selected.isEmpty()) { + switch (requestCode) { + case REQUEST_CODE_FORWARD_TEAM: + doForwardMessage(selected.get(0), SessionTypeEnum.Team); + break; + case REQUEST_CODE_FORWARD_PERSON: + doForwardMessage(selected.get(0), SessionTypeEnum.P2P); + break; + } + } + } + + // 转发消息 + private void doForwardMessage(final String sessionId, SessionTypeEnum sessionTypeEnum) { + IMMessage message; + if (forwardMessage.getMsgType() == MsgTypeEnum.robot) { + message = buildForwardRobotMessage(sessionId, sessionTypeEnum); + } else { + message = MessageBuilder.createForwardMessage(forwardMessage, sessionId, sessionTypeEnum); + } + + if (message == null) { +// Toast.makeText(container.activity, "该类型不支持转发", Toast.LENGTH_SHORT).show(); + SingleToastUtil.showToastShort("该类型不支持转发"); + return; + } + + NIMClient.getService(MsgService.class) + .sendMessage(message, false) + .setCallback(new RequestCallbackWrapper() { + @Override + public void onResult(int code, Void result, Throwable exception) { + } + }); + if (container.account.equals(sessionId)) { + onMsgSend(message); + } + } + + private IMMessage buildForwardRobotMessage(final String sessionId, SessionTypeEnum sessionTypeEnum) { + if (forwardMessage.getMsgType() == MsgTypeEnum.robot && forwardMessage.getAttachment() != null) { + RobotAttachment robotAttachment = (RobotAttachment) forwardMessage.getAttachment(); + if (robotAttachment.isRobotSend()) { + return null; // 机器人发的消息不能转发了 + } + + return MessageBuilder.createTextMessage(sessionId, sessionTypeEnum, forwardMessage.getContent()); + } + + return null; + } + + public void setOnMessageFilterListener(OnMessageFilterListener onMessageFilterListener) { + this.onMessageFilterListener = onMessageFilterListener; + } + + public interface OnMessageFilterListener { + List filterLoadedMessage(List messages); + } + /** * ***************************************** 数据加载 ********************************************* */ @@ -539,21 +750,6 @@ public class MessageListPanelEx { private boolean remote; private boolean firstLoad = true; - - public MessageLoader(IMMessage anchor, boolean remote) { - this.anchor = anchor; - this.remote = remote; - if (remote) { - loadFromRemote(); - } else { - if (anchor == null) { - loadFromLocal(QueryDirectionEnum.QUERY_OLD); - } else { - loadAnchorContext(); // 加载指定anchor的上下文 - } - } - } - private RequestCallback> callback = new RequestCallbackWrapper>() { @Override public void onResult(int code, List messages, Throwable exception) { @@ -573,6 +769,20 @@ public class MessageListPanelEx { } }; + public MessageLoader(IMMessage anchor, boolean remote) { + this.anchor = anchor; + this.remote = remote; + if (remote) { + loadFromRemote(); + } else { + if (anchor == null) { + loadFromLocal(QueryDirectionEnum.QUERY_OLD); + } else { + loadAnchorContext(); // 加载指定anchor的上下文 + } + } + } + private void loadAnchorContext() { // query new, auto load old direction = QueryDirectionEnum.QUERY_NEW; @@ -613,6 +823,7 @@ public class MessageListPanelEx { /** * 私聊聊天信息数(发起私聊限制需要用到) + * * @param messages */ private void onMessageLoaded(List messages) { @@ -1073,218 +1284,4 @@ public class MessageListPanelEx { } - private void setEarPhoneMode(boolean earPhoneMode, boolean update) { - if (update) { - UserPreferences.setEarPhoneModeEnable(earPhoneMode); - } - MessageAudioControl.getInstance(container.activity).setEarPhoneModeEnable(earPhoneMode); - } - - private Bitmap getBackground(String path) { - if (background != null && path.equals(background.first) && background.second != null) { - return background.second; - } - - if (background != null && background.second != null) { - background.second.recycle(); - } - - Bitmap bitmap = null; - if (path.startsWith("/android_asset")) { - String asset = path.substring(path.indexOf("/", 1) + 1); - try { - InputStream ais = container.activity.getAssets().open(asset); - bitmap = BitmapDecoder.decodeSampled(ais, ScreenUtil.screenWidth, ScreenUtil.screenHeight); - ais.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } else { - bitmap = BitmapDecoder.decodeSampled(path, ScreenUtil.screenWidth, ScreenUtil.screenHeight); - } - background = new Pair<>(path, bitmap); - return bitmap; - } - - private UserInfoObserver uinfoObserver; - - private void registerUserInfoObserver() { - if (uinfoObserver == null) { - uinfoObserver = new UserInfoObserver() { - @Override - public void onUserInfoChanged(List accounts) { - if (container.sessionType == SessionTypeEnum.P2P) { - if (accounts.contains(container.account) || accounts.contains(NimUIKit.getAccount())) { - adapter.notifyDataSetChanged(); - } - } else { // 群的,简单的全部重刷 - adapter.notifyDataSetChanged(); - } - } - }; - } - - NimUIKit.getUserInfoObservable().registerObserver(uinfoObserver, true); - } - - private void unregisterUserInfoObserver() { - if (uinfoObserver != null) { - NimUIKit.getUserInfoObservable().registerObserver(uinfoObserver, false); - } - } - - /** - * 收到已读回执(更新VH的已读label) - */ - - public void receiveReceipt() { - updateReceipt(items); - refreshMessageList(); - } - - public void updateReceipt(final List messages) { - for (int i = messages.size() - 1; i >= 0; i--) { - if (receiveReceiptCheck(messages.get(i))) { - adapter.setUuid(messages.get(i).getUuid()); - break; - } - } - } - - private boolean receiveReceiptCheck(final IMMessage msg) { - if (msg != null && msg.getSessionType() == SessionTypeEnum.P2P - && msg.getDirect() == MsgDirectionEnum.Out - && msg.getMsgType() != MsgTypeEnum.tip - && msg.getMsgType() != MsgTypeEnum.notification - && msg.isRemoteRead()) { - return true; - } - - return false; - } - - /** - * 发送已读回执(需要过滤) - */ - - public void sendReceipt() { - // 查询全局已读回执功能开关配置 - if (!NimUIKitImpl.getOptions().shouldHandleReceipt) { - return; - } - - if (container.account == null || container.sessionType != SessionTypeEnum.P2P) { - return; - } - - IMMessage message = getLastReceivedMessage(); - if (!sendReceiptCheck(message)) { - return; - } - - NIMClient.getService(MsgService.class).sendMessageReceipt(container.account, message); - } - - private IMMessage getLastReceivedMessage() { - IMMessage lastMessage = null; - for (int i = items.size() - 1; i >= 0; i--) { - if (sendReceiptCheck(items.get(i))) { - lastMessage = items.get(i); - break; - } - } - - return lastMessage; - } - - private boolean sendReceiptCheck(final IMMessage msg) { - if (msg == null || msg.getDirect() != MsgDirectionEnum.In || - msg.getMsgType() == MsgTypeEnum.tip || msg.getMsgType() == MsgTypeEnum.notification) { - return false; // 非收到的消息,Tip消息和通知类消息,不要发已读回执 - } - - return true; - } - - // 删除消息 - private void deleteItem(IMMessage messageItem, boolean isRelocateTime) { - NIMClient.getService(MsgService.class).deleteChattingHistory(messageItem); - List messages = new ArrayList<>(); - for (IMMessage message : items) { - if (message.getUuid().equals(messageItem.getUuid())) { - continue; - } - messages.add(message); - } - updateReceipt(messages); - adapter.deleteItem(messageItem, isRelocateTime); - } - - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode != Activity.RESULT_OK) { - return; - } - final ArrayList selected = data.getStringArrayListExtra(ContactSelectActivity.RESULT_DATA); - if (selected != null && !selected.isEmpty()) { - switch (requestCode) { - case REQUEST_CODE_FORWARD_TEAM: - doForwardMessage(selected.get(0), SessionTypeEnum.Team); - break; - case REQUEST_CODE_FORWARD_PERSON: - doForwardMessage(selected.get(0), SessionTypeEnum.P2P); - break; - } - } - } - - // 转发消息 - private void doForwardMessage(final String sessionId, SessionTypeEnum sessionTypeEnum) { - IMMessage message; - if (forwardMessage.getMsgType() == MsgTypeEnum.robot) { - message = buildForwardRobotMessage(sessionId, sessionTypeEnum); - } else { - message = MessageBuilder.createForwardMessage(forwardMessage, sessionId, sessionTypeEnum); - } - - if (message == null) { -// Toast.makeText(container.activity, "该类型不支持转发", Toast.LENGTH_SHORT).show(); - SingleToastUtil.showToastShort("该类型不支持转发"); - return; - } - - NIMClient.getService(MsgService.class) - .sendMessage(message, false) - .setCallback(new RequestCallbackWrapper() { - @Override - public void onResult(int code, Void result, Throwable exception) { - } - }); - if (container.account.equals(sessionId)) { - onMsgSend(message); - } - } - - private IMMessage buildForwardRobotMessage(final String sessionId, SessionTypeEnum sessionTypeEnum) { - if (forwardMessage.getMsgType() == MsgTypeEnum.robot && forwardMessage.getAttachment() != null) { - RobotAttachment robotAttachment = (RobotAttachment) forwardMessage.getAttachment(); - if (robotAttachment.isRobotSend()) { - return null; // 机器人发的消息不能转发了 - } - - return MessageBuilder.createTextMessage(sessionId, sessionTypeEnum, forwardMessage.getContent()); - } - - return null; - } - - private OnMessageFilterListener onMessageFilterListener; - - public void setOnMessageFilterListener(OnMessageFilterListener onMessageFilterListener) { - this.onMessageFilterListener = onMessageFilterListener; - } - - public interface OnMessageFilterListener { - List filterLoadedMessage(List messages); - } - } diff --git a/app/src/main/java/com/yizhuan/erban/ui/im/chat/MsgViewHolderChatHint.java b/app/src/main/java/com/yizhuan/erban/ui/im/chat/MsgViewHolderChatHint.java index da698d81b..3eea86f31 100644 --- a/app/src/main/java/com/yizhuan/erban/ui/im/chat/MsgViewHolderChatHint.java +++ b/app/src/main/java/com/yizhuan/erban/ui/im/chat/MsgViewHolderChatHint.java @@ -4,6 +4,7 @@ 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; @@ -78,6 +79,7 @@ public class MsgViewHolderChatHint extends MsgViewHolderBase { restoreTitleIndex + restoreTitle.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); tvContent.setText(ss); + tvContent.setMovementMethod(new LinkMovementMethod()); } } } diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 55fbc6801..20c1a7ff3 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -16,6 +16,8 @@ import android.util.SparseArray; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -33,6 +35,7 @@ import com.netease.nimlib.sdk.ResponseCode; import com.netease.nimlib.sdk.StatusCode; import com.netease.nimlib.sdk.chatroom.ChatRoomMessageBuilder; import com.netease.nimlib.sdk.chatroom.ChatRoomService; +import com.netease.nimlib.sdk.chatroom.ChatRoomServiceObserver; import com.netease.nimlib.sdk.chatroom.constant.MemberType; import com.netease.nimlib.sdk.chatroom.model.ChatRoomKickOutEvent; import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember; @@ -235,6 +238,7 @@ public final class IMNetEaseManager { registerOnlineStatusChange(); registerServerMessage(); registerMessageFilter(); + registerMsgStatusObserver(); model = AvRoomModel.get(); } @@ -456,6 +460,23 @@ public final class IMNetEaseManager { NIMChatRoomSDK.getChatRoomServiceObserve().observeReceiveMessage(incomingChatObserver, true); } + private void registerMsgStatusObserver() { + Observer msgStatusObserver = (Observer) 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("消息中可能含有违规信息,请停止发送类似信息!"); + } + } + + } + }; + NIMClient.getService(ChatRoomServiceObserver.class).observeMsgStatus( + msgStatusObserver, true); + } + private void dealChatRoomOnlineStatus(ChatRoomStatusChangeData chatRoomStatusChangeData) { if (filterAnotherChatRoom(chatRoomStatusChangeData)) return; diff --git a/nim_uikit/src/com/netease/nim/uikit/business/session/viewholder/MsgViewHolderBase.java b/nim_uikit/src/com/netease/nim/uikit/business/session/viewholder/MsgViewHolderBase.java index 21a067576..da55f31d8 100644 --- a/nim_uikit/src/com/netease/nim/uikit/business/session/viewholder/MsgViewHolderBase.java +++ b/nim_uikit/src/com/netease/nim/uikit/business/session/viewholder/MsgViewHolderBase.java @@ -231,9 +231,6 @@ public abstract class MsgViewHolderBase extends RecyclerViewHolder