Selaa lähdekoodia

增加IM聊天点击头像跳转个人主页业务逻辑

Pq 2 vuotta sitten
vanhempi
commit
325455614a
33 muutettua tiedostoa jossa 714 lisäystä ja 25 poistoa
  1. 4 0
      BaseLibrary/src/main/AndroidManifest.xml
  2. 63 0
      BaseLibrary/src/main/java/com/cooleshow/base/bean/UserDetailInfoBean.java
  3. 18 0
      BaseLibrary/src/main/java/com/cooleshow/base/contract/UserDetailContract.java
  4. 20 0
      BaseLibrary/src/main/java/com/cooleshow/base/data/api/UploadApi.java
  5. 48 0
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/UserDetailPresenter.java
  6. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt
  7. 68 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/userInfo/StudentUserInfoDetailActivity.java
  8. 11 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/WebStartHelper.java
  9. BIN
      BaseLibrary/src/main/res/drawable-xhdpi/bg_user_info_top.png
  10. BIN
      BaseLibrary/src/main/res/drawable-xhdpi/icon_default_head.png
  11. BIN
      BaseLibrary/src/main/res/drawable-xhdpi/icon_gender_tag.png
  12. BIN
      BaseLibrary/src/main/res/drawable-xhdpi/icon_subject_tag.png
  13. BIN
      BaseLibrary/src/main/res/drawable-xhdpi/icon_user_id_tag.png
  14. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/bg_user_info_top.png
  15. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_default_head.png
  16. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_gender_tag.png
  17. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_subject_tag.png
  18. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_user_id_tag.png
  19. 5 0
      BaseLibrary/src/main/res/drawable/shape_fbfbfb_12dp.xml
  20. 232 0
      BaseLibrary/src/main/res/layout/activity_user_info_detail_layout.xml
  21. 1 0
      BaseLibrary/src/main/res/values/colors.xml
  22. 10 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/RongIMUserInfo.java
  23. 5 3
      rong_im/common_im_ui/src/main/java/com/common/im/ui/MessageFragment.java
  24. 3 1
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ChatGroupSettingActivity.java
  25. 3 1
      rong_im/kit/src/main/java/io/rong/imkit/IMCenter.java
  26. 12 2
      rong_im/kit/src/main/java/io/rong/imkit/conversation/ConversationFragment.java
  27. 1 1
      rong_im/kit/src/main/java/io/rong/imkit/conversation/RongConversationActivity.java
  28. 14 10
      rong_im/kit/src/main/java/io/rong/imkit/conversation/messgelist/provider/BaseMessageItemProvider.java
  29. 18 3
      rong_im/kit/src/main/java/io/rong/imkit/userinfo/RongUserInfoManager.java
  30. 81 2
      rong_im/kit/src/main/java/io/rong/imkit/utils/GroupUtils.java
  31. 94 0
      rong_im/kit/src/main/java/io/rong/imkit/utils/helper/ChatClickHelper.java
  32. 1 1
      student/src/main/res/layout/fragment_mine_layout.xml
  33. 1 1
      teacher/src/main/res/layout/fragment_mine_layout.xml

+ 4 - 0
BaseLibrary/src/main/AndroidManifest.xml

@@ -33,5 +33,9 @@
             android:name="com.cooleshow.base.ui.activity.scan.ScanActivity"
             android:name="com.cooleshow.base.ui.activity.scan.ScanActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:screenOrientation="portrait" />
             android:screenOrientation="portrait" />
+
+        <activity android:name=".ui.activity.userInfo.StudentUserInfoDetailActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
     </application>
     </application>
 </manifest>
 </manifest>

+ 63 - 0
BaseLibrary/src/main/java/com/cooleshow/base/bean/UserDetailInfoBean.java

@@ -0,0 +1,63 @@
+package com.cooleshow.base.bean;
+
+import java.io.Serializable;
+
+/**
+ * Author by pq, Date on 2022/10/18.
+ */
+public class UserDetailInfoBean {
+
+    /**
+     * age : 0
+     * avatar :
+     * birthdate :
+     * cloudStudySequenceDays : 0
+     * cloudStudyUseLastDay :
+     * createTime :
+     * delFlag :
+     * gender :
+     * idCardNo :
+     * isBank :
+     * isReal :
+     * isVip :
+     * lockFlag :
+     * memberRankSettingId : 0
+     * membershipEndTime :
+     * membershipStartTime :
+     * phone :
+     * realName :
+     * subjectId :
+     * subjectName :
+     * updateTime :
+     * userId : 0
+     * userStatus :
+     * userType :
+     * username :
+     */
+
+    public int age;
+    public String avatar;
+    public String birthdate;
+    public int cloudStudySequenceDays;
+    public String cloudStudyUseLastDay;
+    public String createTime;
+    public String delFlag;
+    public String gender;
+    public String idCardNo;
+    public String isBank;
+    public String isReal;
+    public String isVip;
+    public String lockFlag;
+    public int memberRankSettingId;
+    public String membershipEndTime;
+    public String membershipStartTime;
+    public String phone;
+    public String realName;
+    public String subjectId;
+    public String subjectName;
+    public String updateTime;
+    public String userId;
+    public String userStatus;
+    public String userType;
+    public String username;
+}

+ 18 - 0
BaseLibrary/src/main/java/com/cooleshow/base/contract/UserDetailContract.java

@@ -0,0 +1,18 @@
+package com.cooleshow.base.contract;
+
+import com.cooleshow.base.bean.UserDetailInfoBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/5/17 15:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface UserDetailContract {
+    interface UserDetailView extends BaseView {
+        void getUserDetailSuccess(UserDetailInfoBean infoBean);
+    }
+    interface Presenter {
+    }
+}

+ 20 - 0
BaseLibrary/src/main/java/com/cooleshow/base/data/api/UploadApi.java

@@ -2,8 +2,10 @@ package com.cooleshow.base.data.api;
 
 
 import com.cooleshow.base.bean.AddressBean;
 import com.cooleshow.base.bean.AddressBean;
 import com.cooleshow.base.bean.UploadTokenInfoBean;
 import com.cooleshow.base.bean.UploadTokenInfoBean;
