package com.netease.nim.uikit.recent.holder; import com.netease.nim.uikit.NimUIKit; import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseQuickAdapter; import com.netease.nim.uikit.common.util.sys.TimeUtil; import com.netease.nim.uikit.session.helper.TeamNotificationHelper; import com.netease.nimlib.sdk.NIMClient; import com.netease.nimlib.sdk.avchat.constant.AVChatRecordState; import com.netease.nimlib.sdk.avchat.constant.AVChatType; import com.netease.nimlib.sdk.avchat.model.AVChatAttachment; import com.netease.nimlib.sdk.msg.MsgService; import com.netease.nimlib.sdk.msg.attachment.MsgAttachment; import com.netease.nimlib.sdk.msg.attachment.NotificationAttachment; import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum; import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum; import com.netease.nimlib.sdk.msg.model.IMMessage; import com.netease.nimlib.sdk.msg.model.RecentContact; import java.util.ArrayList; import java.util.List; public class CommonRecentViewHolder extends RecentViewHolder { public CommonRecentViewHolder(BaseQuickAdapter adapter) { super(adapter); } @Override protected String getContent(RecentContact recent) { return descOfMsg(recent); } @Override protected String getOnlineStateContent(RecentContact recent) { if (recent.getSessionType() == SessionTypeEnum.P2P && NimUIKit.enableOnlineState()) { return NimUIKit.getOnlineStateContentProvider().getSimpleDisplay(recent.getContactId()); } else { return super.getOnlineStateContent(recent); } } protected String descOfMsg(RecentContact recent) { if (recent.getMsgType() == MsgTypeEnum.text) { return recent.getContent(); } else if (recent.getMsgType() == MsgTypeEnum.tip) { String digest = null; if (getCallback() != null) { digest = getCallback().getDigestOfTipMsg(recent); } if (digest == null) { digest = getDefaultDigest(null, recent); } return digest; } else if (recent.getAttachment() != null) { String digest = null; if (getCallback() != null) { digest = getCallback().getDigestOfAttachment(recent.getAttachment()); } if (digest == null) { digest = getDefaultDigest(recent.getAttachment(), recent); } return digest; } return ""; } // SDK本身只记录原始数据,第三方APP可根据自己实际需求,在最近联系人列表上显示缩略消息 // 以下为一些常见消息类型的示例。 private String getDefaultDigest(MsgAttachment attachment, RecentContact recent) { switch (recent.getMsgType()) { case text: return recent.getContent(); case image: return "[图片]"; case video: return "[视频]"; case audio: return "[语音消息]"; case location: return "[位置]"; case file: return "[文件]"; case tip: List<String> uuids = new ArrayList<>(); uuids.add(recent.getRecentMessageId()); List<IMMessage> messages = NIMClient.getService(MsgService.class).queryMessageListByUuidBlock(uuids); if (messages != null && messages.size() > 0) { return messages.get(0).getContent(); } return "[通知提醒]"; case notification: return TeamNotificationHelper.getTeamNotificationText(recent.getContactId(), recent.getFromAccount(), (NotificationAttachment) recent.getAttachment()); case avchat: AVChatAttachment avchat = (AVChatAttachment) attachment; if (avchat.getState() == AVChatRecordState.Missed && !recent.getFromAccount().equals(NimUIKit.getAccount())) { // 未接通话请求 StringBuilder sb = new StringBuilder("[未接"); if (avchat.getType() == AVChatType.VIDEO) { sb.append("视频电话]"); } else { sb.append("音频电话]"); } return sb.toString(); } else if (avchat.getState() == AVChatRecordState.Success) { StringBuilder sb = new StringBuilder(); if (avchat.getType() == AVChatType.VIDEO) { sb.append("[视频电话]: "); } else { sb.append("[音频电话]: "); } sb.append(TimeUtil.secToTime(avchat.getDuration())); return sb.toString(); } else { if (avchat.getType() == AVChatType.VIDEO) { return ("[视频电话]"); } else { return ("[音频电话]"); } } default: return "[自定义消息] "; } } }