package com.lqr.wechat.ui.presenter; import android.content.Context; import android.content.Intent; import android.text.TextUtils; import android.text.style.ImageSpan; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.lqr.adapter.LQRAdapterForRecyclerView; import com.lqr.adapter.LQRViewHolderForRecyclerView; import com.lqr.emoji.MoonUtils; import com.lqr.ninegridimageview.LQRNineGridImageView; import com.lqr.ninegridimageview.LQRNineGridImageViewAdapter; import com.lqr.wechat.R; import com.lqr.wechat.db.DBManager; import com.lqr.wechat.db.model.GroupMember; import com.lqr.wechat.db.model.Groups; import com.lqr.wechat.manager.JsonMananger; import com.lqr.wechat.model.cache.UserCache; import com.lqr.wechat.model.data.GroupNotificationMessageData; import com.lqr.wechat.model.message.RedPacketMessage; import com.lqr.wechat.ui.activity.MainActivity; import com.lqr.wechat.ui.activity.SessionActivity; import com.lqr.wechat.ui.base.BaseActivity; import com.lqr.wechat.ui.base.BasePresenter; import com.lqr.wechat.ui.view.IRecentMessageFgView; import com.lqr.wechat.util.LogUtils; import com.lqr.wechat.util.MediaFileUtils; import com.lqr.wechat.util.TimeUtils; import com.lqr.wechat.util.UIUtils; import com.lqr.wechat.widget.CustomDialog; import java.util.ArrayList; import java.util.List; import io.rong.imlib.RongIMClient; import io.rong.imlib.model.Conversation; import io.rong.imlib.model.UserInfo; import io.rong.message.FileMessage; import io.rong.message.GroupNotificationMessage; import io.rong.message.ImageMessage; import io.rong.message.LocationMessage; import io.rong.message.TextMessage; import io.rong.message.VoiceMessage; import retrofit2.adapter.rxjava.HttpException; public class RecentMessageFgPresenter extends BasePresenter<IRecentMessageFgView> { private List<Conversation> mData = new ArrayList<>(); private LQRAdapterForRecyclerView<Conversation> mAdapter; private int mUnreadCountTotal = 0; private LQRNineGridImageViewAdapter mNgivAdapter = new LQRNineGridImageViewAdapter<GroupMember>() { @Override protected void onDisplayImage(Context context, ImageView imageView, GroupMember groupMember) { Glide.with(context).load(groupMember.getPortraitUri()).centerCrop().into(imageView); } }; private CustomDialog mConversationMenuDialog; public RecentMessageFgPresenter(BaseActivity context) { super(context); } public void getConversations() { loadData(); setAdapter(); } private void loadData() { RongIMClient.getInstance().getConversationList(new RongIMClient.ResultCallback<List<Conversation>>() { @Override public void onSuccess(List<Conversation> conversations) { if (conversations != null && conversations.size() > 0) { mData.clear(); mData.addAll(conversations); filterData(mData); } } @Override public void onError(RongIMClient.ErrorCode errorCode) { LogUtils.e("加载最近会话失败:" + errorCode); } }); } private void filterData(List<Conversation> conversations) { for (int i = 0; i < conversations.size(); i++) { Conversation item = conversations.get(i); //其他消息会话不显示(比如:系统消息) if (!(item.getConversationType() == Conversation.ConversationType.PRIVATE || item.getConversationType() == Conversation.ConversationType.GROUP)) { conversations.remove(i); i--; continue; } if (item.getConversationType() == Conversation.ConversationType.GROUP) { List<GroupMember> groupMembers = DBManager.getInstance().getGroupMembers(item.getTargetId()); if (groupMembers == null || groupMembers.size() == 0) { DBManager.getInstance().deleteGroupsById(item.getTargetId());//删除没有群成员的群 conversations.remove(i); i--; } } else if (item.getConversationType() == Conversation.ConversationType.PRIVATE) { if (!DBManager.getInstance().isMyFriend(item.getTargetId())) { conversations.remove(i); i--; } } } mUnreadCountTotal = 0; for (Conversation conversation : conversations) { mUnreadCountTotal += conversation.getUnreadMessageCount(); } updateTotalUnreadView(); if (mAdapter != null) mAdapter.notifyDataSetChangedWrapper(); } private void updateTotalUnreadView() { if (mUnreadCountTotal > 0) { ((MainActivity) mContext).getTvMessageCount().setText(mUnreadCountTotal + ""); ((MainActivity) mContext).getTvMessageCount().setVisibility(View.VISIBLE); ((MainActivity) mContext).setToolbarTitle(UIUtils.getString(R.string.app_name) + "(" + mUnreadCountTotal + ")"); } else { ((MainActivity) mContext).getTvMessageCount().setVisibility(View.GONE); ((MainActivity) mContext).setToolbarTitle(UIUtils.getString(R.string.app_name)); } } private void setAdapter() { if (mAdapter == null) { mAdapter = new LQRAdapterForRecyclerView<Conversation>(mContext, mData, R.layout.item_recent_message) { @Override public void convert(LQRViewHolderForRecyclerView helper, Conversation item, int position) { if (item.getConversationType() == Conversation.ConversationType.PRIVATE) { ImageView ivHeader = helper.getView(R.id.ivHeader); UserInfo userInfo = DBManager.getInstance().getUserInfo(item.getTargetId()); if (userInfo != null) { Glide.with(mContext).load(userInfo.getPortraitUri()).centerCrop().into(ivHeader); helper.setText(R.id.tvDisplayName, userInfo.getName()) .setText(R.id.tvTime, TimeUtils.getMsgFormatTime(item.getReceivedTime())) .setViewVisibility(R.id.ngiv, View.GONE) .setViewVisibility(R.id.ivHeader, View.VISIBLE); } } else { Groups groups = DBManager.getInstance().getGroupsById(item.getTargetId()); //九宫格头像 LQRNineGridImageView ngiv = helper.getView(R.id.ngiv); ngiv.setAdapter(mNgivAdapter); ngiv.setImagesData(DBManager.getInstance().getGroupMembers(item.getTargetId())); //群昵称 helper.setText(R.id.tvDisplayName, groups == null ? "" : groups.getName()) .setText(R.id.tvTime, TimeUtils.getMsgFormatTime(item.getReceivedTime())) .setViewVisibility(R.id.ngiv, View.VISIBLE) .setViewVisibility(R.id.ivHeader, View.GONE); } // helper.setBackgroundColor(R.id.flRoot, item.isTop() ? UIUtils.getColor(R.color.gray7) : UIUtils.getColor(android.R.color.white)) helper.setBackgroundColor(R.id.flRoot, item.isTop() ? R.color.gray8 : android.R.color.white) .setText(R.id.tvCount, item.getUnreadMessageCount() + "") .setViewVisibility(R.id.tvCount, item.getUnreadMessageCount() > 0 ? View.VISIBLE : View.GONE); TextView tvContent = helper.getView(R.id.tvContent); if (!TextUtils.isEmpty(item.getDraft())) { MoonUtils.identifyFaceExpression(mContext, tvContent, item.getDraft(), ImageSpan.ALIGN_BOTTOM); helper.setViewVisibility(R.id.tvDraft, View.VISIBLE); return; } else { helper.setViewVisibility(R.id.tvDraft, View.GONE); } if (item.getLatestMessage() instanceof TextMessage) { MoonUtils.identifyFaceExpression(mContext, tvContent, ((TextMessage) item.getLatestMessage()).getContent(), ImageSpan.ALIGN_BOTTOM); } else if (item.getLatestMessage() instanceof ImageMessage) { tvContent.setText("[" + UIUtils.getString(R.string.picture) + "]"); } else if (item.getLatestMessage() instanceof VoiceMessage) { tvContent.setText("[" + UIUtils.getString(R.string.voice) + "]"); } else if (item.getLatestMessage() instanceof FileMessage) { FileMessage fileMessage = (FileMessage) item.getLatestMessage(); if (MediaFileUtils.isImageFileType(fileMessage.getName())) { tvContent.setText("[" + UIUtils.getString(R.string.sticker) + "]"); } else if (MediaFileUtils.isVideoFileType(fileMessage.getName())) { tvContent.setText("[" + UIUtils.getString(R.string.video) + "]"); } } else if (item.getLatestMessage() instanceof LocationMessage) { tvContent.setText("[" + UIUtils.getString(R.string.location) + "]"); } else if (item.getLatestMessage() instanceof GroupNotificationMessage) { GroupNotificationMessage groupNotificationMessage = (GroupNotificationMessage) item.getLatestMessage(); try { UserInfo curUserInfo = DBManager.getInstance().getUserInfo(UserCache.getId()); GroupNotificationMessageData data = JsonMananger.jsonToBean(groupNotificationMessage.getData(), GroupNotificationMessageData.class); String operation = groupNotificationMessage.getOperation(); String notification = ""; String operatorName = data.getOperatorNickname().equals(curUserInfo.getName()) ? UIUtils.getString(R.string.you) : data.getOperatorNickname(); String targetUserDisplayNames = ""; List<String> targetUserDisplayNameList = data.getTargetUserDisplayNames(); for (String name : targetUserDisplayNameList) { targetUserDisplayNames += name.equals(curUserInfo.getName()) ? UIUtils.getString(R.string.you) : name; } if (operation.equalsIgnoreCase(GroupNotificationMessage.GROUP_OPERATION_CREATE)) { notification = UIUtils.getString(R.string.created_group, operatorName); } else if (operation.equalsIgnoreCase(GroupNotificationMessage.GROUP_OPERATION_DISMISS)) { notification = operatorName + UIUtils.getString(R.string.dismiss_groups); } else if (operation.equalsIgnoreCase(GroupNotificationMessage.GROUP_OPERATION_KICKED)) { if (operatorName.contains(UIUtils.getString(R.string.you))) { notification = UIUtils.getString(R.string.remove_group_member, operatorName, targetUserDisplayNames); } else { notification = UIUtils.getString(R.string.remove_self, targetUserDisplayNames, operatorName); } } else if (operation.equalsIgnoreCase(GroupNotificationMessage.GROUP_OPERATION_ADD)) { notification = UIUtils.getString(R.string.invitation, operatorName, targetUserDisplayNames); } else if (operation.equalsIgnoreCase(GroupNotificationMessage.GROUP_OPERATION_QUIT)) { notification = operatorName + UIUtils.getString(R.string.quit_groups); } else if (operation.equalsIgnoreCase(GroupNotificationMessage.GROUP_OPERATION_RENAME)) { notification = UIUtils.getString(R.string.change_group_name, operatorName, data.getTargetGroupName()); } tvContent.setText(notification); } catch (HttpException e) { e.printStackTrace(); } } else if (item.getLatestMessage() instanceof RedPacketMessage) { RedPacketMessage redPacketMessage = (RedPacketMessage) item.getLatestMessage(); tvContent.setText("[" + UIUtils.getString(R.string.wx_red_pack) + "]" + redPacketMessage.getContent()); } } }; mAdapter.setOnItemClickListener((helper, parent, itemView, position) -> { Intent intent = new Intent(mContext, SessionActivity.class); Conversation item = mData.get(position); intent.putExtra("sessionId", item.getTargetId()); if (item.getConversationType() == Conversation.ConversationType.PRIVATE) { intent.putExtra("sessionType", SessionActivity.SESSION_TYPE_PRIVATE); } else { intent.putExtra("sessionType", SessionActivity.SESSION_TYPE_GROUP); } mContext.jumpToActivity(intent); }); mAdapter.setOnItemLongClickListener((helper, parent, itemView, position) -> { Conversation item = mData.get(position); View conversationMenuView = View.inflate(mContext, R.layout.dialog_conversation_menu, null); mConversationMenuDialog = new CustomDialog(mContext, conversationMenuView, R.style.MyDialog); TextView tvSetConversationToTop = (TextView) conversationMenuView.findViewById(R.id.tvSetConversationToTop); tvSetConversationToTop.setText(item.isTop() ? UIUtils.getString(R.string.cancel_conversation_to_top) : UIUtils.getString(R.string.set_conversation_to_top)); conversationMenuView.findViewById(R.id.tvSetConversationToTop).setOnClickListener(v -> RongIMClient.getInstance().setConversationToTop(item.getConversationType(), item.getTargetId(), !item.isTop(), new RongIMClient.ResultCallback<Boolean>() { @Override public void onSuccess(Boolean aBoolean) { loadData(); mConversationMenuDialog.dismiss(); mConversationMenuDialog = null; } @Override public void onError(RongIMClient.ErrorCode errorCode) { } })); conversationMenuView.findViewById(R.id.tvDeleteConversation).setOnClickListener(v -> { RongIMClient.getInstance().removeConversation(item.getConversationType(), item.getTargetId(), new RongIMClient.ResultCallback<Boolean>() { @Override public void onSuccess(Boolean aBoolean) { loadData(); mConversationMenuDialog.dismiss(); mConversationMenuDialog = null; } @Override public void onError(RongIMClient.ErrorCode errorCode) { } }); }); mConversationMenuDialog.show(); return true; }); getView().getRvRecentMessage().setAdapter(mAdapter); } } }