+import com.cooleshow.base.bean.UserDetailInfoBean;
 import com.cooleshow.base.bean.request.EditAddressEntry;
 import com.cooleshow.base.bean.request.EditAddressEntry;
 import com.cooleshow.base.data.net.BaseResponse;
 import com.cooleshow.base.data.net.BaseResponse;
+import com.tencent.connect.UserInfo;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -86,4 +88,22 @@ public interface UploadApi {
      */
      */
     @GET(AUTH_GROUP + "/doQrLogin")
     @GET(AUTH_GROUP + "/doQrLogin")
     Observable<BaseResponse<Object>> doQrLogin(@Query("code") String code);
     Observable<BaseResponse<Object>> doQrLogin(@Query("code") String code);
+
+    /**
+     * 根据用户编号获取用户基本信息-学生
+     *
+     * @param userId
+     * @return
+     */
+    @GET(STUDENT_GROUP + "student/queryUserById")
+    Observable<BaseResponse<UserDetailInfoBean>> queryStuDetail(@Query("rongCloudUserId") String userId);
+
+    /**
+     * 根据用户编号获取用户基本信息-老师
+     *
+     * @param userId
+     * @return
+     */
+    @GET(TEACHER_GROUP + "student/queryUserById")
+    Observable<BaseResponse<UserDetailInfoBean>> queryStuDetailFromTeacher(@Query("rongCloudUserId") String userId);
 }
 }

+ 48 - 0
BaseLibrary/src/main/java/com/cooleshow/base/presenter/UserDetailPresenter.java

@@ -0,0 +1,48 @@
+package com.cooleshow.base.presenter;
+
+import com.cooleshow.base.bean.UserDetailInfoBean;
+import com.cooleshow.base.common.BaseApplication;
+import com.cooleshow.base.constanst.ScanContract;
+import com.cooleshow.base.contract.UserDetailContract;
+import com.cooleshow.base.data.api.UploadApi;
+import com.cooleshow.base.rx.BaseObserver;
+
+
+/**
+ * 创建日期:2022/5/17 15:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class UserDetailPresenter extends BasePresenter<UserDetailContract.UserDetailView> implements UserDetailContract.Presenter {
+    /**
+     * 获取用户信息
+     *
+     * @param
+     */
+    public void getUserDetail(String userId) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        //根据用户编号获取用户基本信息
+        if (BaseApplication.Companion.isTeacherClient()) {
+            addSubscribe(create(UploadApi.class).queryStuDetailFromTeacher(userId), new BaseObserver<UserDetailInfoBean>(getView()) {
+                @Override
+                protected void onSuccess(UserDetailInfoBean data) {
+                    if (getView() != null) {
+                        getView().getUserDetailSuccess(data);
+                    }
+                }
+            });
+        } else {
+            addSubscribe(create(UploadApi.class).queryStuDetail(userId), new BaseObserver<UserDetailInfoBean>(getView()) {
+                @Override
+                protected void onSuccess(UserDetailInfoBean data) {
+                    if (getView() != null) {
+                        getView().getUserDetailSuccess(data);
+                    }
+                }
+            });
+        }
+    }
+}

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt

@@ -178,6 +178,7 @@ object RouterPath {
             const val MINE_ADDRESS_LIST = "/base/ui/AddressListActivity"
             const val MINE_ADDRESS_LIST = "/base/ui/AddressListActivity"
             const val MINE_EDIT_ADDRESS = "/base/ui/EditAddressActivity"
             const val MINE_EDIT_ADDRESS = "/base/ui/EditAddressActivity"
             const val SCAN_QR_CODE = "/base/ui/scan/ScanActivity"
             const val SCAN_QR_CODE = "/base/ui/scan/ScanActivity"
+            const val USER_DETAIL_STU = "/base/ui/userInfo/StudentUserInfoDetailActivity"
         }
         }
     }
     }
 
 

+ 68 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/userInfo/StudentUserInfoDetailActivity.java

@@ -0,0 +1,68 @@
+package com.cooleshow.base.ui.activity.userInfo;
+
+import android.text.TextUtils;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.R;
+import com.cooleshow.base.bean.UserDetailInfoBean;
+import com.cooleshow.base.contract.UserDetailContract;
+import com.cooleshow.base.databinding.ActivityUserInfoDetailLayoutBinding;
+import com.cooleshow.base.presenter.UserDetailPresenter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.GlideUtils;
+
+/**
+ * Author by pq, Date on 2022/10/18.
+ */
+
+@Route(path = RouterPath.BaseCenter.USER_DETAIL_STU)
+public class StudentUserInfoDetailActivity extends BaseMVPActivity<ActivityUserInfoDetailLayoutBinding, UserDetailPresenter> implements UserDetailContract.UserDetailView {
+
+    private String mTargetUserId;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "");
+        mTargetUserId = getIntent().getStringExtra("targetUserId");
+        if (TextUtils.isEmpty(mTargetUserId)) {
+            finish();
+            return;
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        presenter.getUserDetail(mTargetUserId);
+    }
+
+    @Override
+    protected ActivityUserInfoDetailLayoutBinding getLayoutView() {
+        return ActivityUserInfoDetailLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected UserDetailPresenter createPresenter() {
+        return new UserDetailPresenter();
+    }
+
+    @Override
+    public void getUserDetailSuccess(UserDetailInfoBean infoBean) {
+        if (!checkActivityExist() || infoBean == null) {
+            return;
+        }
+        //头像
+        GlideUtils.INSTANCE.loadImage(this, infoBean.avatar, viewBinding.ivAvatar, R.drawable.icon_default_head);
+        //是否是vip
+        viewBinding.ivVip.setImageResource(TextUtils.equals(infoBean.isVip, "1") ? R.drawable.icon_vip_able : R.drawable.icon_vip_enable);
+        //昵称
+        viewBinding.tvNickname.setText(infoBean.username);
+        //学号
+        viewBinding.tvId.setText(String.format("学号:%s", infoBean.userId));
+        //性别
+        viewBinding.tvGenderValue.setText(TextUtils.equals(infoBean.gender, "1") ? "男" : "女");
+        //声部
+        viewBinding.tvMusicSubjectValue.setText(infoBean.subjectName);
+    }
+}

+ 11 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/WebStartHelper.java

