接入融云IM-不够金币发送时本地插入条消息并前面显示叹号

一、前言

这个需求一模一样比较少,但是类似的可能有。它是我前面发送消息时请求接口拦截和每个消息模板加上底部提示语这两篇文章的结合。
具体看看文档:https://www.jianshu.com/p/8d420fc48b72
https://www.jianshu.com/p/84cf9307a70f

二、效果图

金色提示.png

这条就是本地插入的,并且前面显示个叹号

三、解决思路

前面接口如何拦截发送就不说,本地插入用insertOutgoingMessage,再用message.content的extra做个标识,用于显示金色叹号

四、关键参考代码:

接口拦截中:

_40007 -> {
                    if (message.extra == null || message.extra != "isAdded"){
                        val mc = message.content
                        val customizeMsgExtra = CustomizeMsgExtra()
                        customizeMsgExtra.appSendState = 1
                        val tmContent = Gson().toJson(customizeMsgExtra)
                        mc.extra = tmContent

                        RongIM.getInstance().insertOutgoingMessage(
                            Conversation.ConversationType.PRIVATE,
                            message.targetId,
                            Message.SentStatus.RECEIVED,
                            mc,
                            null
                        )
                    }  

MyBaseMessageItemProvider

public abstract class MyBaseMessageItemProvider<T extends MessageContent> implements IMessageProvider<T> {
private static final String TAG = "BaseMessageItemProvider";
protected MessageItemProviderConfig mConfig = new MessageItemProviderConfig();

public MyBaseMessageItemProvider() {
}

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.rc_message_item, parent, false);
    FrameLayout contentView = (FrameLayout)rootView.findViewById(R.id.rc_content);
    ViewHolder contentViewHolder = this.onCreateMessageContentViewHolder(contentView, viewType);
    if (contentViewHolder != null && contentView.getChildCount() == 0) {
        contentView.addView(contentViewHolder.itemView);
    }

    return new MessageViewHolder(rootView.getContext(), rootView, contentViewHolder);
}

protected abstract ViewHolder onCreateMessageContentViewHolder(ViewGroup var1, int var2);

public boolean isItemViewType(UiMessage item) {
    return this.isMessageViewType(item.getMessage().getContent());
}

public void bindViewHolder(ViewHolder holder, final UiMessage uiMessage, int position, List<UiMessage> list, final IViewProviderListener<UiMessage> listener) {

    if (uiMessage != null && uiMessage.getMessage() != null && listener != null) {
        LogUtils.INSTANCE.o("uiMessage",uiMessage);
        Message message = uiMessage.getMessage();
        holder.setVisible(R.id.rc_selected, uiMessage.isEdit());
        holder.setVisible(R.id.rc_v_edit, uiMessage.isEdit());
        if (uiMessage.isEdit()) {
            holder.setSelected(R.id.rc_selected, uiMessage.isSelected());
            holder.setOnClickListener(R.id.rc_v_edit, new View.OnClickListener() {
                public void onClick(View v) {
                    listener.onViewClick(-10, uiMessage);
                }
            });
        }

        boolean isSender = uiMessage.getMessage().getMessageDirection().equals(Message.MessageDirection.SEND);
        this.initTime(holder, position, list, message);
        this.initUserInfo(holder, uiMessage, position, listener, isSender);
        this.initContent(holder, isSender, uiMessage, position, listener, list);
        this.initStatus(holder, uiMessage, position, listener, message, isSender, list);
        this.initCusSendMessageFail(holder, isSender,position,message);
        if (holder instanceof MessageViewHolder) {
            this.bindMessageContentViewHolder(((MessageViewHolder)holder).getMessageContentViewHolder(), holder, (T) uiMessage.getMessage().getContent(), uiMessage, position, list, listener);
        } else {
            RLog.e("BaseMessageItemProvider", "holder is not MessageViewHolder");
        }

        uiMessage.setChange(false);
    } else {
        RLog.e("BaseMessageItemProvider", "uiMessage is null");
    }

}

