Kaynağa Gözat

增加群主标记

Pq 2 yıl önce
ebeveyn
işleme
324600fb96
23 değiştirilmiş dosya ile 258 ekleme ve 38 silme
  1. 3 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/GroupMemberAdapter.java
  2. 21 0
      rong_im/common_im_ui/src/main/java/com/common/im/api/IMApi.java
  3. 29 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupUserInfoBean.java
  4. 3 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/MessageFragmentContract.java
  5. 46 6
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/MessagePresenter.java
  6. 37 10
      rong_im/common_im_ui/src/main/java/com/common/im/ui/MessageFragment.java
  7. 4 5
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ChatGroupSettingActivity.java
  8. BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_group_admin_tag2.png
  9. BIN
      rong_im/common_im_ui/src/main/res/drawable-xxhdpi/icon_group_admin_tag2.png
  10. 19 4
      rong_im/common_im_ui/src/main/res/layout/group_member_list_item.xml
  11. 1 1
      rong_im/kit/gradle.properties
  12. 20 1
      rong_im/kit/src/main/java/io/rong/imkit/conversation/messgelist/provider/BaseMessageItemProvider.java
  13. 1 0
      rong_im/kit/src/main/java/io/rong/imkit/model/UiMessage.java
  14. 2 2
      rong_im/kit/src/main/java/io/rong/imkit/userinfo/RongUserInfoManager.java
  15. 1 1
      rong_im/kit/src/main/java/io/rong/imkit/userinfo/UserDataDelegate.java
  16. 1 1
      rong_im/kit/src/main/java/io/rong/imkit/userinfo/UserDatabase.java
  17. 5 1
      rong_im/kit/src/main/java/io/rong/imkit/userinfo/db/model/GroupMember.java
  18. 11 1
      rong_im/kit/src/main/java/io/rong/imkit/userinfo/model/GroupUserInfo.java
  19. 13 0
      rong_im/kit/src/main/java/io/rong/imkit/utils/GroupUtils.java
  20. BIN
      rong_im/kit/src/main/res/drawable-xhdpi/icon_group_admin_tag.png
  21. BIN
      rong_im/kit/src/main/res/drawable-xxhdpi/icon_group_admin_tag.png
  22. 40 4
      rong_im/kit/src/main/res/layout/rc_message_item.xml
  23. 1 1
      rong_im/kit/src/main/res/values/dimen.xml

+ 3 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/GroupMemberAdapter.java

@@ -43,6 +43,9 @@ public class GroupMemberAdapter extends BaseQuickAdapter<GroupMemberBean, BaseVi
         } else {
             viewLine.setVisibility(View.VISIBLE);
         }