@@ -191,4 +191,15 @@ public class WebStartHelper {
                 .withString(WebConstants.WEB_URL, WebConstants.AWARD_URL)
                 .withString(WebConstants.WEB_URL, WebConstants.AWARD_URL)
                 .navigation();
                 .navigation();
     }
     }
+
+    /**
+     * 打开老师个人主页
+     * @param teacherId
+     */
+    public static void startTeacherHomePage(String teacherId){
+        ARouter.getInstance()
+                .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                .withString(WebConstants.WEB_URL, WebConstants.STUDENT_TEACHER_HOME + teacherId)
+                .navigation();
+    }
 }
 }

BIN
BaseLibrary/src/main/res/drawable-xhdpi/bg_user_info_top.png


BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_default_head.png


BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_gender_tag.png


BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_subject_tag.png


BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_user_id_tag.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/bg_user_info_top.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_default_head.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_gender_tag.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_subject_tag.png


BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_user_id_tag.png


+ 5 - 0
BaseLibrary/src/main/res/drawable/shape_fbfbfb_12dp.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <corners android:radius="12dp"/>
+    <solid android:color="@color/color_fbfbfb"/>
+</shape>

+ 232 - 0
BaseLibrary/src/main/res/layout/activity_user_info_detail_layout.xml

@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:adjustViewBounds="true"
+        android:src="@drawable/bg_user_info_top"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+    <include
+        android:id="@+id/toolbar_include"
+        layout="@layout/common_toolbar_layout_white" />
+
+
+    <View
+        android:layout_marginTop="14dp"
+        android:id="@+id/view_top_bg"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginStart="14dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/bg_white_14dp"
+        app:layout_constraintBottom_toBottomOf="@+id/view_helper_line"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/toolbar_include" />
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/iv_avatar"
+        android:layout_width="60dp"
+        android:layout_height="60dp"
+        android:layout_marginStart="20dp"
+        android:layout_marginTop="18dp"
+        android:src="@drawable/icon_default_head"
+        app:civ_border_color="@color/white"
+        app:civ_border_width="2dp"
+        app:layout_constraintLeft_toLeftOf="@+id/view_top_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_top_bg" />
+
+    <TextView
+        android:id="@+id/tv_nickname"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="22dp"
+        android:ellipsize="end"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:textColor="@color/color_1a1a1a"
+        android:textSize="@dimen/sp_20"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toTopOf="@+id/tv_id"
+        app:layout_constraintLeft_toRightOf="@+id/iv_avatar"
+        app:layout_constraintTop_toTopOf="@+id/iv_avatar"
+        app:layout_constraintVertical_chainStyle="packed"
+        app:layout_constraintWidth_default="wrap"
+        tools:text="测试昵称" />
+
+
+    <TextView
+        android:id="@+id/tv_id"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="3dp"
+        android:drawableLeft="@drawable/icon_user_id_tag"
+        android:drawablePadding="5dp"
+        android:textColor="@color/color_666666"
+        android:textSize="@dimen/sp_11"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+        app:layout_constraintLeft_toLeftOf="@+id/tv_nickname"
+        app:layout_constraintTop_toBottomOf="@+id/tv_nickname"
+        tools:text="121341412312" />
+
+    <View
+        android:id="@+id/vip_help_view"
+        android:layout_width="1px"
+        android:layout_height="1px"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_avatar"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_avatar"
+        app:layout_constraintRight_toRightOf="@+id/iv_avatar" />
+
+    <ImageView
+        android:id="@+id/iv_vip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="5dp"
+        android:src="@drawable/icon_vip_enable"
+        app:layout_constraintBottom_toBottomOf="@+id/vip_help_view"
+        app:layout_constraintLeft_toLeftOf="@+id/iv_avatar"
+        app:layout_constraintRight_toRightOf="@+id/iv_avatar"
+        app:layout_constraintTop_toTopOf="@+id/vip_help_view" />
+
+    <View
+        android:id="@+id/view_detail_bg"
+        android:layout_width="0dp"
+        android:layout_height="140dp"
+        android:layout_marginStart="14dp"
+        android:layout_marginTop="26dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/shape_fbfbfb_12dp"
+        app:layout_constraintLeft_toLeftOf="@+id/view_top_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_top_bg"
+        app:layout_constraintTop_toBottomOf="@+id/iv_avatar" />
+
+    <ImageView
+        android:id="@+id/iv_gender"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="25dp"
+        android:src="@drawable/icon_gender_tag"
+        app:layout_constraintLeft_toLeftOf="@+id/view_detail_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_detail_bg" />
+
+
+    <TextView
+        android:id="@+id/tv_gender_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="11dp"
+        android:includeFontPadding="false"
+        android:text="性别:"
+        android:textColor="@color/color_666666"
+        android:textSize="@dimen/sp_15"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_gender"
+        app:layout_constraintLeft_toRightOf="@+id/iv_gender"
+        app:layout_constraintTop_toTopOf="@+id/iv_gender" />
+
+    <TextView
+        android:id="@+id/tv_gender_value"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_15"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_gender"
+        app:layout_constraintLeft_toRightOf="@+id/tv_gender_title"
+        app:layout_constraintTop_toTopOf="@+id/iv_gender"
+        tools:text="男生" />
+
+    <View
+        android:id="@+id/view_line"
+        android:layout_width="0dp"
+        android:layout_height="0.5dp"
+        android:layout_marginTop="24dp"
+        app:layout_constraintLeft_toLeftOf="@+id/view_detail_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_detail_bg"
+        app:layout_constraintTop_toBottomOf="@+id/iv_gender" />
+
+    <ImageView
+        android:id="@+id/iv_music_subject"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_marginTop="24dp"
+        android:src="@drawable/icon_subject_tag"
+        app:layout_constraintLeft_toLeftOf="@+id/view_detail_bg"
+        app:layout_constraintTop_toBottomOf="@+id/view_line" />
+
+    <TextView
+        android:id="@+id/tv_music_subject_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="11dp"
+        android:includeFontPadding="false"
+        android:text="声部:"
+        android:textColor="@color/color_666666"
+        android:textSize="@dimen/sp_15"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_music_subject"
+        app:layout_constraintLeft_toRightOf="@+id/iv_music_subject"
+        app:layout_constraintTop_toTopOf="@+id/iv_music_subject" />
+
+    <TextView
+        android:paddingEnd="10dp"
+        app:layout_constraintRight_toRightOf="@+id/view_detail_bg"
+        android:id="@+id/tv_music_subject_value"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_15"
+        app:layout_constraintBottom_toBottomOf="@+id/iv_music_subject"
+        app:layout_constraintLeft_toRightOf="@+id/tv_music_subject_title"
+        app:layout_constraintTop_toTopOf="@+id/iv_music_subject"
+        tools:text="中音萨克斯,中音萨克斯,中音萨克斯,中音萨克斯,中音萨克斯" />
+
+    <View
+        android:id="@+id/view_helper_line"
+        android:layout_width="1px"
+        android:layout_height="1px"
+        android:layout_marginTop="16dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_detail_bg" />
+
+    <View
+        android:id="@+id/tv_video_course_line"
+        android:layout_width="4dp"
+        android:layout_height="17dp"
+        android:layout_marginStart="28dp"
+        android:background="@drawable/shape_course_title_tag_bg"
+        app:layout_constraintBottom_toBottomOf="@+id/tv_video_course_title"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/tv_video_course_title" />
+
+    <TextView
+        android:id="@+id/tv_video_course_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/dp_6"
+        android:layout_marginTop="16dp"
+        android:gravity="center"
+        android:text="精品视频课"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_16"
+        android:textStyle="bold"
+        app:layout_constraintLeft_toRightOf="@+id/tv_video_course_line"
+        app:layout_constraintTop_toBottomOf="@+id/view_top_bg" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        app:layout_constraintTop_toBottomOf="@+id/tv_video_course_title"
+        android:id="@+id/recyclerView"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:overScrollMode="never"
+        android:scrollbars="none" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 0
BaseLibrary/src/main/res/values/colors.xml