private void initTime(ViewHolder holder, int position, List<UiMessage> data, Message message) {
    String time = RongDateUtils.getConversationFormatDate(message.getSentTime(), holder.getContext());
    holder.setText(R.id.rc_time, time);
    if (position == 0) {
        holder.setVisible(R.id.rc_time, !(message.getContent() instanceof HistoryDividerMessage));
    } else {
        UiMessage pre = (UiMessage)data.get(position - 1);
        if (pre.getMessage() != null && RongDateUtils.isShowChatTime(message.getSentTime(), pre.getMessage().getSentTime(), 180)) {
            holder.setVisible(R.id.rc_time, true);
        } else {
            holder.setVisible(R.id.rc_time, false);
        }
    }

}

private void initUserInfo(final ViewHolder holder, final UiMessage uiMessage, int position, final IViewProviderListener<UiMessage> listener, boolean isSender) {
    if (this.mConfig.showPortrait) {
        holder.setVisible(R.id.rc_left_portrait, !isSender);
        holder.setVisible(R.id.rc_right_portrait, isSender);
        ImageView view = (ImageView)holder.getView(isSender ? R.id.rc_right_portrait :R.id.rc_left_portrait);
        if (uiMessage.getUserInfo().getPortraitUri() != null) {
            RongConfigCenter.featureConfig().getKitImageEngine().loadConversationPortrait(holder.getContext(), uiMessage.getUserInfo().getPortraitUri().toString(), view, uiMessage.getMessage());
        }

        holder.setOnClickListener(R.id.rc_left_portrait, new View.OnClickListener() {
            public void onClick(View v) {
                if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                    boolean result = RongConfigCenter.conversationConfig().getConversationClickListener().onUserPortraitClick(holder.getContext(), uiMessage.getMessage().getConversationType(), uiMessage.getUserInfo(), uiMessage.getMessage().getTargetId());
                    if (!result) {
                        listener.onViewClick(-5, uiMessage);
                    }
                }

            }
        });
        holder.setOnClickListener(R.id.rc_right_portrait, new View.OnClickListener() {
            public void onClick(View v) {
                if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                    boolean result = RongConfigCenter.conversationConfig().getConversationClickListener().onUserPortraitClick(holder.getContext(), uiMessage.getMessage().getConversationType(), uiMessage.getUserInfo(), uiMessage.getMessage().getTargetId());
                    if (!result) {
                        listener.onViewClick(-5, uiMessage);
                    }
                }

            }
        });
        holder.setOnLongClickListener(R.id.rc_left_portrait, new View.OnLongClickListener() {
            public boolean onLongClick(View v) {
                if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                    boolean result = RongConfigCenter.conversationConfig().getConversationClickListener().onUserPortraitLongClick(holder.getContext(), uiMessage.getMessage().getConversationType(), uiMessage.getUserInfo(), uiMessage.getMessage().getTargetId());
                    if (!result) {
                        return listener.onViewLongClick(-6, uiMessage);
                    }
                }

                return false;
            }
        });
        holder.setOnLongClickListener(R.id.rc_right_portrait, new View.OnLongClickListener() {
            public boolean onLongClick(View v) {
                if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                    boolean result = RongConfigCenter.conversationConfig().getConversationClickListener().onUserPortraitLongClick(holder.getContext(), uiMessage.getMessage().getConversationType(), uiMessage.getUserInfo(), uiMessage.getMessage().getTargetId());
                    if (!result) {
                        return listener.onViewLongClick(-6, uiMessage);
                    }
                }

                return false;
            }
        });
        if (!RongConfigCenter.conversationConfig().isShowReceiverUserTitle(uiMessage.getMessage().getConversationType())) {
            holder.setVisible(R.id.rc_title, false);
        } else if (!isSender) {
            holder.setVisible(R.id.rc_title, true);
            holder.setText(R.id.rc_title, !TextUtils.isEmpty(uiMessage.getNickname()) ? uiMessage.getNickname() : uiMessage.getUserInfo().getName());
        } else {
            holder.setVisible(R.id.rc_title, false);
        }
    } else {
        holder.setVisible(R.id.rc_left_portrait, false);
        holder.setVisible(R.id.rc_right_portrait, false);
        holder.setVisible(R.id.rc_title, false);
    }

}

