私聊消息提醒文案统一
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
package com.netease.nim.uikit.business.recent;
|
||||
|
||||
import com.netease.nimlib.sdk.msg.attachment.MsgAttachment;
|
||||
import com.netease.nimlib.sdk.msg.model.RecentContact;
|
||||
|
||||
/**
|
||||
@@ -27,20 +26,4 @@ public interface RecentContactsCallback {
|
||||
*/
|
||||
void onItemClick(RecentContact recent);
|
||||
|
||||
/**
|
||||
* 设置自定义消息的摘要信息,展示在最近联系人列表的消息缩略栏上.
|
||||
* 当然,你也可以自定义一些内建消息的缩略语,例如图片,语音,音视频会话等,自定义的缩略语会被优先使用。
|
||||
*
|
||||
* @param attachment 消息附件对象
|
||||
* @return 消息摘要
|
||||
*/
|
||||
String getDigestOfAttachment(RecentContact recent, MsgAttachment attachment);
|
||||
|
||||
/**
|
||||
* 设置Tip消息的摘要信息,展示在最近联系人列表的消息缩略栏上
|
||||
*
|
||||
* @param recent 最近联系人
|
||||
* @return Tip消息摘要
|
||||
*/
|
||||
String getDigestOfTipMsg(RecentContact recent);
|
||||
}
|
||||
|
@@ -1,55 +0,0 @@
|
||||
package com.netease.nim.uikit.business.recent.adapter;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.netease.nim.uikit.R;
|
||||
import com.netease.nim.uikit.business.recent.RecentContactsCallback;
|
||||
import com.netease.nim.uikit.business.recent.holder.CommonRecentViewHolder;
|
||||
import com.netease.nim.uikit.business.recent.holder.TeamRecentViewHolder;
|
||||
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemQuickAdapter;
|
||||
import com.netease.nim.uikit.common.ui.recyclerview.holder.BaseViewHolder;
|
||||
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
|
||||
import com.netease.nimlib.sdk.msg.model.RecentContact;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by huangjun on 2016/12/11.
|
||||
*/
|
||||
|
||||
public class RecentContactAdapter extends BaseMultiItemQuickAdapter<RecentContact, BaseViewHolder> {
|
||||
|
||||
interface ViewType {
|
||||
int VIEW_TYPE_COMMON = 1;
|
||||
int VIEW_TYPE_TEAM = 2;
|
||||
}
|
||||
|
||||
private RecentContactsCallback callback;
|
||||
|
||||
public RecentContactAdapter(RecyclerView recyclerView, List<RecentContact> data) {
|
||||
super(recyclerView, data);
|
||||
addItemType(ViewType.VIEW_TYPE_COMMON, R.layout.nim_recent_contact_list_item, CommonRecentViewHolder.class);
|
||||
addItemType(ViewType.VIEW_TYPE_TEAM, R.layout.nim_recent_contact_list_item, TeamRecentViewHolder.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getViewType(RecentContact item) {
|
||||
return item.getSessionType() == SessionTypeEnum.Team ? ViewType.VIEW_TYPE_TEAM : ViewType.VIEW_TYPE_COMMON;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getItemKey(RecentContact item) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(item.getSessionType().getValue()).append("_").append(item.getContactId());
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public RecentContactsCallback getCallback() {
|
||||
return callback;
|
||||
}
|
||||
|
||||
public void setCallback(RecentContactsCallback callback) {
|
||||
this.callback = callback;
|
||||
}
|
||||
}
|
@@ -1,58 +0,0 @@
|
||||
package com.netease.nim.uikit.business.recent.holder;
|
||||
|
||||
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseQuickAdapter;
|
||||
import com.netease.nim.uikit.impl.NimUIKitImpl;
|
||||
import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum;
|
||||
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
|
||||
import com.netease.nimlib.sdk.msg.model.RecentContact;
|
||||
|
||||
public class CommonRecentViewHolder extends RecentViewHolder {
|
||||
|
||||
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 && NimUIKitImpl.enableOnlineState()) {
|
||||
return NimUIKitImpl.getOnlineStateContentProvider().getSimpleDisplay(recent.getContactId());
|
||||
} else {
|
||||
return super.getOnlineStateContent(recent);
|
||||
}
|
||||
}
|
||||
|
||||
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 = NimUIKitImpl.getRecentCustomization().getDefaultDigest(recent);
|
||||
}
|
||||
|
||||
return digest;
|
||||
} else if (recent.getAttachment() != null) {
|
||||
String digest = null;
|
||||
if (getCallback() != null) {
|
||||
digest = getCallback().getDigestOfAttachment(recent, recent.getAttachment());
|
||||
}
|
||||
|
||||
if (digest == null) {
|
||||
digest = NimUIKitImpl.getRecentCustomization().getDefaultDigest(recent);
|
||||
}
|
||||
|
||||
return digest;
|
||||
}
|
||||
|
||||
return "[未知]";
|
||||
}
|
||||
}
|
@@ -1,227 +0,0 @@
|
||||
package com.netease.nim.uikit.business.recent.holder;
|
||||
|
||||
import android.graphics.drawable.AnimationDrawable;
|
||||
import android.os.Handler;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.netease.nim.uikit.R;
|
||||
import com.netease.nim.uikit.api.NimUIKit;
|
||||
import com.netease.nim.uikit.business.recent.RecentContactsCallback;
|
||||
import com.netease.nim.uikit.business.recent.adapter.RecentContactAdapter;
|
||||
import com.netease.nim.uikit.business.session.emoji.MoonUtil;
|
||||
import com.netease.nim.uikit.business.uinfo.UserInfoHelper;
|
||||
import com.netease.nim.uikit.common.ui.drop.DropFake;
|
||||
import com.netease.nim.uikit.common.ui.drop.DropManager;
|
||||
import com.netease.nim.uikit.common.ui.imageview.HeadImageView;
|
||||
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseQuickAdapter;
|
||||
import com.netease.nim.uikit.common.ui.recyclerview.holder.BaseViewHolder;
|
||||
import com.netease.nim.uikit.common.ui.recyclerview.holder.RecyclerViewHolder;
|
||||
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
|
||||
import com.netease.nim.uikit.common.util.sys.TimeUtil;
|
||||
import com.netease.nimlib.sdk.msg.constant.MsgStatusEnum;
|
||||
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
|
||||
import com.netease.nimlib.sdk.msg.model.RecentContact;
|
||||
import com.netease.nimlib.sdk.team.model.Team;
|
||||
|
||||
public abstract class RecentViewHolder extends RecyclerViewHolder<BaseQuickAdapter, BaseViewHolder, RecentContact> {
|
||||
|
||||
public RecentViewHolder(BaseQuickAdapter adapter) {
|
||||
super(adapter);
|
||||
}
|
||||
|
||||
private int lastUnreadCount = 0;
|
||||
|
||||
protected FrameLayout portraitPanel;
|
||||
|
||||
protected HeadImageView imgHead;
|
||||
|
||||
protected TextView tvNickname;
|
||||
|
||||
protected TextView tvMessage;
|
||||
|
||||
protected TextView tvDatetime;
|
||||
|
||||
// 消息发送错误状态标记,目前没有逻辑处理
|
||||
protected ImageView imgMsgStatus;
|
||||
|
||||
protected View bottomLine;
|
||||
|
||||
protected View topLine;
|
||||
|
||||
// 未读红点(一个占坑,一个全屏动画)
|
||||
protected DropFake tvUnread;
|
||||
|
||||
private ImageView imgUnreadExplosion;
|
||||
|
||||
protected TextView tvOnlineState;
|
||||
|
||||
// 子类覆写
|
||||
protected abstract String getContent(RecentContact recent);
|
||||
|
||||
@Override
|
||||
public void convert(BaseViewHolder holder, RecentContact data, int position, boolean isScrolling) {
|
||||
inflate(holder, data);
|
||||
refresh(holder, data, position);
|
||||
}
|
||||
|
||||
public void inflate(BaseViewHolder holder, final RecentContact recent) {
|
||||
this.portraitPanel = holder.getView(R.id.portrait_panel);
|
||||
this.imgHead = holder.getView(R.id.img_head);
|
||||
this.tvNickname = holder.getView(R.id.tv_nickname);
|
||||
this.tvMessage = holder.getView(R.id.tv_message);
|
||||
this.tvUnread = holder.getView(R.id.unread_number_tip);
|
||||
this.imgUnreadExplosion = holder.getView(R.id.unread_number_explosion);
|
||||
this.tvDatetime = holder.getView(R.id.tv_date_time);
|
||||
this.imgMsgStatus = holder.getView(R.id.img_msg_status);
|
||||
this.bottomLine = holder.getView(R.id.bottom_line);
|
||||
this.topLine = holder.getView(R.id.top_line);
|
||||
this.tvOnlineState = holder.getView(R.id.tv_online_state);
|
||||
holder.addOnClickListener(R.id.unread_number_tip);
|
||||
|
||||
this.tvUnread.setTouchListener(new DropFake.ITouchListener() {
|
||||
@Override
|
||||
public void onDown() {
|
||||
DropManager.getInstance().setCurrentId(recent);
|
||||
DropManager.getInstance().down(tvUnread, tvUnread.getText());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMove(float curX, float curY) {
|
||||
DropManager.getInstance().move(curX, curY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUp() {
|
||||
DropManager.getInstance().up();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void refresh(BaseViewHolder holder, RecentContact recent, final int position) {
|
||||
// unread count animation
|
||||
boolean shouldBoom = lastUnreadCount > 0 && recent.getUnreadCount() == 0; // 未读数从N->0执行爆裂动画;
|
||||
lastUnreadCount = recent.getUnreadCount();
|
||||
|
||||
updateBackground(holder, recent, position);
|
||||
|
||||
loadPortrait(recent);
|
||||
|
||||
updateNickLabel(UserInfoHelper.getUserTitleName(recent.getContactId(), recent.getSessionType()));
|
||||
|
||||
updateOnlineState(recent);
|
||||
|
||||
updateMsgLabel(holder, recent);
|
||||
|
||||
updateNewIndicator(recent);
|
||||
|
||||
if (shouldBoom) {
|
||||
Object o = DropManager.getInstance().getCurrentId();
|
||||
if (o instanceof String && o.equals("0")) {
|
||||
imgUnreadExplosion.setImageResource(R.drawable.nim_explosion);
|
||||
imgUnreadExplosion.setVisibility(View.VISIBLE);
|
||||
new Handler().post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
((AnimationDrawable) imgUnreadExplosion.getDrawable()).start();
|
||||
// 解决部分手机动画无法播放的问题(例如华为荣耀)
|
||||
getAdapter().notifyItemChanged(getAdapter().getViewHolderPosition(position));
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
imgUnreadExplosion.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateBackground(BaseViewHolder holder, RecentContact recent, int position) {
|
||||
topLine.setVisibility(getAdapter().isFirstDataItem(position) ? View.GONE : View.VISIBLE);
|
||||
bottomLine.setVisibility(getAdapter().isLastDataItem(position) ? View.VISIBLE : View.GONE);
|
||||
if ((recent.getTag() & 1) == 0) {
|
||||
holder.getConvertView().setBackgroundResource(R.drawable.nim_touch_bg);
|
||||
} else {
|
||||
holder.getConvertView().setBackgroundResource(R.drawable.nim_recent_contact_sticky_selecter);
|
||||
}
|
||||
}
|
||||
|
||||
protected void loadPortrait(RecentContact recent) {
|
||||
// 设置头像
|
||||
if (recent.getSessionType() == SessionTypeEnum.P2P) {
|
||||
imgHead.loadBuddyAvatar(recent.getContactId());
|
||||
} else if (recent.getSessionType() == SessionTypeEnum.Team) {
|
||||
Team team = NimUIKit.getTeamProvider().getTeamById(recent.getContactId());
|
||||
imgHead.loadTeamIconByTeam(team);
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateNewIndicator(RecentContact recent) {
|
||||
int unreadNum = recent.getUnreadCount();
|
||||
tvUnread.setVisibility(unreadNum > 0 ? View.VISIBLE : View.GONE);
|
||||
tvUnread.setText(unreadCountShowRule(unreadNum));
|
||||
}
|
||||
|
||||
private void updateMsgLabel(BaseViewHolder holder, RecentContact recent) {
|
||||
// 显示消息具体内容
|
||||
MoonUtil.identifyRecentVHFaceExpressionAndTags(holder.getContext(), tvMessage, getContent(recent), -1, 0.45f);
|
||||
//tvMessage.setText(getContent());
|
||||
|
||||
MsgStatusEnum status = recent.getMsgStatus();
|
||||
switch (status) {
|
||||
case fail:
|
||||
imgMsgStatus.setImageResource(R.drawable.nim_g_ic_failed_small);
|
||||
imgMsgStatus.setVisibility(View.VISIBLE);
|
||||
break;
|
||||
case sending:
|
||||
imgMsgStatus.setImageResource(R.drawable.nim_recent_contact_ic_sending);
|
||||
imgMsgStatus.setVisibility(View.VISIBLE);
|
||||
break;
|
||||
default:
|
||||
imgMsgStatus.setVisibility(View.GONE);
|
||||
break;
|
||||
}
|
||||
|
||||
String timeString = TimeUtil.getTimeShowString(recent.getTime(), true);
|
||||
tvDatetime.setText(timeString);
|
||||
}
|
||||
|
||||
protected String getOnlineStateContent(RecentContact recent) {
|
||||
return "";
|
||||
}
|
||||
|
||||
protected void updateOnlineState(RecentContact recent) {
|
||||
if (recent.getSessionType() == SessionTypeEnum.Team) {
|
||||
tvOnlineState.setVisibility(View.GONE);
|
||||
} else {
|
||||
String onlineStateContent = getOnlineStateContent(recent);
|
||||
if (TextUtils.isEmpty(onlineStateContent)) {
|
||||
tvOnlineState.setVisibility(View.GONE);
|
||||
} else {
|
||||
tvOnlineState.setVisibility(View.VISIBLE);
|
||||
tvOnlineState.setText(getOnlineStateContent(recent));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateNickLabel(String nick) {
|
||||
int labelWidth = ScreenUtil.screenWidth;
|
||||
labelWidth -= ScreenUtil.dip2px(50 + 70); // 减去固定的头像和时间宽度
|
||||
|
||||
if (labelWidth > 0) {
|
||||
tvNickname.setMaxWidth(labelWidth);
|
||||
}
|
||||
|
||||
tvNickname.setText(nick);
|
||||
}
|
||||
|
||||
protected String unreadCountShowRule(int unread) {
|
||||
unread = Math.min(unread, 99);
|
||||
return String.valueOf(unread);
|
||||
}
|
||||
|
||||
protected RecentContactsCallback getCallback() {
|
||||
return ((RecentContactAdapter) getAdapter()).getCallback();
|
||||
}
|
||||
}
|
@@ -1,44 +0,0 @@
|
||||
package com.netease.nim.uikit.business.recent.holder;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.netease.nim.uikit.api.NimUIKit;
|
||||
import com.netease.nim.uikit.business.recent.TeamMemberAitHelper;
|
||||
import com.netease.nim.uikit.business.team.helper.TeamHelper;
|
||||
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseQuickAdapter;
|
||||
import com.netease.nimlib.sdk.msg.attachment.NotificationAttachment;
|
||||
import com.netease.nimlib.sdk.msg.model.RecentContact;
|
||||
|
||||
public class TeamRecentViewHolder extends CommonRecentViewHolder {
|
||||
|
||||
public TeamRecentViewHolder(BaseQuickAdapter adapter) {
|
||||
super(adapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getContent(RecentContact recent) {
|
||||
String content = descOfMsg(recent);
|
||||
|
||||
String fromId = recent.getFromAccount();
|
||||
if (!TextUtils.isEmpty(fromId)
|
||||
&& !fromId.equals(NimUIKit.getAccount())
|
||||
&& !(recent.getAttachment() instanceof NotificationAttachment)) {
|
||||
String tid = recent.getContactId();
|
||||
String teamNick = getTeamUserDisplayName(tid, fromId);
|
||||
content = teamNick + ": " + content;
|
||||
|
||||
if (TeamMemberAitHelper.hasAitExtension(recent)) {
|
||||
if (recent.getUnreadCount() == 0) {
|
||||
TeamMemberAitHelper.clearRecentContactAited(recent);
|
||||
} else {
|
||||
content = TeamMemberAitHelper.getAitAlertString(content);
|
||||
}
|
||||
}
|
||||
}
|
||||
return content;
|
||||
}
|
||||
|
||||
private String getTeamUserDisplayName(String tid, String account) {
|
||||
return TeamHelper.getTeamMemberDisplayName(tid, account);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user