+        //群主标记
+        View iv_group_admin_tag = helper.getView(R.id.iv_group_admin_tag);
+        iv_group_admin_tag.setVisibility(bean.isAdmin() ? View.VISIBLE : View.GONE);
 
         if (null != bean) {
             GlideUtils.INSTANCE.loadImage(getContext(), bean.getAvatar(), ivIcon);

+ 21 - 0
rong_im/common_im_ui/src/main/java/com/common/im/api/IMApi.java

@@ -9,6 +9,7 @@ import com.common.im.bean.ContactRoomListBean;
 import com.common.im.bean.GroupApplyBean;
 import com.common.im.bean.GroupMemberBean;
 import com.common.im.bean.GroupNoticeBean;
+import com.common.im.bean.GroupUserInfoBean;
 import com.common.im.bean.MusicSheetListBean;
 import com.common.im.bean.RongIMGroupInfo;
 import com.common.im.bean.RongIMUserInfo;
@@ -70,6 +71,26 @@ public interface IMApi {
     @POST(STUDENT_GROUP + "imUserFriend/getDetail/{userId}")
     Observable<BaseResponse<RongIMUserInfo>> queryStuFriendDetail(@Path("userId") String userId);
 
+
+    /**
+     * 根据用户编号获取用户基本信息-学生
+     *
+     * @param
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroupMember/getUserDetail")
+    Observable<BaseResponse<GroupUserInfoBean>> queryGroupFriendDetailForTeacher(@Body RequestBody requestBody);
+
+
+    /**
+     * 根据用户编号获取用户基本信息-学生
+     *
+     * @param
+     * @return
+     */
+    @POST(STUDENT_GROUP + "imGroupMember/getUserDetail")
+    Observable<BaseResponse<GroupUserInfoBean>> queryGroupFriendDetailForStu(@Body RequestBody requestBody);
+
     /**
      * 根据用户编号获取用户基本信息-老师
      *

+ 29 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupUserInfoBean.java

@@ -0,0 +1,29 @@
+package com.common.im.bean;
+
+/**
+ * Author by pq, Date on 2022/8/4.
+ */
+public class GroupUserInfoBean {
+
+    /**
+     * avatar :
+     * createTime :
+     * groupId :
+     * id : 0
+     * isAdmin : true
+     * nickname :
+     * roleType :
+     * updateTime :
+     * userId : 0
+     */
+
+    public String avatar;
+    public String createTime;
+    public String groupId;
+    public int id;
+    public boolean isAdmin;
+    public String nickname;
+    public String roleType;
+    public String updateTime;
+    public String userId;
+}

+ 3 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/MessageFragmentContract.java

@@ -1,5 +1,6 @@
 package com.common.im.contract;
 
+import com.common.im.bean.GroupUserInfoBean;
 import com.common.im.bean.RongIMGroupInfo;
 import com.common.im.bean.RongIMUserInfo;
 import com.cooleshow.base.presenter.view.BaseView;
@@ -13,6 +14,8 @@ public interface MessageFragmentContract {
         void onQueryFriendDetail(RongIMUserInfo data);
 
         void onQueryGroupDetail(RongIMGroupInfo data);
+
+        void onQueryGroupUserInfoSuccess(GroupUserInfoBean groupUserInfoBean);
     }
 
     interface Presenter {

+ 46 - 6
rong_im/common_im_ui/src/main/java/com/common/im/presenter/MessagePresenter.java

@@ -6,12 +6,17 @@ import android.text.TextUtils;
 import android.util.Log;
 
 import com.common.im.api.IMApi;
+import com.common.im.bean.GroupUserInfoBean;
 import com.common.im.contract.MessageFragmentContract;
 import com.common.im.bean.RongIMGroupInfo;
 import com.common.im.bean.RongIMUserInfo;
 import com.cooleshow.base.common.BaseApplication;
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+
+import org.json.JSONException;
+import org.json.JSONObject;
 
 import io.rong.imkit.RongIM;
 import io.rong.imlib.model.Group;
@@ -21,7 +26,7 @@ import io.rong.imlib.model.Group;
  */
 public class MessagePresenter extends BasePresenter<MessageFragmentContract.MessageFragmentView> implements MessageFragmentContract.Presenter {
 
-    public void queryFriendDetail(Context context,String userId) {
+    public void queryFriendDetail(Context context, String userId) {
         //根据用户编号获取用户基本信息
         if (!BaseApplication.Companion.isTeacherClient()) {
             addSubscribe(create(IMApi.class).queryStuFriendDetail(userId), new BaseObserver<RongIMUserInfo>(getView()) {
@@ -32,7 +37,7 @@ public class MessagePresenter extends BasePresenter<MessageFragmentContract.Mess
                     }
                 }
             });
-        }else{
+        } else {
             addSubscribe(create(IMApi.class).queryTeaFriendDetail(userId), new BaseObserver<RongIMUserInfo>(getView()) {
                 @Override
                 protected void onSuccess(RongIMUserInfo data) {
@@ -45,6 +50,42 @@ public class MessagePresenter extends BasePresenter<MessageFragmentContract.Mess
 
     }
 
+    /**
+     * 查询群成员信息
+     * @param groupId
+     * @param userId
+     */
+    public void queryGroupFriendDetail(String groupId, String userId) {
+        //根据用户编号获取用户基本信息
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("groupId", groupId);
+            jsonObject.putOpt("userId", userId);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        if (BaseApplication.Companion.isTeacherClient()) {
+            addSubscribe(create(IMApi.class).queryGroupFriendDetailForTeacher(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<GroupUserInfoBean>(getView()) {
+                @Override
+                protected void onSuccess(GroupUserInfoBean data) {
+                    if (getView() != null) {
+                        getView().onQueryGroupUserInfoSuccess(data);
+                    }
+                }
+            });
+        } else {
+            addSubscribe(create(IMApi.class).queryGroupFriendDetailForStu(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<GroupUserInfoBean>(getView()) {
+                @Override
+                protected void onSuccess(GroupUserInfoBean data) {
+                    if (getView() != null) {
+                        getView().onQueryGroupUserInfoSuccess(data);
+                    }
+                }
+            });
+        }
+
+    }
+
 
     //查询群详情
     public void queryGroupDetail(Context context, String groupId) {
@@ -56,7 +97,7 @@ public class MessagePresenter extends BasePresenter<MessageFragmentContract.Mess
                         getView().onQueryGroupDetail(data);
                     }
                     if (data != null) {
-                        String id = data.getId()+"";
+                        String id = data.getId() + "";
                         String name = data.getName();
                         if (!TextUtils.isEmpty(id)) {
                             RongIM.getInstance().refreshGroupInfoCache(new Group(id, name, Uri.parse(TextUtils.isEmpty(data.getImg()) ? "" : data.getImg())));
@@ -65,7 +106,7 @@ public class MessagePresenter extends BasePresenter<MessageFragmentContract.Mess
                 }
 
             });
-        }else{
+        } else {
             addSubscribe(create(IMApi.class).queryTeaGroupDetail(groupId), new BaseObserver<RongIMGroupInfo>() {
                 @Override
                 protected void onSuccess(RongIMGroupInfo data) {
@@ -73,7 +114,7 @@ public class MessagePresenter extends BasePresenter<MessageFragmentContract.Mess
                         getView().onQueryGroupDetail(data);
                     }
                     if (data != null) {
-                        String id = data.getId()+"";
+                        String id = data.getId() + "";
                         String name = data.getName();
                         if (!TextUtils.isEmpty(id)) {
                             RongIM.getInstance().refreshGroupInfoCache(new Group(id, name, Uri.parse(TextUtils.isEmpty(data.getImg()) ? "" : data.getImg())));
@@ -90,5 +131,4 @@ public class MessagePresenter extends BasePresenter<MessageFragmentContract.Mess
     }
 
 
-
 }

+ 37 - 10
rong_im/common_im_ui/src/main/java/com/common/im/ui/MessageFragment.java

@@ -10,17 +10,21 @@ import android.widget.TextView;
 
 import com.alibaba.android.arouter.launcher.ARouter;
 import com.common.im.adapter.MessagePagerAdapter;
+import com.common.im.bean.GroupUserInfoBean;
 import com.common.im.contract.MessageFragmentContract;
+
+import io.rong.imkit.userinfo.model.GroupUserInfo;
 import io.rong.imkit.utils.helper.ConversationFilterHelper;
+
 import com.common.im.presenter.MessagePresenter;
 import com.common.im.ui.contact.ContactListTabFragment;
+import io.rong.imkit.utils.GroupUtils;
 import com.common.im_ui.R;
 import com.common.im_ui.databinding.FragmentMessageLayoutBinding;
 import com.common.im.bean.RongIMGroupInfo;
 import com.common.im.bean.RongIMUserInfo;
 import com.cooleshow.base.common.BaseApplication;
 import com.cooleshow.base.router.RouterPath;
-import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.Utils;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.usercenter.helper.UserHelper;
@@ -54,7 +58,7 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
         Utils.setHeadView(mViewBinding.viewStatusBar, requireContext(), 0);
         if (!BaseApplication.Companion.isTeacherClient()) {
             mViewBinding.imCreateGroup.setVisibility(View.GONE);
-        }else{
+        } else {
             mViewBinding.imCreateGroup.setVisibility(View.VISIBLE);
             mViewBinding.imCreateGroup.setOnClickListener(this);
         }
@@ -74,9 +78,9 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
                     tv_text.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_333333));
                     tv_text.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
                 }
-                if(tab != null && tab.getPosition() == 1){
+                if (tab != null && tab.getPosition() == 1) {
                     ContactListTabFragment fragment = (ContactListTabFragment) fragments.get(tab.getPosition());
-                    if(fragment!=null){
+                    if (fragment != null) {
                         fragment.refreshContactList();
                     }
                 }
@@ -96,18 +100,31 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
             public void onTabReselected(TabLayout.Tab tab) {
             }
         });
+        RongIM.setGroupUserInfoProvider(new UserDataProvider.GroupUserInfoProvider() {
+            @Override
+            public GroupUserInfo getGroupUserInfo(String groupId, String userId) {
+                if (!TextUtils.isEmpty(groupId) && !TextUtils.isEmpty(userId)) {
+                    if (presenter != null) {
+                        presenter.queryGroupFriendDetail(groupId, userId);
+                    }
+                }
+                return null;
+            }
+        }, true);
+
+
         RongIM.setUserInfoProvider(new UserDataProvider.UserInfoProvider() {
             @Override
             public UserInfo getUserInfo(String userId) {
                 if (!TextUtils.isEmpty(localUserid) && localUserid.equals(userId)) {
                     RongIMUserInfo data = new RongIMUserInfo();
-                    data.setFriendId(userId+"");
+                    data.setFriendId(userId + "");
                     data.setFriendNickname(UserHelper.getUserName());
                     data.setFriendAvatar(UserHelper.getUserAvatar());
                     onQueryFriendDetail(data);
                 } else {
                     if (presenter != null) {
-                        presenter.queryFriendDetail(getContext(),userId);
+                        presenter.queryFriendDetail(getContext(), userId);
                     }
 
                 }
@@ -123,7 +140,7 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
                     return null;
                 }
                 if (presenter != null) {
-                    presenter.queryGroupDetail(getContext(),groupId);
+                    presenter.queryGroupDetail(getContext(), groupId);
                 }
 
                 return null;
@@ -134,9 +151,11 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
                     conversationType, String targetId) {
                 return false;
             }
+
             public boolean onConversationPortraitLongClick(Context context, Conversation.ConversationType conversationType, String targetId) {
                 return false;
             }
+
             @Override
             public boolean onConversationLongClick(Context context, View view, BaseUiConversation conversation) {
                 return false;
@@ -146,7 +165,7 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
             public boolean onConversationClick(Context context, View view, BaseUiConversation conversation) {
                 if (null != presenter && TextUtils.isEmpty(conversation.mCore.getConversationTitle())) {
                     if (conversation.mCore.getConversationType() == Conversation.ConversationType.GROUP) {
-                        presenter.queryGroupDetail(getContext(),conversation.mCore.getTargetId());
+                        presenter.queryGroupDetail(getContext(), conversation.mCore.getTargetId());
                     } else {
                         String userId = conversation.mCore.getTargetId();
                         if (localUserid.equals(userId)) {
@@ -156,7 +175,7 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
                             data.setFriendAvatar(UserHelper.getUserAvatar());
                             onQueryFriendDetail(data);
                         } else {
-                            presenter.queryFriendDetail(getContext(),userId);
+                            presenter.queryFriendDetail(getContext(), userId);
 
                         }
                     }
@@ -167,7 +186,7 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
 
         ConversationListFragment conversationListFragment = new ConversationListFragment();
 //        ContactPersonListFragment contactPersonListFragment = new ContactPersonListFragment();
-        ContactListTabFragment contactListTabFragment=new ContactListTabFragment();
+        ContactListTabFragment contactListTabFragment = new ContactListTabFragment();
 
         fragments.add(conversationListFragment);
         fragments.add(contactListTabFragment);
@@ -190,6 +209,14 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
 
     }
 
+    @Override
+    public void onQueryGroupUserInfoSuccess(GroupUserInfoBean userInfoBean) {
+        if (userInfoBean != null) {
+            GroupUserInfo groupUserInfo = new GroupUserInfo(userInfoBean.groupId, userInfoBean.userId, userInfoBean.nickname, GroupUtils.getGroupUserInfoExtra(userInfoBean.isAdmin));
+            RongIM.getInstance().refreshGroupUserInfoCache(groupUserInfo);
+        }
+    }
+
     private TabLayout.Tab createTab(TabLayout.Tab tab, String text) {
         View view = LayoutInflater.from(getContext()).inflate(R.layout.view_message_tab_layout, null);
         TextView tv_text = view.findViewById(R.id.tv_text);

+ 4 - 5
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ChatGroupSettingActivity.java

@@ -8,7 +8,6 @@ import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.CompoundButton;
 import android.widget.ImageView;
-import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
@@ -25,17 +24,16 @@ import com.common.im.bean.GroupApplyBean;
 import com.common.im.bean.GroupMemberBean;
 import com.common.im.bean.RongIMGroupInfo;
 import com.common.im.contract.ChatGroupSettingContract;
+import io.rong.imkit.utils.GroupUtils;
 import com.common.im_ui.R;
 import com.common.im.presenter.ChatGroupSettingPresenter;
 import com.common.im_ui.databinding.ActivityChatGroupSettingBinding;
 import com.cooleshow.base.common.BaseApplication;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
-import com.cooleshow.base.utils.GlideUtils;
 import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
-import com.cooleshow.base.widgets.dialog.CommonConfirmDialog;
 import com.cooleshow.base.widgets.dialog.CommonDialog;
 
 import java.io.Serializable;
@@ -45,7 +43,6 @@ import java.util.List;
 import io.rong.imkit.RongIM;
 import io.rong.imkit.userinfo.model.GroupUserInfo;
 import io.rong.imkit.utils.helper.ChatGroupHelper;
-import io.rong.imlib.RongIMClient;
 import io.rong.imlib.model.Conversation;
 
 /**
@@ -253,8 +250,10 @@ public class ChatGroupSettingActivity extends BaseMVPActivity<ActivityChatGroupS
                 GroupMemberBean usersBean = data.get(i);
                 String id = usersBean.getUserId() + "";
                 String name = usersBean.getNickname();
+                String extra = GroupUtils.getGroupUserInfoExtra(usersBean.isAdmin());
                 if (!TextUtils.isEmpty(id)) {
-                    RongIM.getInstance().refreshGroupUserInfoCache(new GroupUserInfo(groupId, id, name));
+                    //todo 这里需要改一下,刷新会有操作数据库逻辑,for循环不太合适,可以改成集合形式更改数据库->insertGroupMembers
+                    RongIM.getInstance().refreshGroupUserInfoCache(new GroupUserInfo(groupId, id, name, extra));
                 }
             } catch (Exception e) {
             }

BIN
rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_group_admin_tag2.png


BIN
rong_im/common_im_ui/src/main/res/drawable-xxhdpi/icon_group_admin_tag2.png


+ 19 - 4
rong_im/common_im_ui/src/main/res/layout/group_member_list_item.xml

@@ -9,26 +9,41 @@
 
     <com.cooleshow.base.widgets.QMUIRadiusImageView
         android:id="@+id/iv_icon"
-        android:layout_width="@dimen/dp_40"
-        android:layout_height="@dimen/dp_40"
+        android:layout_width="@dimen/dp_44"
+        android:layout_height="@dimen/dp_44"
         android:layout_marginTop="6dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:qmui_corner_radius="@dimen/dp_5" />
 
+
+    <ImageView
+        android:layout_marginStart="10dp"
+        android:id="@+id/iv_group_admin_tag"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/icon_group_admin_tag2"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_icon"
+        app:layout_constraintLeft_toRightOf="@+id/iv_icon"
+        app:layout_constraintTop_toTopOf="@+id/iv_icon" />
+
     <TextView
         android:id="@+id/tv_title"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginStart="20dp"
+        android:layout_marginStart="4dp"
         android:ellipsize="end"
         android:lines="1"
         android:maxLength="10"
+        app:layout_goneMarginStart="10dp"
         android:text=""
+        android:includeFontPadding="false"
         android:textColor="@color/black_444"
         android:textSize="@dimen/dp_16"
+        tools:text="哈哈"
         app:layout_constraintBottom_toBottomOf="@id/iv_icon"
-        app:layout_constraintStart_toEndOf="@+id/iv_icon"
+        app:layout_constraintStart_toEndOf="@+id/iv_group_admin_tag"
         app:layout_constraintTop_toTopOf="@+id/iv_icon" />
 
     <TextView

+ 1 - 1
rong_im/kit/gradle.properties

@@ -16,4 +16,4 @@ PROJ_NAME=release
 PROJ_DESCRIPTION=Please refer to the official website
 # END bintray.gradle 使用的配置参数,用来上传 maven
 
-IMSDK_VER="5.1.4.1"
+IMSDK_VER="5.2.1.1"

+ 20 - 1
rong_im/kit/src/main/java/io/rong/imkit/conversation/messgelist/provider/BaseMessageItemProvider.java

@@ -2,6 +2,7 @@ package io.rong.imkit.conversation.messgelist.provider;
 
 import android.content.Context;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -19,10 +20,12 @@ import io.rong.imkit.config.RongConfigCenter;
 import io.rong.imkit.feature.resend.ResendManager;
 import io.rong.imkit.model.State;
 import io.rong.imkit.model.UiMessage;
+import io.rong.imkit.utils.GroupUtils;
 import io.rong.imkit.utils.RongDateUtils;
 import io.rong.imkit.widget.adapter.IViewProviderListener;
 import io.rong.imkit.widget.adapter.ViewHolder;
 import io.rong.imlib.RongIMClient;
+import io.rong.imlib.model.Conversation;
 import io.rong.imlib.model.Message;
 import io.rong.imlib.model.MessageContent;
 import io.rong.message.HistoryDividerMessage;
@@ -115,7 +118,23 @@ public abstract class BaseMessageItemProvider<T extends MessageContent> implemen
             if (uiMessage.getUserInfo().getPortraitUri() != null) {
                 RongConfigCenter.featureConfig().getKitImageEngine().loadConversationPortrait(holder.getContext(), uiMessage.getUserInfo().getPortraitUri().toString(), view, uiMessage.getMessage());
             }
-
+            if(uiMessage.getConversationType() == Conversation.ConversationType.GROUP){
+                if (uiMessage.getUserInfo() != null && !TextUtils.isEmpty(uiMessage.getUserInfo().getExtra())) {
+                    String extra = uiMessage.getUserInfo().getExtra();
+                    if (TextUtils.equals(GroupUtils.GROUP_ADMIN_TAG, extra)) {
+                        if (isSender) {
+                            holder.setVisible(R.id.iv_right_group_admin_tag, true);
+                            holder.setVisible(R.id.iv_left_group_admin_tag, false);
+                        } else {
+                            holder.setVisible(R.id.iv_right_group_admin_tag, false);
+                            holder.setVisible(R.id.iv_left_group_admin_tag, true);
+                        }
+                    } else {
+                        holder.setVisible(R.id.iv_left_group_admin_tag, false);
+                        holder.setVisible(R.id.iv_right_group_admin_tag, false);
+                    }
+                }
+            }
 
             holder.setOnClickListener(R.id.rc_left_portrait, new View.OnClickListener() {
                 @Override

+ 1 - 0
rong_im/kit/src/main/java/io/rong/imkit/model/UiMessage.java

@@ -61,6 +61,7 @@ public class UiMessage extends UiBaseBean {
             GroupUserInfo groupUserInfo = RongUserInfoManager.getInstance().getGroupUserInfo(message.getTargetId(), message.getSenderUserId());
             if (groupUserInfo != null && !TextUtils.isEmpty(groupUserInfo.getNickname())) {
                 nickname = groupUserInfo.getNickname();
+                userInfo.setExtra(groupUserInfo.getExtra());
             }
         }
     }

+ 2 - 2
rong_im/kit/src/main/java/io/rong/imkit/userinfo/RongUserInfoManager.java

@@ -291,7 +291,7 @@ public class RongUserInfoManager {
         }
 
         if (groupMember != null) {
-            return new GroupUserInfo(groupId, userId, groupMember.memberName);
+            return new GroupUserInfo(groupId, userId, groupMember.memberName,groupMember.extra);
         } else {
             return null;
         }
@@ -398,7 +398,7 @@ public class RongUserInfoManager {
             RLog.e(TAG, "Invalid to refresh a null groupUserInfo object.");
             return;
         }
-        GroupMember groupMember = new GroupMember(groupUserInfo.getGroupId(), groupUserInfo.getUserId(), groupUserInfo.getNickname());
+        GroupMember groupMember = new GroupMember(groupUserInfo.getGroupId(), groupUserInfo.getUserId(), groupUserInfo.getNickname(),groupUserInfo.getExtra());
         if (mIsCacheGroupMemberInfo && mLocalDataSource != null) {
             mLocalDataSource.refreshGroupUserInfo(groupMember);
         } else {

+ 1 - 1
rong_im/kit/src/main/java/io/rong/imkit/userinfo/UserDataDelegate.java

@@ -37,7 +37,7 @@ public class UserDataDelegate {
         if (mGroupUserInfoProvider != null) {
             GroupUserInfo groupUserInfo = mGroupUserInfoProvider.getGroupUserInfo(groupId, userId);
             if (groupUserInfo != null) {
-                return new GroupMember(groupUserInfo.getGroupId(), groupUserInfo.getUserId(), groupUserInfo.getNickname());
+                return new GroupMember(groupUserInfo.getGroupId(), groupUserInfo.getUserId(), groupUserInfo.getNickname(),groupUserInfo.getExtra());
             }
         }
         return null;

+ 1 - 1
rong_im/kit/src/main/java/io/rong/imkit/userinfo/UserDatabase.java

@@ -17,7 +17,7 @@ import io.rong.imkit.userinfo.db.model.GroupMember;
 import io.rong.imkit.userinfo.db.model.User;
 import io.rong.common.rlog.RLog;
 
-@Database(entities = {User.class, Group.class, GroupMember.class}, version = 1, exportSchema = false)
+@Database(entities = {User.class, Group.class, GroupMember.class}, version = 2, exportSchema = false)
 public abstract class UserDatabase extends RoomDatabase {
     private static final String TAG = UserDatabase.class.getCanonicalName();
     private static final String DB_NAME_FORMAT = "kit_user_%s";

+ 5 - 1
rong_im/kit/src/main/java/io/rong/imkit/userinfo/db/model/GroupMember.java

@@ -6,10 +6,11 @@ import androidx.room.Entity;
 
 @Entity(tableName = "group_member", primaryKeys = {"group_id", "user_id"})
 public class GroupMember {
-    public GroupMember(@NonNull String groupId, @NonNull String userId, String memberName) {
+    public GroupMember(@NonNull String groupId, @NonNull String userId, String memberName,String extra) {
         this.groupId = groupId;
         this.userId = userId;
         this.memberName = memberName;
+        this.extra = extra;
     }
 
     @NonNull
@@ -22,4 +23,7 @@ public class GroupMember {
 
     @ColumnInfo(name = "member_name")
     public String memberName;
+
+    @ColumnInfo(name = "extra")
+    public String extra;
 }

+ 11 - 1
rong_im/kit/src/main/java/io/rong/imkit/userinfo/model/GroupUserInfo.java

@@ -7,6 +7,15 @@ public class GroupUserInfo {
     private String mNickname;
     private String mUserId;
     private String mGroupId;
+    private String extra;
+
+    public String getExtra() {
+        return extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
 
     /**
      * 群成员对象
@@ -14,10 +23,11 @@ public class GroupUserInfo {
      * @param userId 用户 Id
      * @param nickname 该用户在群里的昵称
      */
-    public GroupUserInfo(String groupId, String userId, String nickname) {
+    public GroupUserInfo(String groupId, String userId, String nickname,String extra) {
         this.mGroupId = groupId;
         this.mNickname = nickname;
         this.mUserId = userId;
+        this.extra = extra;
     }
 
     public String getGroupId() {

+ 13 - 0
rong_im/kit/src/main/java/io/rong/imkit/utils/GroupUtils.java

@@ -0,0 +1,13 @@
+package io.rong.imkit.utils;
+
+/**
+ * Author by pq, Date on 2022/8/4.
+ */
+public class GroupUtils {
+    public static final String GROUP_ADMIN_TAG = "owner";
+    public static final String GROUP_MEMBER_TAG = "member";
+
+    public static String getGroupUserInfoExtra(boolean isAdmin) {
+        return isAdmin ? GROUP_ADMIN_TAG : GROUP_MEMBER_TAG;
+    }
+}

BIN
rong_im/kit/src/main/res/drawable-xhdpi/icon_group_admin_tag.png


BIN
rong_im/kit/src/main/res/drawable-xxhdpi/icon_group_admin_tag.png


+ 40 - 4
rong_im/kit/src/main/res/layout/rc_message_item.xml

@@ -36,23 +36,59 @@
         android:id="@+id/rc_left_portrait"
         android:layout_width="@dimen/rc_message_portrait_size"
         android:layout_height="@dimen/rc_message_portrait_size"
-        app:qmui_corner_radius="@dimen/dp_6"
         android:layout_marginStart="@dimen/rc_margin_size_4"
         android:src="@color/rc_secondary_color"
         app:layout_constraintStart_toEndOf="@id/rc_selected"
         app:layout_constraintTop_toTopOf="@id/ll_content"
-        app:layout_goneMarginStart="@dimen/rc_margin_size_12" />
+        app:layout_goneMarginStart="@dimen/rc_margin_size_12"
+        app:qmui_corner_radius="@dimen/dp_6" />
+
+    <View
+        android:id="@+id/view_help_line2"
+        android:layout_width="1px"
+        android:layout_height="1px"
+        app:layout_constraintBottom_toBottomOf="@+id/rc_left_portrait"
+        app:layout_constraintLeft_toLeftOf="@+id/rc_left_portrait" />
+
+    <ImageView
+        android:id="@+id/iv_left_group_admin_tag"
+        android:layout_width="36dp"
+        android:layout_height="16dp"
+        android:src="@drawable/icon_group_admin_tag"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/view_help_line2"
+        app:layout_constraintLeft_toLeftOf="@+id/rc_left_portrait"
+        app:layout_constraintRight_toRightOf="@+id/rc_left_portrait"
+        app:layout_constraintTop_toTopOf="@+id/view_help_line2" />
 
     <com.cooleshow.base.widgets.QMUIRadiusImageView
         android:id="@+id/rc_right_portrait"
         android:layout_width="@dimen/rc_message_portrait_size"
         android:layout_height="@dimen/rc_message_portrait_size"
         android:layout_marginEnd="@dimen/rc_margin_size_12"
-        app:qmui_corner_radius="@dimen/dp_6"
         android:src="@color/rc_secondary_color"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="@id/ll_content"
-        app:layout_goneMarginTop="@dimen/rc_margin_size_20" />
+        app:layout_goneMarginTop="@dimen/rc_margin_size_20"
+        app:qmui_corner_radius="@dimen/dp_6" />
+
+    <View
+        android:id="@+id/view_help_line"
+        android:layout_width="1px"
+        android:layout_height="1px"
+        app:layout_constraintBottom_toBottomOf="@+id/rc_right_portrait"
+        app:layout_constraintLeft_toLeftOf="@+id/rc_right_portrait" />
+
+    <ImageView
+        android:id="@+id/iv_right_group_admin_tag"
+        android:layout_width="36dp"
+        android:layout_height="16dp"
+        android:src="@drawable/icon_group_admin_tag"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@+id/view_help_line"
+        app:layout_constraintLeft_toLeftOf="@+id/rc_right_portrait"
+        app:layout_constraintRight_toRightOf="@+id/rc_right_portrait"
+        app:layout_constraintTop_toTopOf="@+id/view_help_line" />
 
     <LinearLayout
         android:id="@+id/ll_content"

+ 1 - 1
rong_im/kit/src/main/res/values/dimen.xml

@@ -13,7 +13,7 @@
     <dimen name="rc_conversation_item_height">72dp</dimen>
     <dimen name="rc_conversation_item_content_height">71.5dp</dimen>
     <dimen name="rc_conversation_portrait_size">48dp</dimen>
-    <dimen name="rc_message_portrait_size">40dp</dimen>
+    <dimen name="rc_message_portrait_size">44dp</dimen>
     <dimen name="rc_message_edit_size">20dp</dimen>
     <dimen name="rc_divider_height">0.5dp</dimen>