private void initContent(final ViewHolder holder, boolean isSender, final UiMessage uiMessage, final int position, final IViewProviderListener<UiMessage> listener, final List<UiMessage> list) {
    if (this.mConfig.showContentBubble) {
        if (ChattingActivity.Companion.getExpireUidList() != null && ChattingActivity.Companion.getExpireUidList().size() > 0){
            if (isSender){
                //我发的
                holder.setBackgroundRes(R.id.rc_content, ChattingActivity.Companion.getExpireUidList().contains(uiMessage.getUId()) ? R.drawable.rc_ic_bubble_right_grey : R.drawable.rc_ic_bubble_right);
            } else {
                holder.setBackgroundRes(R.id.rc_content, R.drawable.rc_ic_bubble_left);
            }
        } else {
            holder.setBackgroundRes(R.id.rc_content, isSender ? R.drawable.rc_ic_bubble_right : R.drawable.rc_ic_bubble_left);
        }

    } else {
        holder.getView(R.id.rc_content).setBackground((Drawable)null);
    }

    if (ChattingActivity.Companion.getExpireUidList() != null && ChattingActivity.Companion.getExpireUidList().size() > 0){
        if (isSender){
            //我发的
            holder.setVisible(R.id.app_message_gold_right_status,ChattingActivity.Companion.getExpireUidList().contains(uiMessage.getUId()));
            holder.setVisible(R.id.app_message_gold_left_status,false);
        } else {
            holder.setVisible(R.id.app_message_gold_left_status,ChattingActivity.Companion.getExpireUidList().contains(uiMessage.getUId()));
            holder.setVisible(R.id.app_message_gold_right_status,false);
        }
    } else {
        holder.setVisible(R.id.app_message_gold_left_status,false);
        holder.setVisible(R.id.app_message_gold_right_status,false);
    }


    holder.setPadding(R.id.rc_content, 0, 0, 0, 0);
    LinearLayout layout = (LinearLayout)holder.getView(R.id.rc_layout);
    if (this.mConfig.centerInHorizontal) {
        layout.setGravity(1);
    } else {
        layout.setGravity(isSender ? 8388613 : 8388611);
    }

    holder.setOnClickListener(R.id.rc_content, new View.OnClickListener() {
        public void onClick(View v) {
            boolean result = false;
            if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                result = RongConfigCenter.conversationConfig().getConversationClickListener().onMessageClick(holder.getContext(), v, uiMessage.getMessage());
            }

            if (!result) {
                result = onItemClick(((MessageViewHolder)holder).getMessageContentViewHolder(), (T) uiMessage.getMessage().getContent(), uiMessage, position, list, listener);
                if (!result) {
                    listener.onViewClick(-9, uiMessage);
                }
            }

        }
    });
    holder.setOnLongClickListener(R.id.rc_content, new View.OnLongClickListener() {
        public boolean onLongClick(View v) {
            boolean result = false;
            if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                result = RongConfigCenter.conversationConfig().getConversationClickListener().onMessageLongClick(holder.getContext(), v, uiMessage.getMessage());
            }

            if (!result) {
                result = onItemLongClick(((MessageViewHolder)holder).getMessageContentViewHolder(), (T) uiMessage.getMessage().getContent(), uiMessage, position, list, listener);
                if (!result) {
                    return listener.onViewLongClick(-4, uiMessage);
                }
            }

            return false;
        }
    });
}

/**
 * @desc : 自定义由于金币不足导致发送消息失败的显示
 * @author : congge on 2022-03-09 17:23
 **/