@@ -150,6 +150,7 @@
     <color name="color_ff8900">#FF8900</color>
     <color name="color_ff8900">#FF8900</color>
     <color name="color_ff5100">#FF5100</color>
     <color name="color_ff5100">#FF5100</color>
     <color name="color_1a2dc7aa">#1a2dc7aa</color>
     <color name="color_1a2dc7aa">#1a2dc7aa</color>
+    <color name="color_fbfbfb">#fbfbfb</color>
 
 
     <color name="color_25292e">#25292E</color>
     <color name="color_25292e">#25292E</color>
     <color name="color_F8F8F8">#F8F8F8</color>
     <color name="color_F8F8F8">#F8F8F8</color>

+ 10 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/RongIMUserInfo.java

@@ -21,6 +21,15 @@ public class RongIMUserInfo {
     private String memo;
     private String memo;
     private String updateTime;
     private String updateTime;
     private String userId;
     private String userId;
+    private String extra;
+
+    public String getExtra() {
+        return extra;
+    }
+
+    public void setExtra(String extra) {
+        this.extra = extra;
+    }
 
 
     public String getCreateTime() {
     public String getCreateTime() {
         return createTime;
         return createTime;
@@ -85,4 +94,5 @@ public class RongIMUserInfo {
     public void setUserId(String userId) {
     public void setUserId(String userId) {
         this.userId = userId;
         this.userId = userId;
     }
     }
+
 }
 }

+ 5 - 3
rong_im/common_im_ui/src/main/java/com/common/im/ui/MessageFragment.java

@@ -122,6 +122,7 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
                     data.setFriendId(userId + "");
                     data.setFriendId(userId + "");
                     data.setFriendNickname(UserHelper.getUserName());
                     data.setFriendNickname(UserHelper.getUserName());
                     data.setFriendAvatar(UserHelper.getUserAvatar());
                     data.setFriendAvatar(UserHelper.getUserAvatar());
+                    data.setExtra(GroupUtils.getCurrentUserInfoRoleTypeExtra());
                     onQueryFriendDetail(data);
                     onQueryFriendDetail(data);
                 } else {
                 } else {
                     if (presenter != null) {
                     if (presenter != null) {
@@ -200,8 +201,9 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
     @Override
     @Override
     public void onQueryFriendDetail(RongIMUserInfo data) {
     public void onQueryFriendDetail(RongIMUserInfo data) {
         if (data != null) {
         if (data != null) {
-            RongIM.getInstance().refreshUserInfoCache(new UserInfo(data.getFriendId() + "", data.getFriendNickname(), Uri.parse(data.getFriendAvatar())));
-
+            UserInfo userInfo = new UserInfo(data.getFriendId() + "", data.getFriendNickname(), Uri.parse(data.getFriendAvatar()));
+            userInfo.setExtra(data.getExtra());
+            RongIM.getInstance().refreshUserInfoCache(userInfo);
         }
         }
     }
     }
 
 
@@ -213,7 +215,7 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
     @Override
     @Override
     public void onQueryGroupUserInfoSuccess(GroupUserInfoBean userInfoBean) {
     public void onQueryGroupUserInfoSuccess(GroupUserInfoBean userInfoBean) {
         if (userInfoBean != null) {
         if (userInfoBean != null) {
-            GroupUserInfo groupUserInfo = new GroupUserInfo(userInfoBean.groupId, userInfoBean.userId, userInfoBean.nickname, GroupUtils.getGroupUserInfoExtra(userInfoBean.isAdmin));
+            GroupUserInfo groupUserInfo = new GroupUserInfo(userInfoBean.groupId, userInfoBean.userId, userInfoBean.nickname, GroupUtils.getGroupUserInfoExtra(userInfoBean.isAdmin,userInfoBean.roleType));
             RongIM.getInstance().refreshGroupUserInfoCache(groupUserInfo);
             RongIM.getInstance().refreshGroupUserInfoCache(groupUserInfo);
         }
         }
     }
     }

+ 3 - 1
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ChatGroupSettingActivity.java

@@ -24,7 +24,9 @@ import com.common.im.bean.GroupApplyBean;
 import com.common.im.bean.GroupMemberBean;
 import com.common.im.bean.GroupMemberBean;
 import com.common.im.bean.RongIMGroupInfo;
 import com.common.im.bean.RongIMGroupInfo;
 import com.common.im.contract.ChatGroupSettingContract;
 import com.common.im.contract.ChatGroupSettingContract;
+
 import io.rong.imkit.utils.GroupUtils;
 import io.rong.imkit.utils.GroupUtils;
+
 import com.common.im_ui.R;
 import com.common.im_ui.R;
 import com.common.im.presenter.ChatGroupSettingPresenter;
 import com.common.im.presenter.ChatGroupSettingPresenter;
 import com.common.im_ui.databinding.ActivityChatGroupSettingBinding;
 import com.common.im_ui.databinding.ActivityChatGroupSettingBinding;
@@ -250,7 +252,7 @@ public class ChatGroupSettingActivity extends BaseMVPActivity<ActivityChatGroupS
                 GroupMemberBean usersBean = data.get(i);
                 GroupMemberBean usersBean = data.get(i);
                 String id = usersBean.getUserId() + "";
                 String id = usersBean.getUserId() + "";
                 String name = usersBean.getNickname();
                 String name = usersBean.getNickname();
-                String extra = GroupUtils.getGroupUserInfoExtra(usersBean.isAdmin());
+                String extra = GroupUtils.getGroupUserInfoExtra(usersBean.isAdmin(), usersBean.getRoleType());
                 if (!TextUtils.isEmpty(id)) {
                 if (!TextUtils.isEmpty(id)) {
                     //todo 这里需要改一下,刷新会有操作数据库逻辑,for循环不太合适,可以改成集合形式更改数据库->insertGroupMembers
                     //todo 这里需要改一下,刷新会有操作数据库逻辑,for循环不太合适,可以改成集合形式更改数据库->insertGroupMembers
                     RongIM.getInstance().refreshGroupUserInfoCache(new GroupUserInfo(groupId, id, name, extra));
                     RongIM.getInstance().refreshGroupUserInfoCache(new GroupUserInfo(groupId, id, name, extra));

+ 3 - 1
rong_im/kit/src/main/java/io/rong/imkit/IMCenter.java

@@ -1560,6 +1560,8 @@ public class IMCenter {
             if (userInfo != null) {
             if (userInfo != null) {
                 try {
                 try {
                     //如果数据为空则取出自身缓存补上
                     //如果数据为空则取出自身缓存补上
+                    userInfo.setUserId(UserHelper.getImUserId());
+
                     if (TextUtils.isEmpty(userInfo.getName())) {
                     if (TextUtils.isEmpty(userInfo.getName())) {
                         userInfo.setName(UserHelper.getUserName());
                         userInfo.setName(UserHelper.getUserName());
                     }
                     }
@@ -1576,7 +1578,7 @@ public class IMCenter {
             } else {
             } else {
                 try {
                 try {
                     String userName = UserHelper.getUserName();
                     String userName = UserHelper.getUserName();
-                    String userId = UserHelper.getUserId();
+                    String userId = UserHelper.getImUserId();
                     Uri parse = Uri.parse(UserHelper.getUserAvatar());
                     Uri parse = Uri.parse(UserHelper.getUserAvatar());
                     userInfo = new UserInfo(userName, userId, parse);
                     userInfo = new UserInfo(userName, userId, parse);
                 } catch (Exception e) {
                 } catch (Exception e) {

+ 12 - 2
rong_im/kit/src/main/java/io/rong/imkit/conversation/ConversationFragment.java

@@ -8,6 +8,7 @@ import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.GestureDetector;
 import android.view.GestureDetector;
 import android.view.KeyEvent;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.LayoutInflater;
@@ -45,6 +46,7 @@ import io.rong.imkit.conversation.extension.InputMode;
 import io.rong.imkit.conversation.extension.RongExtension;
 import io.rong.imkit.conversation.extension.RongExtension;
 import io.rong.imkit.conversation.extension.RongExtensionViewModel;
 import io.rong.imkit.conversation.extension.RongExtensionViewModel;
 import io.rong.imkit.conversation.messgelist.processor.IConversationUIRenderer;
 import io.rong.imkit.conversation.messgelist.processor.IConversationUIRenderer;
+import io.rong.imkit.conversation.messgelist.provider.MessageClickType;
 import io.rong.imkit.conversation.messgelist.viewmodel.MessageItemLongClickBean;
 import io.rong.imkit.conversation.messgelist.viewmodel.MessageItemLongClickBean;
 import io.rong.imkit.conversation.messgelist.viewmodel.MessageViewModel;
 import io.rong.imkit.conversation.messgelist.viewmodel.MessageViewModel;
 import io.rong.imkit.event.Event;
 import io.rong.imkit.event.Event;
@@ -59,8 +61,11 @@ import io.rong.imkit.event.uievent.SmoothScrollEvent;
 import io.rong.imkit.event.uievent.ToastEvent;
 import io.rong.imkit.event.uievent.ToastEvent;
 import io.rong.imkit.manager.hqvoicemessage.HQVoiceMsgDownloadManager;
 import io.rong.imkit.manager.hqvoicemessage.HQVoiceMsgDownloadManager;
 import io.rong.imkit.model.UiMessage;
 import io.rong.imkit.model.UiMessage;
+import io.rong.imkit.userinfo.RongUserInfoManager;
+import io.rong.imkit.userinfo.model.GroupUserInfo;
 import io.rong.imkit.utils.PermissionCheckUtil;
 import io.rong.imkit.utils.PermissionCheckUtil;
 import io.rong.imkit.utils.RouteUtils;
 import io.rong.imkit.utils.RouteUtils;
+import io.rong.imkit.utils.helper.ChatClickHelper;
 import io.rong.imkit.widget.adapter.BaseAdapter;
 import io.rong.imkit.widget.adapter.BaseAdapter;
 import io.rong.imkit.widget.adapter.IViewProviderListener;
 import io.rong.imkit.widget.adapter.IViewProviderListener;
 import io.rong.imkit.widget.adapter.ViewHolder;
 import io.rong.imkit.widget.adapter.ViewHolder;
@@ -72,10 +77,11 @@ import io.rong.imkit.widget.refresh.listener.OnLoadMoreListener;
 import io.rong.imkit.widget.refresh.listener.OnRefreshListener;
 import io.rong.imkit.widget.refresh.listener.OnRefreshListener;
 import io.rong.imkit.widget.refresh.wrapper.RongRefreshHeader;
 import io.rong.imkit.widget.refresh.wrapper.RongRefreshHeader;
 import io.rong.imlib.model.Conversation;
 import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.UserInfo;
 
 
 /**
 /**
  * @author lvz
  * @author lvz
- * 学生端的 聊天界面
+ * 聊天界面
  */
  */
 public class ConversationFragment extends Fragment implements OnRefreshListener, View.OnClickListener, OnLoadMoreListener, IViewProviderListener<UiMessage> {
 public class ConversationFragment extends Fragment implements OnRefreshListener, View.OnClickListener, OnLoadMoreListener, IViewProviderListener<UiMessage> {
     private final String TAG = ConversationFragment.class.getSimpleName();
     private final String TAG = ConversationFragment.class.getSimpleName();
@@ -323,6 +329,10 @@ public class ConversationFragment extends Fragment implements OnRefreshListener,
 
 
     @Override
     @Override
     public void onViewClick(int clickType, UiMessage data) {
     public void onViewClick(int clickType, UiMessage data) {
+        if (clickType == MessageClickType.USER_PORTRAIT_CLICK) {
+            ChatClickHelper.startUserDetail(data);
+            return;
+        }
         mMessageViewModel.onViewClick(clickType, data);
         mMessageViewModel.onViewClick(clickType, data);
     }
     }
 
 
@@ -519,7 +529,7 @@ public class ConversationFragment extends Fragment implements OnRefreshListener,
         for (int i = 0; i < data.size(); i++) {
         for (int i = 0; i < data.size(); i++) {
             if ("DY:NoticeMsg".equals(data.get(i).getObjectName())) {
             if ("DY:NoticeMsg".equals(data.get(i).getObjectName())) {
 
 
-            }else {
+            } else {
                 newData.add(data.get(i));
                 newData.add(data.get(i));
             }
             }
         }
         }

+ 1 - 1
rong_im/kit/src/main/java/io/rong/imkit/conversation/RongConversationActivity.java

@@ -43,7 +43,7 @@ import io.rong.imlib.model.Conversation;
 import io.rong.imlib.model.Group;
 import io.rong.imlib.model.Group;
 import io.rong.imlib.model.UserInfo;
 import io.rong.imlib.model.UserInfo;
 
 
-//学生端消息交互界面
+//消息交互界面
 public class RongConversationActivity extends RongBaseActivity {
 public class RongConversationActivity extends RongBaseActivity {
     protected String mTargetId;
     protected String mTargetId;
     protected Conversation.ConversationType mConversationType;
     protected Conversation.ConversationType mConversationType;

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

@@ -11,6 +11,8 @@ import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.LinearLayout;
 
 
+import org.json.JSONObject;
+
 import java.util.List;
 import java.util.List;
 
 
 import io.rong.common.RLog;
 import io.rong.common.RLog;
@@ -118,10 +120,10 @@ public abstract class BaseMessageItemProvider<T extends MessageContent> implemen
             if (uiMessage.getUserInfo().getPortraitUri() != null) {
             if (uiMessage.getUserInfo().getPortraitUri() != null) {
                 RongConfigCenter.featureConfig().getKitImageEngine().loadConversationPortrait(holder.getContext(), uiMessage.getUserInfo().getPortraitUri().toString(), view, uiMessage.getMessage());
                 RongConfigCenter.featureConfig().getKitImageEngine().loadConversationPortrait(holder.getContext(), uiMessage.getUserInfo().getPortraitUri().toString(), view, uiMessage.getMessage());
             }
             }
-            if(uiMessage.getConversationType() == Conversation.ConversationType.GROUP){
+            if (uiMessage.getConversationType() == Conversation.ConversationType.GROUP) {
                 if (uiMessage.getUserInfo() != null && !TextUtils.isEmpty(uiMessage.getUserInfo().getExtra())) {
                 if (uiMessage.getUserInfo() != null && !TextUtils.isEmpty(uiMessage.getUserInfo().getExtra())) {
                     String extra = uiMessage.getUserInfo().getExtra();
                     String extra = uiMessage.getUserInfo().getExtra();
-                    if (TextUtils.equals(GroupUtils.GROUP_ADMIN_TAG, extra)) {
+                    if (GroupUtils.isAdminFromExtra(extra)) {
                         if (isSender) {
                         if (isSender) {
                             holder.setVisible(R.id.iv_right_group_admin_tag, true);
                             holder.setVisible(R.id.iv_right_group_admin_tag, true);
                             holder.setVisible(R.id.iv_left_group_admin_tag, false);
                             holder.setVisible(R.id.iv_left_group_admin_tag, false);
@@ -139,11 +141,12 @@ public abstract class BaseMessageItemProvider<T extends MessageContent> implemen
             holder.setOnClickListener(R.id.rc_left_portrait, new View.OnClickListener() {
             holder.setOnClickListener(R.id.rc_left_portrait, new View.OnClickListener() {
                 @Override
                 @Override
                 public void onClick(View v) {
                 public void onClick(View v) {
+                    boolean result = false;
                     if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                     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(MessageClickType.USER_PORTRAIT_CLICK, uiMessage);
-                        }
+                        result = RongConfigCenter.conversationConfig().getConversationClickListener().onUserPortraitClick(holder.getContext(), uiMessage.getMessage().getConversationType(), uiMessage.getUserInfo(), uiMessage.getMessage().getTargetId());
+                    }
+                    if (!result) {
+                        listener.onViewClick(MessageClickType.USER_PORTRAIT_CLICK, uiMessage);
                     }
                     }
                 }
                 }
             });
             });
@@ -151,11 +154,12 @@ public abstract class BaseMessageItemProvider<T extends MessageContent> implemen
             holder.setOnClickListener(R.id.rc_right_portrait, new View.OnClickListener() {
             holder.setOnClickListener(R.id.rc_right_portrait, new View.OnClickListener() {
                 @Override
                 @Override
                 public void onClick(View v) {
                 public void onClick(View v) {
+                    boolean result = false;
                     if (RongConfigCenter.conversationConfig().getConversationClickListener() != null) {
                     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(MessageClickType.USER_PORTRAIT_CLICK, uiMessage);
-                        }
+                        result = RongConfigCenter.conversationConfig().getConversationClickListener().onUserPortraitClick(holder.getContext(), uiMessage.getMessage().getConversationType(), uiMessage.getUserInfo(), uiMessage.getMessage().getTargetId());
+                    }
+                    if (!result) {
+                        listener.onViewClick(MessageClickType.USER_PORTRAIT_CLICK, uiMessage);
                     }
                     }
                 }
                 }
             });
             });

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

@@ -283,7 +283,7 @@ public class RongUserInfoManager {
         if (mIsCacheGroupMemberInfo && mLocalDataSource != null) {
         if (mIsCacheGroupMemberInfo && mLocalDataSource != null) {
             groupMember = mLocalDataSource.getGroupUserInfo(groupId, userId, mAllGroupMembers);
             groupMember = mLocalDataSource.getGroupUserInfo(groupId, userId, mAllGroupMembers);
         }
         }
-        if (groupMember == null && mUserDataDelegate != null) {
+        if (checkIsUpdateGroupUserInfo(groupMember) && mUserDataDelegate != null) {
             groupMember = mUserDataDelegate.getGroupUserInfo(groupId, userId);
             groupMember = mUserDataDelegate.getGroupUserInfo(groupId, userId);
             if (mIsCacheGroupMemberInfo && groupMember != null && mLocalDataSource != null) {
             if (mIsCacheGroupMemberInfo && groupMember != null && mLocalDataSource != null) {
                 mLocalDataSource.refreshGroupUserInfo(groupMember);
                 mLocalDataSource.refreshGroupUserInfo(groupMember);
@@ -291,12 +291,22 @@ public class RongUserInfoManager {
         }
         }
 
 
         if (groupMember != null) {
         if (groupMember != null) {
-            return new GroupUserInfo(groupId, userId, groupMember.memberName,groupMember.extra);
+            return new GroupUserInfo(groupId, userId, groupMember.memberName, groupMember.extra);
         } else {
         } else {
             return null;
             return null;
         }
         }
     }
     }
 
 
+    private boolean checkIsUpdateGroupUserInfo(GroupMember groupMember) {
+        if (groupMember == null) {
+            return true;
+        }
+        if (TextUtils.isEmpty(groupMember.userId) || TextUtils.isEmpty(groupMember.memberName)) {
+            return true;
+        }
+        return false;
+    }
+
     /**
     /**
      * 设置当前用户信息。
      * 设置当前用户信息。
      * 如果开发者没有实现用户信息提供者,而是使用消息携带用户信息,需要使用这个方法设置当前用户的信息,
      * 如果开发者没有实现用户信息提供者,而是使用消息携带用户信息,需要使用这个方法设置当前用户的信息,
@@ -393,12 +403,17 @@ public class RongUserInfoManager {
         }
         }
     }
     }
 
 
+    public UserDataDelegate getUserInfoProvider(){
+        return mUserDataDelegate;
+    }
+
+
     public void refreshGroupUserInfoCache(GroupUserInfo groupUserInfo) {
     public void refreshGroupUserInfoCache(GroupUserInfo groupUserInfo) {
         if (groupUserInfo == null) {
         if (groupUserInfo == null) {
             RLog.e(TAG, "Invalid to refresh a null groupUserInfo object.");
             RLog.e(TAG, "Invalid to refresh a null groupUserInfo object.");
             return;
             return;
         }
         }
-        GroupMember groupMember = new GroupMember(groupUserInfo.getGroupId(), groupUserInfo.getUserId(), groupUserInfo.getNickname(),groupUserInfo.getExtra());
+        GroupMember groupMember = new GroupMember(groupUserInfo.getGroupId(), groupUserInfo.getUserId(), groupUserInfo.getNickname(), groupUserInfo.getExtra());
         if (mIsCacheGroupMemberInfo && mLocalDataSource != null) {
         if (mIsCacheGroupMemberInfo && mLocalDataSource != null) {
             mLocalDataSource.refreshGroupUserInfo(groupMember);
             mLocalDataSource.refreshGroupUserInfo(groupMember);
         } else {
         } else {

+ 81 - 2
rong_im/kit/src/main/java/io/rong/imkit/utils/GroupUtils.java

@@ -1,13 +1,92 @@
 package io.rong.imkit.utils;
 package io.rong.imkit.utils;
 
 
+import android.text.TextUtils;
+
+import com.cooleshow.base.common.BaseApplication;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
 /**
 /**
  * Author by pq, Date on 2022/8/4.
  * Author by pq, Date on 2022/8/4.
  */
  */
 public class GroupUtils {
 public class GroupUtils {
+    public static final String GROUP_ADMIN_KEY = "isOwner";
+    public static final String ROLE_TYPE_KEY = "roleType";
+
     public static final String GROUP_ADMIN_TAG = "owner";
     public static final String GROUP_ADMIN_TAG = "owner";
     public static final String GROUP_MEMBER_TAG = "member";
     public static final String GROUP_MEMBER_TAG = "member";
+    public static final String ROLE_TYPE_STU = "STUDENT";
+    public static final String ROLE_TYPE_TEACHER = "TEACHER";
+
+    public static String getGroupUserInfoExtra(boolean isAdmin, String roleType) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put(GROUP_ADMIN_KEY, isAdmin ? GROUP_ADMIN_TAG : GROUP_MEMBER_TAG);
+            jsonObject.put(ROLE_TYPE_KEY, roleType);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return jsonObject.toString();
+    }
+
+    public static String getCurrentUserInfoRoleTypeExtra() {
+        boolean teacherClient = BaseApplication.Companion.isTeacherClient();
+        return getSingleUserInfoExtra(teacherClient ? ROLE_TYPE_TEACHER : ROLE_TYPE_STU);
+    }
+
+    public static String getSingleUserInfoExtra(String roleType) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put(ROLE_TYPE_KEY, roleType);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return jsonObject.toString();
+    }
+
+    /**
+     * 解析是否是群主标记
+     *
+     * @param extra
+     * @return
+     */
+    public static boolean isAdminFromExtra(String extra) {
+        try {
+            JSONObject jsonObject = new JSONObject(extra);
+            if (jsonObject.has(GROUP_ADMIN_KEY)) {
+                String result = jsonObject.optString(GROUP_ADMIN_KEY);
+                return TextUtils.equals(result, GROUP_ADMIN_TAG);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    /**
+     * 获取roleType
+     *
+     * @param extra
+     * @return
+     */
+    public static String getRoleType(String extra) {
+        if (TextUtils.isEmpty(extra)) {
+            return "";
+        }
+        try {
+            JSONObject jsonObject = new JSONObject(extra);
+            if (jsonObject.has(ROLE_TYPE_KEY)) {
+                String result = jsonObject.optString(ROLE_TYPE_KEY);
+                return result;
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
 
 
-    public static String getGroupUserInfoExtra(boolean isAdmin) {
-        return isAdmin ? GROUP_ADMIN_TAG : GROUP_MEMBER_TAG;
+    public static boolean isTeacher(String roleType) {
+        return TextUtils.equals(roleType, ROLE_TYPE_TEACHER);
     }
     }
 }
 }

+ 94 - 0
rong_im/kit/src/main/java/io/rong/imkit/utils/helper/ChatClickHelper.java

@@ -0,0 +1,94 @@
+package io.rong.imkit.utils.helper;
+
+import android.text.TextUtils;
+
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.common.BaseApplication;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.utils.helper.WebStartHelper;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import io.rong.imkit.model.UiMessage;
+import io.rong.imkit.userinfo.RongUserInfoManager;
+import io.rong.imkit.userinfo.UserDataDelegate;
+import io.rong.imkit.userinfo.model.GroupUserInfo;
+import io.rong.imkit.utils.GroupUtils;
+import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.UserInfo;
+
+/**
+ * Author by pq, Date on 2022/10/18.
+ */
+public class ChatClickHelper {
+    /**
+     * 跳转老师个人主页或者学生资料页面
+     *
+     * @param data
+     */
+    public static void startUserDetail(UiMessage data) {
+        UserInfo userInfo = data.getUserInfo();
+        Conversation.ConversationType conversationType = data.getConversationType();
+        String targetId = data.getMessage().getTargetId();
+        if (userInfo == null) {
+            return;
+        }
+        if (conversationType == Conversation.ConversationType.GROUP) {
+            GroupUserInfo groupUserInfo = RongUserInfoManager.getInstance().getGroupUserInfo(targetId, userInfo.getUserId());
+            if (groupUserInfo != null && !TextUtils.isEmpty(groupUserInfo.getExtra())) {
+                String roleType = GroupUtils.getRoleType(groupUserInfo.getExtra());
+                if (TextUtils.isEmpty(roleType)) {
+                    UserDataDelegate userInfoProvider = RongUserInfoManager.getInstance().getUserInfoProvider();
+                    if (userInfoProvider != null) {
+                        userInfoProvider.getGroupUserInfo(targetId, userInfo.getUserId());
+                    }
+                    return;
+                }
+                boolean isTeacher = GroupUtils.isTeacher(roleType);
+                if (isTeacher) {
+                    //跳转老师个人主页
+                    if (BaseApplication.Companion.isTeacherClient()) {
+                        ARouter.getInstance().build(RouterPath.MineCenter.HOME_PAGE)
+                                .navigation();
+                    } else {
+                        WebStartHelper.startTeacherHomePage(userInfo.getUserId());
+                    }
+                } else {
+                    //跳转学生个人主页
+                    ARouter.getInstance().build(RouterPath.BaseCenter.USER_DETAIL_STU)
+                            .withString("targetUserId", userInfo.getUserId())
+                            .navigation();
+                }
+            }
+        } else {
+            UserInfo stuUserInfo = RongUserInfoManager.getInstance().getUserInfo(userInfo.getUserId());
+            if (stuUserInfo != null) {
+                String roleType = GroupUtils.getRoleType(stuUserInfo.getExtra());
+                if (TextUtils.isEmpty(roleType)) {
+                    UserDataDelegate userInfoProvider = RongUserInfoManager.getInstance().getUserInfoProvider();
+                    if (userInfoProvider != null) {
+                        userInfoProvider.getUserInfo(userInfo.getUserId());
+                    }
+                    return;
+                }
+                boolean isTeacher = GroupUtils.isTeacher(roleType);
+                if (isTeacher) {
+                    //跳转老师个人主页
+                    if (BaseApplication.Companion.isTeacherClient()) {
+                        ARouter.getInstance().build(RouterPath.MineCenter.HOME_PAGE)
+                                .navigation();
+                    } else {
+                        WebStartHelper.startTeacherHomePage(userInfo.getUserId());
+                    }
+                } else {
+                    //跳转学生个人主页
+                    ARouter.getInstance().build(RouterPath.BaseCenter.USER_DETAIL_STU)
+                            .withString("targetUserId", userInfo.getUserId())
+                            .navigation();
+                }
+            }
+        }
+    }
+
+}

+ 1 - 1
student/src/main/res/layout/fragment_mine_layout.xml

@@ -97,10 +97,10 @@
             app:layout_constraintRight_toRightOf="@+id/iv_avatar" />
             app:layout_constraintRight_toRightOf="@+id/iv_avatar" />
 
 
         <ImageView
         <ImageView
+            android:layout_marginBottom="5dp"
             android:id="@+id/iv_vip"
             android:id="@+id/iv_vip"
             android:layout_width="wrap_content"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginStart="6dp"
             android:src="@drawable/icon_vip_enable"
             android:src="@drawable/icon_vip_enable"
             app:layout_constraintBottom_toBottomOf="@+id/vip_help_view"
             app:layout_constraintBottom_toBottomOf="@+id/vip_help_view"
             app:layout_constraintLeft_toLeftOf="@+id/iv_avatar"
             app:layout_constraintLeft_toLeftOf="@+id/iv_avatar"

+ 1 - 1
teacher/src/main/res/layout/fragment_mine_layout.xml

@@ -122,7 +122,7 @@
             android:id="@+id/iv_vip"
             android:id="@+id/iv_vip"
             android:layout_width="wrap_content"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginStart="6dp"
+            android:layout_marginBottom="5dp"
             android:src="@drawable/icon_vip_enable"
             android:src="@drawable/icon_vip_enable"
             app:layout_constraintBottom_toBottomOf="@+id/vip_help_view"
             app:layout_constraintBottom_toBottomOf="@+id/vip_help_view"
             app:layout_constraintLeft_toLeftOf="@+id/iv_avatar"
             app:layout_constraintLeft_toLeftOf="@+id/iv_avatar"