private void initCusSendMessageFail(ViewHolder holder,boolean isSender,int position,  Message message){

    if (message.getContent().getExtra() != null && message.getContent().getExtra().contains("appSendState") && isSender){
        CustomizeMsgExtra customizeMsgExtra = new Gson().fromJson(message.getContent().getExtra(),CustomizeMsgExtra.class);
        if (customizeMsgExtra != null && customizeMsgExtra.getAppSendState() == 1){
            holder.setVisible(R.id.app_send_msg_fail, true);
            holder.setVisible(R.id.rc_warning, false); //正常不会
            holder.setOnClickListener(R.id.app_send_msg_fail, new View.OnClickListener() {
                public void onClick(View v) {
                    message.setExtra("isAdded");
                    MyImagePlugin.selectDataSize = 1;
                    if (message.getContent() != null){
                        MessageContent mc = message.getContent();
                        if (mc instanceof HQVoiceMessage || mc instanceof ImageMessage || mc instanceof SightMessage || mc instanceof GIFMessage ){
                            RongIM.getInstance().sendMediaMessage(message, "", "", new IRongCallback.ISendMediaMessageCallback() {
                                @Override
                                public void onProgress(Message message, int i) {

                                }

                                @Override
                                public void onCanceled(Message message) {

                                }

                                @Override
                                public void onAttached(Message message) {

                                }

                                @Override
                                public void onSuccess(Message message) {

                                }

                                @Override
                                public void onError(Message message, RongIMClient.ErrorCode errorCode) {

                                }
                            });
                        } else {
                            RongIM.getInstance().sendMessage(message,"","",null);
                        }
                    } else {
                        RongIM.getInstance().sendMessage(message,"","",null);
                    }

                }
            });
        } else  {
            holder.setVisible(R.id.app_send_msg_fail, false);
        }
    } else {
        holder.setVisible(R.id.app_send_msg_fail, false);
    }

}

private void initStatus(ViewHolder holder, final UiMessage uiMessage, int position, final IViewProviderListener<UiMessage> listener, Message message, boolean isSender, List<UiMessage> list) {
    if (this.mConfig.showWarning && !ResendManager.getInstance().needResend(uiMessage.getMessage().getMessageId())) {
        if (isSender && uiMessage.getState() == 1) {
            holder.setVisible(R.id.rc_warning, true);
            holder.setOnClickListener(R.id.rc_warning, new View.OnClickListener() {
                public void onClick(View v) {
                    listener.onViewClick(-1, uiMessage);
                }
            });
        } else {
            holder.setVisible(R.id.rc_warning, false);
        }
    } else {
        holder.setVisible(R.id.rc_warning, false);
    }

    if (this.mConfig.showProgress) {
        if (isSender && uiMessage.getState() == 2) {
            holder.setVisible(R.id.rc_progress, true);
        } else if (isSender && uiMessage.getState() == 1 && ResendManager.getInstance().needResend(uiMessage.getMessage().getMessageId())) {
            holder.setVisible(R.id.rc_progress, true);
        } else {
            holder.setVisible(R.id.rc_progress, false);
        }
    } else {
        holder.setVisible(R.id.rc_progress, false);
    }

    this.initReadStatus(holder, uiMessage, position, listener, message, isSender, list);
}

protected abstract void bindMessageContentViewHolder(ViewHolder var1, ViewHolder var2, T var3, UiMessage var4, int var5, List<UiMessage> var6, IViewProviderListener<UiMessage> var7);

protected abstract boolean onItemClick(ViewHolder var1, T var2, UiMessage var3, int var4, List<UiMessage> var5, IViewProviderListener<UiMessage> var6);

protected boolean onItemLongClick(ViewHolder holder, T t, UiMessage uiMessage, int position, List<UiMessage> list, IViewProviderListener<UiMessage> listener) {
    return false;
}

private void initReadStatus(ViewHolder holder, final UiMessage uiMessage, int position, final IViewProviderListener<UiMessage> listener, Message message, boolean isSender, List<UiMessage> list) {
    LogUtils.INSTANCE.i("initReadStatus",RongConfigCenter.conversationConfig().isShowReadReceipt(message.getConversationType())+"\t"+this.mConfig.showReadState+"\t"+isSender+"\t"+(message.getSentStatus() == Message.SentStatus.READ));
    if (RongConfigCenter.conversationConfig().isShowReadReceipt(message.getConversationType()) && this.mConfig.showReadState && isSender && message.getSentStatus() == Message.SentStatus.READ) {
        holder.setVisible(R.id.rc_read_receipt, true);
    } else {
        holder.setVisible(R.id.rc_read_receipt, false);
    }

    if (RongConfigCenter.conversationConfig().isShowReadReceiptRequest(message.getConversationType()) && this.showReadReceiptRequest(message) && isSender && !TextUtils.isEmpty(message.getUId())) {
        boolean isLastSentMessage = true;

        for(int i = position + 1; i < list.size(); ++i) {
            if (((UiMessage)list.get(i)).getMessage().getMessageDirection() == Message.MessageDirection.SEND) {
                isLastSentMessage = false;
                break;
            }
        }

        long serverTime = System.currentTimeMillis() - RongIMClient.getInstance().getDeltaTime();
        if (serverTime - message.getSentTime() >= (long)(RongConfigCenter.conversationConfig().rc_read_receipt_request_interval * 1000) || !isLastSentMessage || message.getReadReceiptInfo() != null && message.getReadReceiptInfo().isReadReceiptMessage()) {
            holder.setVisible(R.id.rc_read_receipt_request, false);
        } else {
            holder.setVisible(R.id.rc_read_receipt_request, true);
            holder.setOnClickListener(R.id.rc_read_receipt_request, new View.OnClickListener() {
                public void onClick(View v) {
                    listener.onViewClick(-2, uiMessage);
                }
            });
        }

        if (message.getReadReceiptInfo() != null && message.getReadReceiptInfo().isReadReceiptMessage()) {
            if (message.getReadReceiptInfo().getRespondUserIdList() != null) {
                holder.setText(R.id.rc_read_receipt_status, message.getReadReceiptInfo().getRespondUserIdList().size() + " " + holder.getContext().getString(R.string.rc_read_receipt_status));
            } else {
                holder.setText(R.id.rc_read_receipt_status, "0 " + holder.getContext().getString(R.string.rc_read_receipt_status));
            }

            holder.setVisible(R.id.rc_read_receipt_status, true);
            holder.setOnClickListener(R.id.rc_read_receipt_status, new View.OnClickListener() {
                public void onClick(View v) {
                    ConversationClickListener conversationClickListener = RongConfigCenter.conversationConfig().getConversationClickListener();
                    if (conversationClickListener == null || !conversationClickListener.onReadReceiptStateClick(v.getContext(), uiMessage.getMessage())) {
                        listener.onViewClick(-3, uiMessage);
                    }
                }
            });
        } else {
            holder.setVisible(R.id.rc_read_receipt_status, false);
        }
    } else {
        holder.setVisible(R.id.rc_read_receipt_request, false);
        holder.setVisible(R.id.rc_read_receipt_status, false);
    }

}

protected boolean showReadReceiptRequest(Message message) {
    return message != null && message.getContent() != null && message.getContent() instanceof TextMessage;
}

protected abstract boolean isMessageViewType(MessageContent var1);

public boolean isSummaryType(MessageContent messageContent) {
    return this.isMessageViewType(messageContent);
}

public boolean showSummaryWithName() {
    return this.mConfig.showSummaryWithName;
}

public static class MessageViewHolder extends ViewHolder {
    private ViewHolder mMessageContentViewHolder;

    public MessageViewHolder(Context context, View itemView, ViewHolder messageViewHolder) {
        super(context, itemView);
        this.mMessageContentViewHolder = messageViewHolder;
    }

    public ViewHolder getMessageContentViewHolder() {
        return this.mMessageContentViewHolder;
    }
}}  

initCusSendMessageFail方法就是处理如何显示金色叹号的

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容