Explorar o código

提交聊天部分

Ryan8057 %!s(int64=2) %!d(string=hai) anos
pai
achega
fc93e13eea
Modificáronse 100 ficheiros con 5381 adicións e 55 borrados
  1. 20 21
      BaseLibrary/build.gradle
  2. 1 0
      BaseLibrary/src/main/AndroidManifest.xml
  3. 16 0
      BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt
  4. BIN=BIN
      BaseLibrary/src/main/res/drawable-xhdpi/icon_group_setting.png
  5. BIN=BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/ic_message_off.png
  6. BIN=BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/ic_message_on.png
  7. BIN=BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_group_setting.png
  8. 10 0
      BaseLibrary/src/main/res/drawable/bg_add_photo_shape.xml
  9. 8 0
      BaseLibrary/src/main/res/drawable/bg_gray_line_shape_5dp.xml
  10. 6 0
      BaseLibrary/src/main/res/drawable/bg_group_member_item_blue.xml
  11. 6 0
      BaseLibrary/src/main/res/drawable/bg_group_member_item_green.xml
  12. 6 0
      BaseLibrary/src/main/res/drawable/bg_group_member_item_light_blue.xml
  13. 6 0
      BaseLibrary/src/main/res/drawable/bg_group_member_item_red_fc9.xml
  14. 6 0
      BaseLibrary/src/main/res/drawable/bg_group_member_item_yelloy.xml
  15. 9 0
      BaseLibrary/src/main/res/drawable/bg_orange_line_45_shape.xml
  16. 9 0
      BaseLibrary/src/main/res/drawable/bg_white_10dp_border_2dc7aa.xml
  17. 7 0
      BaseLibrary/src/main/res/drawable/btn_2dc7aa_border.xml
  18. 5 0
      BaseLibrary/src/main/res/drawable/message_on_off_selector.xml
  19. 5 0
      BaseLibrary/src/main/res/drawable/shape_click_btn.xml
  20. 5 0
      BaseLibrary/src/main/res/drawable/switch_selector.xml
  21. 19 0
      BaseLibrary/src/main/res/drawable/tab_indicator.xml
  22. 1 0
      BaseLibrary/src/main/res/values/colors.xml
  23. 2 2
      config.gradle
  24. 5 4
      live_teaching/src/main/java/com/daya/live_teaching/im/IMManager.java
  25. 12 0
      rong_im/common_im_ui/build.gradle
  26. 47 0
      rong_im/common_im_ui/src/main/AndroidManifest.xml
  27. 39 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/AddPhotoListAdapter.java
  28. 58 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/ContactListTabPagerAdapter.java
  29. 42 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/ContactRoomListAdapter.java
  30. 73 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/GroupMemberAdapter.java
  31. 31 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/ItemMarkAdapter.java
  32. 66 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/JoinGroupApplyAdapter.java
  33. 178 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/MessageSearchAdapter.java
  34. 42 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/MessageSettingGroupMemberAdapter.java
  35. 96 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/MineScoreAdapter.java
  36. 82 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/NoticeListAdapter.java
  37. 29 0
      rong_im/common_im_ui/src/main/java/com/common/im/adapter/NoticePopuListAdapter.java
  38. 182 6
      rong_im/common_im_ui/src/main/java/com/common/im/api/IMApi.java
  39. 142 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/ContactRoomListBean.java
  40. 102 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupApplyBean.java
  41. 114 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupMemberBean.java
  42. 51 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupNoticeBean.java
  43. 107 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/MusicSheetListBean.java
  44. 142 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/RongIMGroupInfo.java
  45. 88 0
      rong_im/common_im_ui/src/main/java/com/common/im/bean/RongIMUserInfo.java
  46. 26 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/ChatGroupSettingContract.java
  47. 5 1
      rong_im/common_im_ui/src/main/java/com/common/im/contract/ContactListFragmentContract.java
  48. 17 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/ContactListTabPContract.java
  49. 27 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/ContactRoomListFragmentContract.java
  50. 18 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/CreateGroupContract.java
  51. 17 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/GroupMemberContract.java
  52. 18 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/ImAppealContract.java
  53. 23 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/JoinGroupApplyContract.java
  54. 5 3
      rong_im/common_im_ui/src/main/java/com/common/im/contract/MessageFragmentContract.java
  55. 23 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/NoticeContract.java
  56. 19 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/NoticeEditContract.java
  57. 17 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/PhotoPreviewContract.java
  58. 17 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/SearchHistoryMessageContract.java
  59. 19 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/SelectScoreChatContract.java
  60. 19 0
      rong_im/common_im_ui/src/main/java/com/common/im/contract/SetRemarksContract.java
  61. 176 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/ChatGroupSettingPresenter.java
  62. 37 12
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/ContactListPresenter.java
  63. 14 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/ContactListTabPresenter.java
  64. 71 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/ContactRoomListPresenter.java
  65. 43 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/CreateGroupPresenter.java
  66. 14 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/GroupMemberPresenter.java
  67. 51 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/ImAppealPresenter.java
  68. 82 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/JoinGroupApplyPresenter.java
  69. 86 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/MessagePresenter.java
  70. 87 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/NoticeEditPresenter.java
  71. 92 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/NoticePresenter.java
  72. 14 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/PhotoPreviewPresenter.java
  73. 13 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/SearchHistoryMessagePresenter.java
  74. 57 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/SelectScoreChatPresenter.java
  75. 51 0
      rong_im/common_im_ui/src/main/java/com/common/im/presenter/SetRemarksPresenter.java
  76. 121 4
      rong_im/common_im_ui/src/main/java/com/common/im/ui/MessageFragment.java
  77. 237 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ChatGroupSettingActivity.java
  78. 57 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/CreateGroupActivity.java
  79. 125 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/GroupMemberActivity.java
  80. 204 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ImAppealActivity.java
  81. 136 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/JoinGroupApplyActivity.java
  82. 237 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/NoticeActivity.java
  83. 99 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/NoticeEditActivity.java
  84. 189 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/PhotoPreviewActivity.java
  85. 285 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/SearchHistoryMessageActivity.java
  86. 246 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/SelectScoreChatActivity.java
  87. 102 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/SetRemarksActivity.java
  88. 112 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/contact/ContactListTabFragment.java
  89. 54 2
      rong_im/common_im_ui/src/main/java/com/common/im/ui/contact/ContactPersonListFragment.java
  90. 144 0
      rong_im/common_im_ui/src/main/java/com/common/im/ui/contact/ContactRoomListFragment.java
  91. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_contact_room_normal.png
  92. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_contact_room_select.png
  93. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_contact_single_normal.png
  94. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_contact_single_select.png
  95. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_create_group.png
  96. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_group_course.png
  97. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_group_fans.png
  98. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_group_mark_course.png
  99. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_group_mark_fans.png
  100. BIN=BIN
      rong_im/common_im_ui/src/main/res/drawable-xhdpi/icon_item_normal.png

+ 20 - 21
BaseLibrary/build.gradle

@@ -8,12 +8,12 @@ plugins {
 apply plugin: 'kotlin-kapt'
 apply plugin: 'kotlin-android-extensions'
 android {
-    compileSdk 31
+    compileSdk 30
 
     defaultConfig {
 
         minSdk 21
-        targetSdk 31
+        targetSdk 30
         versionCode 1
         versionName "1.0"
 
@@ -62,11 +62,11 @@ kapt {
 }
 
 dependencies {
-    api fileTree(dir: 'libs', include: ['*.jar','*.aar'])
+    api fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
     testImplementation 'junit:junit:4.13.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.3'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
-    implementation 'androidx.core:core-ktx:1.7.0'
+    implementation 'androidx.core:core-ktx:1.6.0'
     implementation 'androidx.appcompat:appcompat:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
 
@@ -149,7 +149,7 @@ dependencies {
 //    api(name: 'alipaySdk-15.6.4-20190611174359-noUtdid', ext: 'aar')
     api 'com.alipay.sdk:alipaysdk-android:+@aar'
     //微信
-    api 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
+//    api 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
     //圆角imageview
     api 'com.makeramen:roundedimageview:2.3.0'
     //lottie动画
@@ -161,24 +161,23 @@ dependencies {
     api 'com.tencent.bugly:nativecrashreport:3.7.471'
     api 'com.gyf.immersionbar:immersionbar:3.0.0'
     api 'com.gyf.immersionbar:immersionbar-components:3.0.0'
-    //友盟
-/*    api  'com.umeng.umsdk:common:9.4.7'// 必选
-    api  'com.umeng.umsdk:asms:1.4.1'// 必选
-    api 'com.umeng.umsdk:link:1.2.0'//集成U-Link,可选,如要统计分享回流次数和分享新增用户指标则必选
-    api  'com.umeng.umsdk:share-core:7.1.7'//分享核心库,必选
-    api  'com.umeng.umsdk:share-board:7.1.7'//分享面板功能,可选
-
-    api  'com.umeng.umsdk:share-wx:7.1.7'//微信完整版
-    api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.8.0'//微信官方依赖库,必选
-
-    api  'com.umeng.umsdk:share-qq:7.1.7'//QQ完整版
-//    api files('libs/open_sdk_3.5.7.4_r1bc9afe_lite.jar') //QQ官方依赖库,必选
-    api 'com.squareup.okhttp3:okhttp:3.14.9'//QQ官方sdk 3.53及之后版本需要集成okhttp3.x,必选
-
-    api  'com.umeng.umsdk:share-sina:7.1.7'//新浪微博完整版
-    api 'io.github.sinaweibosdk:core:11.11.1@aar'//新浪微博官方SDK依赖库,必选*/
+
+    //友盟common
+    api 'com.umeng.umsdk:common:9.4.0'
+    api 'com.umeng.umsdk:asms:1.2.3'
+    //友盟  分享
+    api 'com.umeng.umsdk:share-core:7.1.6'//分享核心库,必选
+    api 'com.umeng.umsdk:share-board:7.1.6'
+    api 'com.umeng.umsdk:share-qq:7.1.6'
+    api 'com.tencent.tauth:qqopensdk:3.53.0'//QQ官方SDK依赖库
+    api 'com.umeng.umsdk:share-wx:7.1.6'
+    api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.9'//微信官方SDK依赖库
+//    api 'com.sina.weibo.sdk:core:10.10.0'  不能用
+
+
     api project(path: ':camerakit')
     api 'org.java-websocket:Java-WebSocket:1.5.1'
     api project(path: ':midiplaylib')
     api 'org.greenrobot:eventbus:3.1.1'
+
 }

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

@@ -13,5 +13,6 @@
         <service
             android:name=".service.PlayMusicService">
         </service>
+
     </application>
 </manifest>

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

@@ -131,4 +131,20 @@ object RouterPath {
             const val MINE_EQUIPMENT_TEST = "/ui/mine/EquipmentTestActivity"
         }
     }
+    //聊天模块
+    class ChatCenter {
+        companion object {
+            const val CHAT_SELECT_SCORE = "/rong/imkit/activity/SelectScoreChatActivity"
+            const val CHAT_CREATE_GROUP = "/rong/imkit/activity/CreateGroupActivity"
+            const val CHAT_GROUP_SETTING = "/rong/imkit/activity/ChatGroupSettingActivity"
+            const val CHAT_GROUP_SEARCH_HISTORY = "/rong/imkit/activity/SearchHistoryMessageActivity"
+            const val CHAT_GROUP_NOTICE = "/rong/imkit/activity/NoticeActivity"
+            const val CHAT_GROUP_NOTICE_EDIT = "/rong/imkit/activity/NoticeEditActivity"
+            const val CHAT_GROUP_SET_REMARK = "/rong/imkit/activity/SetRemarksActivity"
+            const val CHAT_IM_APPEAL = "/rong/imkit/activity/ImAppealActivity"
+            const val CHAT_PHOTO_PREVIEW = "/rong/imkit/activity/PhotoPreviewActivity"
+            const val CHAT_GROUP_MEMBER = "/rong/imkit/activity/GroupMemberActivity"
+            const val CHAT_GROUP_JOIN_APPLY = "/rong/imkit/activity/JoinGroupApplyActivity"
+        }
+    }
 }

BIN=BIN
BaseLibrary/src/main/res/drawable-xhdpi/icon_group_setting.png


BIN=BIN
BaseLibrary/src/main/res/drawable-xxhdpi/ic_message_off.png


BIN=BIN
BaseLibrary/src/main/res/drawable-xxhdpi/ic_message_on.png


BIN=BIN
BaseLibrary/src/main/res/drawable-xxhdpi/icon_group_setting.png


+ 10 - 0
BaseLibrary/src/main/res/drawable/bg_add_photo_shape.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke
+        android:width="1dp"
+        android:color="#CFCFCF"
+        android:dashWidth="5dp"
+        android:dashGap="5dp" />
+    <corners android:radius="@dimen/dp_5" />
+    <solid android:color="#FBFBFB" />
+</shape>

+ 8 - 0
BaseLibrary/src/main/res/drawable/bg_gray_line_shape_5dp.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke
+        android:width="@dimen/dp_1"
+        android:color="@color/divide_color_f0f0f0"/>
+    <corners android:radius="@dimen/dp_5"/>
+    <solid android:color="@color/white"/>
+</shape>

+ 6 - 0
BaseLibrary/src/main/res/drawable/bg_group_member_item_blue.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:radius="@dimen/dp_2"/>
+    <solid android:color="#78C5FF"/>
+</shape>

+ 6 - 0
BaseLibrary/src/main/res/drawable/bg_group_member_item_green.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:radius="@dimen/dp_2"/>
+    <solid android:color="#44D7B6"/>
+</shape>

+ 6 - 0
BaseLibrary/src/main/res/drawable/bg_group_member_item_light_blue.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:radius="@dimen/dp_2"/>
+    <solid android:color="#8ACAD4"/>
+</shape>

+ 6 - 0
BaseLibrary/src/main/res/drawable/bg_group_member_item_red_fc9.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:radius="@dimen/dp_2"/>
+    <solid android:color="#FC9999"/>
+</shape>

+ 6 - 0
BaseLibrary/src/main/res/drawable/bg_group_member_item_yelloy.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="rectangle">
+    <corners android:radius="@dimen/dp_2"/>
+    <solid android:color="#F7B500"/>
+</shape>

+ 9 - 0
BaseLibrary/src/main/res/drawable/bg_orange_line_45_shape.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+
+       android:shape="rectangle">
+    <stroke
+        android:width="@dimen/dp_1"
+        android:color="@color/color_fa6400"/>
+    <corners android:radius="@dimen/dp_45"/>
+</shape>

+ 9 - 0
BaseLibrary/src/main/res/drawable/bg_white_10dp_border_2dc7aa.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <corners
+        android:radius="10dp" />
+    <stroke android:color="@color/color_2dc7aa"
+        android:width="1dp"/>
+</shape>

+ 7 - 0
BaseLibrary/src/main/res/drawable/btn_2dc7aa_border.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white"/>
+    <corners android:radius="@dimen/dp_22"/>
+    <stroke android:width="@dimen/dp_1" android:color="@color/color_2dc7aa" />
+</shape>

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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/ic_message_off" android:state_checked="false"/>
+    <item android:drawable="@drawable/ic_message_on" android:state_checked="true"/>
+</selector>

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

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

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

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/ic_switch_off" android:state_checked="false"/>
+    <item android:drawable="@drawable/ic_switch_on" android:state_checked="true"/>
+</selector>

+ 19 - 0
BaseLibrary/src/main/res/drawable/tab_indicator.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <item android:gravity="center">
+        <shape>
+
+            <size
+                android:width="16dp"
+                android:height="4dp" />
+
+            <corners android:radius="2dp" />
+
+            <solid android:color="@color/color_2dc7aa" />
+
+        </shape>
+    </item>
+
+</layer-list>

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

@@ -111,4 +111,5 @@
     <color name="gray_ff80">#ff808080</color>
     <color name="gray_F2F4F8">#F2F4F8</color>
     <color name="gray_32FFD8">#32FFD8</color>
+    <color name="color_ff4e1a">#FF4E1A</color>
 </resources>

+ 2 - 2
config.gradle

@@ -5,8 +5,8 @@
  **/
 ext {
     android = [
-            stuApplicationId        : 'com.daya.studaya_android',
-            teapplicationId         : 'com.dayayuemeng.teacher',
+            stuApplicationId        : 'com.cooleshow.student',
+            teapplicationId         : 'com.cooleshow.teacher',
             compileSdkVersion       : 30,
             buildToolsVersion       : "29.0.0",
             minSdkVersion           : 21,

+ 5 - 4
live_teaching/src/main/java/com/daya/live_teaching/im/IMManager.java

@@ -1,8 +1,6 @@
 package com.daya.live_teaching.im;
 
-import android.app.ActivityManager;
 import android.content.Context;
-import android.text.TextUtils;
 
 import com.cooleshow.base.common.BaseApplication;
 import com.cooleshow.base.utils.LogUtils;
@@ -30,7 +28,9 @@ import com.daya.live_teaching.im.provider.ClassMemberChangedNotificationProvider
 import com.daya.live_teaching.im.provider.ClassTextMessageItemProvider;
 import com.daya.live_teaching.im.provider.RoleChangedMessageItemProvider;
 import com.daya.live_teaching.model.RoleChangedUser;
-import com.daya.live_teaching.ui.LiveActivity;
+
+import io.rong.imkit.conversation.messgelist.provider.RCChatShareMusicProvider;
+import io.rong.imkit.widget.RCChatShareMusicMessage;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -109,13 +109,14 @@ public class IMManager {
         RongIMClient.registerMessageType(ExamSongDownloadStatusMessage.class);//学生伴奏下载状态
         RongIMClient.registerMessageType(MusicScoreDownloadMessage.class);//学生伴奏下载
         RongIMClient.registerMessageType(CustomMessage.class);//学生伴奏下载
-
+        RongIMClient.registerMessageType(RCChatShareMusicMessage.class);//乐谱分享
 
         // 设置自定义文本显示
         RongIM.registerMessageTemplate(new ClassTextMessageItemProvider());
         RongIM.registerMessageTemplate(new ClassMemberChangedNotificationProvider());
         RongIM.registerMessageTemplate(new RoleChangedMessageItemProvider());
         RongIM.registerMessageTemplate(new AnnouncementProvider());
+        RongIM.registerMessageTemplate(new RCChatShareMusicProvider());
 
         RongExtensionManager.getInstance().registerExtensionModule(new SightExtensionModule());
 

+ 12 - 0
rong_im/common_im_ui/build.gradle

@@ -1,7 +1,16 @@
 plugins {
     id 'com.android.library'
 }
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-kapt'
 
+kapt {
+    arguments {
+        arg("AROUTER_MODULE_NAME", project.getName())
+        // 是否生成路由文档,"enable":生成文档,其他字符串不生成路由文档
+        arg("AROUTER_GENERATE_DOC", "enable")
+    }
+}
 android {
     compileSdkVersion rootProject.ext.android.compileSdkVersion
     defaultConfig {
@@ -40,4 +49,7 @@ dependencies {
     implementation project(':BaseLibrary')
     implementation project(':rong_im:kit')
     implementation project(':usercenter')
+    implementation project(path: ':live_teaching')
+    //ARouter
+    kapt 'com.alibaba:arouter-compiler:1.5.2'
 }

+ 47 - 0
rong_im/common_im_ui/src/main/AndroidManifest.xml

@@ -2,4 +2,51 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.common.im_ui">
 
+    <application>
+        <activity
+            android:name="com.common.im.ui.activity.SelectScoreChatActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait"
+            android:windowSoftInputMode="adjustResize" />
+        <activity
+            android:name="com.common.im.ui.activity.CreateGroupActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.ChatGroupSettingActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.SearchHistoryMessageActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.NoticeActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.NoticeEditActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.SetRemarksActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.ImAppealActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.PhotoPreviewActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.GroupMemberActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name="com.common.im.ui.activity.JoinGroupApplyActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+    </application>
 </manifest>

+ 39 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/AddPhotoListAdapter.java

@@ -0,0 +1,39 @@
+package com.common.im.adapter;
+
+import android.text.TextUtils;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im_ui.R;
+import com.cooleshow.base.utils.GlideUtils;
+import com.luck.picture.lib.entity.LocalMedia;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/13 14:22
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class AddPhotoListAdapter extends BaseQuickAdapter<LocalMedia, BaseViewHolder> {
+
+    public AddPhotoListAdapter(List<LocalMedia> data) {
+        super(R.layout.photo_list_item, data);
+    }
+
+    @Override
+    protected void convert(BaseViewHolder helper, LocalMedia item) {
+        ImageView ivIcon = helper.getView(R.id.iv_icon);
+        if (item.getPath().equals("123")){
+            ivIcon.setBackgroundResource(com.cooleshow.base.R.drawable.bg_add_photo_shape);
+            ivIcon.setImageResource(R.drawable.ic_update_photo);
+        }else{
+            GlideUtils.INSTANCE.loadImage(getContext(), item.getPath(), ivIcon);
+        }
+
+    }
+
+}

+ 58 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/ContactListTabPagerAdapter.java

@@ -0,0 +1,58 @@
+package com.common.im.adapter;
+
+import android.view.ViewGroup;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/10 10:39
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ContactListTabPagerAdapter  extends FragmentPagerAdapter {
+
+    private List<String> titles;
+    public FragmentManager fm;
+    private List<Fragment> fragments;
+
+    public ContactListTabPagerAdapter(FragmentManager fm, List<Fragment> fragments, List<String> titles) {
+        super(fm);
+        this.fm=fm;
+        this.titles = titles;
+        this.fragments = fragments;
+    }
+
+    @Override
+    public Fragment getItem(int position) {
+        return fragments != null && fragments.size() > position ? fragments.get(position) : null;
+    }
+
+    @Override
+    public int getCount() {
+        return fragments == null ? 0 : fragments.size();
+    }
+
+    @Override
+    public CharSequence getPageTitle(int position) {
+        return titles != null && titles.size() > position ? titles.get(position) : "";
+    }
+    @Override
+    public Fragment instantiateItem(ViewGroup container, int position) {
+        Fragment fragment = (Fragment) super.instantiateItem(container,
+                position);
+        fm.beginTransaction().show(fragment).commit();
+        return fragment;
+    }
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        // super.destroyItem(container, position, object);
+        Fragment fragment = fragments.get(position);
+        fm.beginTransaction().hide(fragment).commit();
+    }
+}

+ 42 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/ContactRoomListAdapter.java

@@ -0,0 +1,42 @@
+package com.common.im.adapter;
+
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im.bean.ContactListBean;
+import com.common.im.bean.ContactRoomListBean;
+import com.common.im_ui.R;
+import com.cooleshow.base.utils.GlideUtils;
+
+/**
+ * 创建日期:2022/6/10 11:43
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ContactRoomListAdapter extends BaseQuickAdapter<ContactRoomListBean, BaseViewHolder> {
+    public ContactRoomListAdapter(int layoutResId) {
+        super(layoutResId);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder holder, ContactRoomListBean contactListBean) {
+        holder.setText(R.id.tv_name, contactListBean.getName());
+        ImageView iv_icon = holder.getView(R.id.iv_icon);
+        ImageView im_group_mark=holder.getView(R.id.im_group_mark);
+
+        if (contactListBean.getType().equals("FAN")) {
+            im_group_mark.setBackgroundResource(R.drawable.icon_group_mark_fans);
+            iv_icon.setImageResource(R.drawable.icon_group_fans);
+        } else if (contactListBean.getType().equals("COURSE")) {
+            im_group_mark.setBackgroundResource(R.drawable.icon_group_mark_course);
+            iv_icon.setImageResource(R.drawable.icon_group_course);
+        } else {
+            im_group_mark.setBackgroundResource(R.drawable.icon_group_mark_fans);
+            GlideUtils.INSTANCE.loadImage(getContext(), contactListBean.getImg(), iv_icon, R.drawable.icon_group_fans);
+        }
+    }
+}

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

@@ -0,0 +1,73 @@
+package com.common.im.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im.bean.GroupMemberBean;
+import com.common.im_ui.R;
+import com.cooleshow.base.utils.GlideUtils;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/13 15:54
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class GroupMemberAdapter extends BaseQuickAdapter<GroupMemberBean, BaseViewHolder> {
+
+    public GroupMemberAdapter(List<GroupMemberBean> data) {
+        super(R.layout.group_member_list_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, GroupMemberBean bean) {
+
+        ImageView ivIcon=helper.getView(R.id.iv_icon);
+        TextView tvTitle=helper.getView(R.id.tv_title);
+        TextView tvType=helper.getView(R.id.tv_type);
+        View viewLine=helper.getView(R.id.view_line);
+       int position= getItemPosition(bean);
+        if (position == getItemCount() - 1 || !bean.getSuspensionTag().equals(getData().get(position + 1).getSuspensionTag())) {
+            viewLine.setVisibility(View.INVISIBLE);
+        } else {
+            viewLine.setVisibility(View.VISIBLE);
+        }
+
+        if (null != bean) {
+            String title = bean.getRoleType();
+            GlideUtils.INSTANCE.loadImage(getContext(),bean.getAvatar(),ivIcon);
+            tvTitle.setText(bean.getNickname());
+            if (!TextUtils.isEmpty(title) && "乐团主管".equals(title)) {
+                tvType.setText(title);
+                tvType.setBackgroundResource(com.cooleshow.base.R.drawable.bg_group_member_item_yelloy);
+            } else if (!TextUtils.isEmpty(title) && "运营主管".equals(title)) {
+                tvType.setText(title);
+                tvType.setBackgroundResource(com.cooleshow.base.R.drawable.bg_group_member_item_green);
+            } else if (!TextUtils.isEmpty(title) && "乐队指导".equals(title)) {
+                tvType.setText(title);
+                tvType.setBackgroundResource(com.cooleshow.base.R.drawable.bg_group_member_item_blue);
+            } else if (!TextUtils.isEmpty(title) && "指导老师".equals(title)) {
+                tvType.setText(title);
+                tvType.setBackgroundResource(com.cooleshow.base.R.drawable.bg_group_member_item_light_blue);
+            } else if (!TextUtils.isEmpty(title) && "衔接老师".equals(title)) {
+                tvType.setText(title);
+                tvType.setBackgroundResource(com.cooleshow.base.R.drawable.bg_group_member_item_red_fc9);
+            } else if (!TextUtils.isEmpty(title)) {
+                tvType.setText(title);
+                tvType.setBackground(null);
+            } else {
+                tvType.setVisibility(View.GONE);
+            }
+        }
+
+
+    }
+
+}

+ 31 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/ItemMarkAdapter.java

@@ -0,0 +1,31 @@
+package com.common.im.adapter;
+
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im_ui.R;
+
+import java.util.List;
+
+
+/**
+ * 创建日期:2022/5/23 11:54
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ItemMarkAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
+
+    public ItemMarkAdapter(List<String> data) {
+        super(R.layout.layout_mark_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, String item) {
+        TextView tv_content = helper.getView(R.id.tv_content);
+        tv_content.setText(item);
+    }
+
+}

+ 66 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/JoinGroupApplyAdapter.java

@@ -0,0 +1,66 @@
+package com.common.im.adapter;
+
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im.bean.GroupApplyBean;
+import com.common.im_ui.R;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/13 17:20
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class JoinGroupApplyAdapter extends BaseQuickAdapter<GroupApplyBean, BaseViewHolder> {
+
+    public JoinGroupApplyAdapter(List<GroupApplyBean> data) {
+        super(R.layout.layout_join_group_item, data);
+    }
+
+    private boolean isSelect;
+
+    public void setSelect(boolean select) {
+        isSelect = select;
+    }
+
+    public boolean isSelect() {
+        return isSelect;
+    }
+
+    @Override
+    protected void convert(BaseViewHolder helper, GroupApplyBean item) {
+        ImageView im_check = helper.getView(R.id.im_check);
+        ImageView im_header = helper.getView(R.id.im_header);
+        TextView tv_name = helper.getView(R.id.tv_name);
+        TextView tv_content = helper.getView(R.id.tv_content);
+        TextView tv_date = helper.getView(R.id.tv_date);
+        if (isSelect){
+            im_check.setVisibility(View.VISIBLE);
+            if (item.isSelect()) {
+                im_check.setBackgroundResource(R.drawable.icon_item_select);
+            } else {
+                im_check.setBackgroundResource(R.drawable.icon_item_normal);
+            }
+        }else{
+            im_check.setVisibility(View.GONE);
+        }
+
+
+        if (item.getRoleType().equals("TEACHER")) {
+            tv_name.setText("老师");
+            im_header.setImageResource(com.cooleshow.base.R.drawable.ic_stu_teacher_head);
+        } else {
+            tv_name.setText("学生");
+            im_header.setImageResource(com.cooleshow.base.R.drawable.ic_stu_student_head);
+        }
+        tv_content.setText(item.getDesc());
+        tv_date.setText(item.getCreateTime());
+    }
+
+}

+ 178 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/MessageSearchAdapter.java

@@ -0,0 +1,178 @@
+package com.common.im.adapter;
+
+import android.content.Context;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.style.ForegroundColorSpan;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im_ui.R;
+import com.cooleshow.base.utils.GlideImageLoaderUtils;
+import com.cooleshow.base.utils.GlideUtils;
+
+import java.util.List;
+
+import io.rong.imkit.userinfo.RongUserInfoManager;
+import io.rong.imkit.utils.RongDateUtils;
+import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.Group;
+import io.rong.imlib.model.Message;
+import io.rong.imlib.model.MessageContent;
+import io.rong.imlib.model.UserInfo;
+import io.rong.message.FileMessage;
+import io.rong.message.RichContentMessage;
+import io.rong.message.TextMessage;
+
+/**
+ * 创建日期:2022/6/11 16:15
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MessageSearchAdapter extends BaseQuickAdapter<Message, BaseViewHolder> {
+
+    public MessageSearchAdapter(List<Message> data) {
+        super(R.layout.search_fragment_recycler_chatting_records_list, data);
+    }
+
+    private String search = "";
+
+    public void setSearch(String search) {
+        this.search = search;
+    }
+
+    @Override
+    protected void convert(BaseViewHolder helper, Message message) {
+        ImageView ivPortrait = helper.getView(R.id.item_iv_record_image);
+        TextView tvChatName = helper.getView(R.id.item_tv_chat_name);
+        TextView tvContent = helper.getView(R.id.item_tv_chatting_records_detail);
+        TextView tvDate = helper.getView(R.id.item_tv_chatting_records_date);
+        UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(message.getSenderUserId());
+        if (userInfo != null) {
+
+            if (Conversation.ConversationType.GROUP == message.getConversationType()) {
+                Group groupInfo = RongUserInfoManager.getInstance().getGroupInfo(message.getTargetId());
+                if (groupInfo != null) {
+                    tvChatName.setText(groupInfo.getName());
+                }
+                GlideImageLoaderUtils.getInstance().loadCircleImage(getContext(), R.drawable.ic_stu_student_head, ivPortrait);
+
+            } else {
+                tvChatName.setText(userInfo.getName());
+                GlideImageLoaderUtils.getInstance().loadCircleImage(getContext(), userInfo.getPortraitUri(), ivPortrait);
+            }
+        }
+        tvContent.setText(getColoredChattingRecord(search, message.getContent(), tvContent.getContext()));
+        String sendTime = RongDateUtils.getConversationFormatDate(message.getSentTime(), getContext());
+        tvDate.setText(sendTime);
+    }
+
+    public static SpannableStringBuilder getColoredChattingRecord(String filterStr, MessageContent messageContent, Context context) {
+        SpannableStringBuilder messageText = new SpannableStringBuilder();
+        if (messageContent instanceof TextMessage) {
+            TextMessage textMessage = (TextMessage) messageContent;
+            String textMessageContent = textMessage.getContent();
+            messageText = getOmitColored(filterStr, textMessageContent, 0, context);
+        }
+        if (messageContent instanceof RichContentMessage) {
+            RichContentMessage richContentMessage = (RichContentMessage) messageContent;
+            String messageTitle = richContentMessage.getTitle();
+            messageText = getOmitColored(filterStr, messageTitle, 1, context);
+            if (messageText.length() == 0) {
+                SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder("[链接]");
+                spannableStringBuilder.append(messageTitle);
+                messageText = spannableStringBuilder;
+            }
+        }
+        if (messageContent instanceof FileMessage) {
+            FileMessage fileMessage = (FileMessage) messageContent;
+            String fileName = fileMessage.getName();
+            messageText = getOmitColored(filterStr, fileName, 2, context);
+        }
+        return messageText;
+    }
+
+    public static SpannableStringBuilder getOmitColored(String filterStr, String content, int type, Context context) {
+        SpannableStringBuilder messageText = new SpannableStringBuilder();
+        String lowerCaseFilterStr = filterStr.toLowerCase();
+        String lowerCaseText = content.toLowerCase();
+        if (lowerCaseText.contains(lowerCaseFilterStr)) {
+            SpannableStringBuilder finalBuilder = new SpannableStringBuilder();
+            if (type == 0) {
+            } else if (type == 1) {
+                finalBuilder.append("[链接]");
+            } else if (type == 2) {
+                finalBuilder.append("[文件]");
+            }
+            int length = content.length();
+            int firstIndex = lowerCaseText.indexOf(lowerCaseFilterStr);
+            String subString = content.substring(firstIndex);
+            int restLength;
+            if (subString != null) {
+                restLength = subString.length();
+            } else {
+                restLength = 0;
+            }
+            if (length <= 12) {
+                SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(content);
+                spannableStringBuilder.setSpan(new ForegroundColorSpan(context.getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa)), firstIndex, firstIndex + filterStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+                return finalBuilder.append(spannableStringBuilder);
+
+            } else {
+                //首次出现搜索字符的index加上filter的length;
+                int totalLength = firstIndex + filterStr.length();
+                if (totalLength < 12) {
+                    String smallerString = content.substring(0, 12);
+                    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(smallerString);
+                    spannableStringBuilder.setSpan(new ForegroundColorSpan(context.getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa)), firstIndex, firstIndex + filterStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+                    spannableStringBuilder.append("...");
+                    return finalBuilder.append(spannableStringBuilder);
+                } else if (restLength < 12) {
+                    String smallerString = content.substring(length - 12, length);
+                    String smallerStringLowerCase = lowerCaseText.substring(length - 12, length);
+                    int index = smallerStringLowerCase.indexOf(lowerCaseFilterStr);
+                    SpannableStringBuilder builder = new SpannableStringBuilder("...");
+                    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(smallerString);
+                    spannableStringBuilder.setSpan(new ForegroundColorSpan(context.getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa)), index, index + filterStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+                    builder.append(spannableStringBuilder);
+                    return finalBuilder.append(builder);
+                } else {
+                    String smallerString;
+                    String smallerStringLowerCase;
+                    int index = 0;
+                    if (firstIndex >= 5) {
+                        smallerString = content.substring(firstIndex - 5, firstIndex + 7);
+                        smallerStringLowerCase = lowerCaseText.substring(firstIndex - 5, firstIndex + 7);
+                        String smallerFilter = lowerCaseFilterStr;
+                        if (smallerFilter.length() > 7) {
+                            smallerFilter = lowerCaseFilterStr.substring(0, 7);
+                        }
+                        index = smallerStringLowerCase.indexOf(smallerFilter);
+                    } else {
+                        smallerString = content.substring(firstIndex, firstIndex + 12);
+                        smallerStringLowerCase = lowerCaseText.substring(firstIndex, firstIndex + 12);
+                        if (smallerStringLowerCase.length() < lowerCaseFilterStr.length()) {
+                            index = 0;
+                        }
+                    }
+                    SpannableStringBuilder builder = new SpannableStringBuilder("...");
+                    SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(smallerString);
+                    spannableStringBuilder.setSpan(new ForegroundColorSpan(context.getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa)), index, getSmallerLength(smallerString.length(), index + filterStr.length()), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+                    builder.append(spannableStringBuilder);
+                    builder.append("...");
+                    return finalBuilder.append(builder);
+                }
+            }
+        }
+        return messageText;
+    }
+
+    private static int getSmallerLength(int stringLength, int endIndex) {
+        return stringLength > endIndex + 1 ? endIndex : stringLength;
+    }
+}

+ 42 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/MessageSettingGroupMemberAdapter.java

@@ -0,0 +1,42 @@
+package com.common.im.adapter;
+
+import android.text.TextUtils;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im.bean.GroupMemberBean;
+import com.common.im_ui.R;
+import com.cooleshow.base.utils.GlideImageLoaderUtils;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/11 16:55
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MessageSettingGroupMemberAdapter extends BaseQuickAdapter<GroupMemberBean, BaseViewHolder> {
+
+    public MessageSettingGroupMemberAdapter(List<GroupMemberBean> data) {
+        super(R.layout.message_setting_group_member_list_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, GroupMemberBean item) {
+        ImageView ivIcon = helper.getView(R.id.iv_icon);
+        TextView tvTitle = helper.getView(R.id.tv_title);
+        String title = item.getRoleType();
+        if (!TextUtils.isEmpty(title) && ("乐团主管".equals(title) || "运营主管".equals(title) || "乐队指导".equals(title) || "指导老师".equals(title) || "衔接老师".equals(title))) {
+            GlideImageLoaderUtils.getInstance().loadCircleImage(getContext(), item.getAvatar(), R.drawable.ic_stu_student_head,ivIcon);
+        } else {
+            GlideImageLoaderUtils.getInstance().loadCircleImage(getContext(), item.getAvatar(),R.drawable.ic_teach_teacher_loading, ivIcon);
+        }
+
+        tvTitle.setText(item.getNickname());
+    }
+
+}

+ 96 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/MineScoreAdapter.java

@@ -0,0 +1,96 @@
+package com.common.im.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.constraintlayout.widget.ConstraintLayout;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im.bean.MusicSheetListBean;
+import com.common.im_ui.R;
+import com.cooleshow.base.utils.GlideUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 创建日期:2022/5/20 17:19
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MineScoreAdapter extends BaseQuickAdapter<MusicSheetListBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    public MineScoreAdapter(List<MusicSheetListBean.RowsBean> data) {
+        super(R.layout.cl_layout_mine_score_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, MusicSheetListBean.RowsBean item) {
+        TextView tv_name = helper.getView(R.id.tv_name);
+        TextView tv_author_name = helper.getView(R.id.tv_author_name);
+        ImageView im_state = helper.getView(R.id.im_state);
+        ImageView im_header = helper.getView(R.id.im_header);
+        TextView tv_teacher_name = helper.getView(R.id.tv_teacher_name);
+        RecyclerView rv_mark = helper.getView(R.id.rv_mark);
+        ConstraintLayout constraintLayout=helper.getView(R.id.constraintLayout);
+
+        switch (item.chargeType) {
+            case "FREE":
+                im_state.setBackgroundResource(R.drawable.icon_score_free);
+                break;
+            case "VIP":
+                im_state.setBackgroundResource(R.drawable.icon_score_vip);
+                break;
+            case "CHARGE":
+                im_state.setBackgroundResource(R.drawable.icon_score_demand);
+                break;
+        }
+        tv_name.setText(item.musicSheetName);
+        tv_author_name.setText(item.composer);
+        GlideUtils.INSTANCE.loadImage(getContext(), item.addUserAvatar, im_header, R.drawable.icon_teacher_default_head);
+        tv_teacher_name.setText(item.addName);
+        if (!TextUtils.isEmpty(item.musicSheetName)) {
+            rv_mark.setVisibility(View.VISIBLE);
+            List<String> markList = new ArrayList<>();
+            if (item.musicSheetName.contains(",")) {
+                String[] split = item.musicSheetName.split(",");
+                for (String s : split) {
+                    markList.add(s);
+                }
+            } else {
+                markList.add(item.musicSheetName);
+            }
+            LinearLayoutManager manager = new LinearLayoutManager(getContext());
+            manager.setOrientation(LinearLayoutManager.HORIZONTAL);
+            rv_mark.setLayoutManager(manager);
+            ItemMarkAdapter itemMarkAdapter = new ItemMarkAdapter(markList);
+            rv_mark.setAdapter(itemMarkAdapter);
+        } else {
+            rv_mark.setVisibility(View.GONE);
+        }
+
+        if (item.isSelect){
+            constraintLayout.setBackgroundResource(com.cooleshow.base.R.drawable.bg_white_10dp_border_2dc7aa);
+        }else {
+            constraintLayout.setBackgroundResource(com.cooleshow.base.R.drawable.bg_white_10dp);
+        }
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+
+}

+ 82 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/NoticeListAdapter.java

@@ -0,0 +1,82 @@
+package com.common.im.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.module.BaseLoadMoreModule;
+import com.chad.library.adapter.base.module.LoadMoreModule;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im.bean.GroupNoticeBean;
+import com.common.im.bean.MusicSheetListBean;
+import com.common.im_ui.R;
+import com.cooleshow.base.utils.DateUtil;
+import com.cooleshow.base.utils.GlideUtils;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/11 18:34
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class NoticeListAdapter extends BaseQuickAdapter<GroupNoticeBean.RowsBean, BaseViewHolder> implements LoadMoreModule {
+
+    public NoticeListAdapter(List<GroupNoticeBean.RowsBean> data) {
+        super(R.layout.notice_list_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, GroupNoticeBean.RowsBean bean) {
+        ImageView ivPortrait = helper.getView(R.id.iv_portrait);
+        TextView tvName = helper.getView(R.id.tv_name);
+        TextView tvTime = helper.getView(R.id.tv_time);
+        TextView tvRoof = helper.getView(R.id.tv_roof);
+        ImageView ivSetting = helper.getView(R.id.iv_setting);
+        TextView tvTitle = helper.getView(R.id.tv_title);
+        TextView tvContent = helper.getView(R.id.tv_content);
+        TextView tvRead = helper.getView(R.id.tv_read);
+        GlideUtils.INSTANCE.loadImage(getContext(), bean.avatar, ivPortrait, R.drawable.ic_teach_teacher_loading);
+        tvName.setText(bean.username);
+
+        tvTime.setText(DateUtil.dateFormatNoSecond(TextUtils.isEmpty(bean.updateTime) ? bean.createTime : bean.updateTime));
+        if (bean.topFlag) {
+            tvRoof.setVisibility(View.VISIBLE);
+        } else {
+            tvRoof.setVisibility(View.GONE);
+        }
+        tvTitle.setText(bean.title);
+        tvContent.setText(bean.content);
+        ivSetting.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (null != mSettingClickListener) {
+                    mSettingClickListener.onSettingClick(v, bean);
+                }
+            }
+        });
+    }
+
+    @NonNull
+    @Override
+    public BaseLoadMoreModule addLoadMoreModule(@NonNull BaseQuickAdapter<?, ?> baseQuickAdapter) {
+        return new BaseLoadMoreModule(baseQuickAdapter);
+    }
+
+
+    public interface SettingClickListener {
+        void onSettingClick(View v, GroupNoticeBean.RowsBean bean);
+    }
+
+    private SettingClickListener mSettingClickListener;
+
+    public void setmSettingClickListener(SettingClickListener mSettingClickListener) {
+        this.mSettingClickListener = mSettingClickListener;
+    }
+}

+ 29 - 0
rong_im/common_im_ui/src/main/java/com/common/im/adapter/NoticePopuListAdapter.java

@@ -0,0 +1,29 @@
+package com.common.im.adapter;
+
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+import com.common.im_ui.R;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/11 19:02
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class NoticePopuListAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
+
+    public NoticePopuListAdapter(List<String> data) {
+        super(R.layout.notice_popu_list_item, data);
+    }
+
+
+    @Override
+    protected void convert(BaseViewHolder helper, String bean) {
+        TextView tvTitle=helper.getView(R.id.tv_title);
+        tvTitle.setText(bean);
+    }
+}

+ 182 - 6
rong_im/common_im_ui/src/main/java/com/common/im/api/IMApi.java

@@ -1,7 +1,16 @@
 package com.common.im.api;
 
+import static com.cooleshow.base.common.BaseConstant.STUDENT_GROUP;
+import static com.cooleshow.base.common.BaseConstant.TEACHER_GROUP;
+
 import com.common.im.bean.ContactListBean;
-import com.cooleshow.base.common.BaseConstant;
+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.MusicSheetListBean;
+import com.common.im.bean.RongIMGroupInfo;
+import com.common.im.bean.RongIMUserInfo;
 import com.cooleshow.base.data.net.BaseResponse;
 
 import java.util.List;
@@ -9,19 +18,186 @@ import java.util.List;
 import io.reactivex.rxjava3.core.Observable;
 import okhttp3.RequestBody;
 import retrofit2.http.Body;
-import retrofit2.http.GET;
+import retrofit2.http.Field;
+import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.POST;
-import retrofit2.http.Query;
+import retrofit2.http.Path;
 
 /**
  * Author by pq, Date on 2022/5/7.
  */
 public interface IMApi {
+
+    /**
+     * 获取好友列表-学生
+     *
+     * @return
+     */
+    @POST(STUDENT_GROUP + "imUserFriend/queryAll")
+    Observable<BaseResponse<List<ContactListBean>>> queryStuFriendList(@Body RequestBody requestBody);
+
+    /**
+     * 获取好友列表-老师
+     *
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imUserFriend/queryAll")
+    Observable<BaseResponse<List<ContactListBean>>> queryTeaFriendList(@Body RequestBody requestBody);
+
+    /**
+     * 群列表-学生
+     *
+     * @return
+     */
+    @POST(STUDENT_GROUP + "imGroup/queryAll")
+    Observable<BaseResponse<List<ContactRoomListBean>>> queryStuGroupList(@Body RequestBody requestBody);
+
+    /**
+     * 群列表-老师
+     *
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroup/queryAll")
+    Observable<BaseResponse<List<ContactRoomListBean>>> queryTeaGroupList(@Body RequestBody requestBody);
+
+    /**
+     * 根据用户编号获取用户基本信息-学生
+     *
+     * @param userId
+     * @return
+     */
+    @POST(STUDENT_GROUP + "imUserFriend/getDetail/{userId}")
+    Observable<BaseResponse<RongIMUserInfo>> queryStuFriendDetail(@Path("userId") String userId);
+
+    /**
+     * 根据用户编号获取用户基本信息-老师
+     *
+     * @param userId
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imUserFriend/getDetail/{userId}")
+    Observable<BaseResponse<RongIMUserInfo>> queryTeaFriendDetail(@Path("userId") String userId);
+
+
+    /**
+     * 查询群详情-学生
+     *
+     * @returnClassListAdapter
+     */
+    @POST(STUDENT_GROUP + "imGroup/getDetail/{groupId}")
+    Observable<BaseResponse<RongIMGroupInfo>> queryStuGroupDetail(@Path("groupId") String groupId);
+
+    /**
+     * 查询群详情-老师
+     *
+     * @returnClassListAdapter
+     */
+    @POST(TEACHER_GROUP + "imGroup/getDetail/{groupId}")
+    Observable<BaseResponse<RongIMGroupInfo>> queryTeaGroupDetail(@Path("groupId") String groupId);
+
+
     /**
-     * 获取好友列表
+     * 分页查询分页查询
      *
+     * @param body
      * @return
      */
-    @POST(BaseConstant.TEACHER_GROUP + "imUserFriend/queryAll")
-    Observable<BaseResponse<List<ContactListBean>>> queryFriendList(@Body RequestBody requestBody);
+    @POST(TEACHER_GROUP + "music/sheet/list")
+    Observable<BaseResponse<MusicSheetListBean>> queryMusicList(@Body RequestBody body);
+
+    /**
+     * 创建粉丝群
+     *
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroup/create")
+    Observable<BaseResponse<Object>> createImGroup(@Body RequestBody body);
+
+    /**
+     * 获取群成员列表-学生
+     *
+     * @param body
+     * @return
+     */
+    @POST(STUDENT_GROUP + "imGroupMember/queryAll")
+    Observable<BaseResponse<List<GroupMemberBean>>> queryStuGroupMembers(@Body RequestBody body);
+
+    /**
+     * 获取群成员列表-老师
+     *
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroupMember/queryAll")
+    Observable<BaseResponse<List<GroupMemberBean>>> queryTeaGroupMembers(@Body RequestBody body);
+
+    /**
+     * 群公告-学生
+     *
+     * @param body
+     * @return
+     */
+    @POST(STUDENT_GROUP + "imGroupNotice/queryPage")
+    Observable<BaseResponse<GroupNoticeBean>> queryStuGroupNotice(@Body RequestBody body);
+
+    /**
+     * 群公告-老师
+     *
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroupNotice/queryPage")
+    Observable<BaseResponse<GroupNoticeBean>> queryTeaGroupNotice(@Body RequestBody body);
+
+    /**
+     * 修改群公告
+     *
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroupNotice/update")
+    Observable<BaseResponse<Object>> updateGroupNotice(@Body RequestBody body);
+
+    /**
+     * 新增群公告
+     *
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroupNotice/create")
+    Observable<BaseResponse<Object>> createGroupNotice(@Body RequestBody body);
+
+    /**
+     * 修改群信息
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroup/update")
+    Observable<BaseResponse<Object>> updateGroupInfo(@Body RequestBody body);
+
+    /**
+     * 申请入群列表
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroupMemberAudit/queryAll")
+    Observable<BaseResponse<List<GroupApplyBean>>> groupApplyList(@Body RequestBody body);
+
+    /**
+     * 申请入群批量审核
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "imGroupMemberAudit/applyAudit")
+    Observable<BaseResponse<Object>> doGroupApply(@Body RequestBody body);
+
+    /**
+     *
+     * @param body
+     * @return
+     */
+    @POST(TEACHER_GROUP + "sysImComplaint/add")
+    Observable<BaseResponse<Object>> sysImComplaint(@Body RequestBody body);
+
 }

+ 142 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/ContactRoomListBean.java

@@ -0,0 +1,142 @@
+package com.common.im.bean;
+
+/**
+ * 创建日期:2022/6/10 11:38
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ContactRoomListBean {
+    /*
+    	"autoPassFlag": true,
+			"createBy": 0,
+			"createTime": "",
+			"existFlag": true,
+			"hasWaitAuditFlag": true,
+			"id": "",
+			"img": "",
+			"introduce": "",
+			"memberNum": 0,
+			"memo": "",
+			"name": "",
+			"type": "",
+			"updateTime": ""
+     */
+    private boolean autoPassFlag;
+    private long createBy;
+    private String createTime;
+    private boolean existFlag;
+    private boolean hasWaitAuditFlag;
+    private String id;
+    private String img;
+    private String introduce;
+    private int memberNum;
+    private String memo;
+    private String name;
+    private String type;
+    private String updateTime;
+
+    public boolean isAutoPassFlag() {
+        return autoPassFlag;
+    }
+
+    public void setAutoPassFlag(boolean autoPassFlag) {
+        this.autoPassFlag = autoPassFlag;
+    }
+
+    public long getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(long createBy) {
+        this.createBy = createBy;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public boolean isExistFlag() {
+        return existFlag;
+    }
+
+    public void setExistFlag(boolean existFlag) {
+        this.existFlag = existFlag;
+    }
+
+    public boolean isHasWaitAuditFlag() {
+        return hasWaitAuditFlag;
+    }
+
+    public void setHasWaitAuditFlag(boolean hasWaitAuditFlag) {
+        this.hasWaitAuditFlag = hasWaitAuditFlag;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public String getIntroduce() {
+        return introduce;
+    }
+
+    public void setIntroduce(String introduce) {
+        this.introduce = introduce;
+    }
+
+    public int getMemberNum() {
+        return memberNum;
+    }
+
+    public void setMemberNum(int memberNum) {
+        this.memberNum = memberNum;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 102 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupApplyBean.java

@@ -0,0 +1,102 @@
+package com.common.im.bean;
+
+/**
+ * 创建日期:2022/6/13 17:39
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class GroupApplyBean {
+    /**
+     * "auditStatus": "",
+     * "createTime": "",
+     * "desc": "",
+     * "groupId": "",
+     * "id": 0,
+     * "roleType": "",
+     * "updateTime": "",
+     * "userId": 0
+     */
+    private String auditStatus;
+    private String createTime;
+    private String desc;
+    private String groupId;
+    private long id;
+    private String roleType;
+    private String updateTime;
+    private long userId;
+
+    private boolean isSelect;
+
+    public String getAuditStatus() {
+        return auditStatus;
+    }
+
+    public void setAuditStatus(String auditStatus) {
+        this.auditStatus = auditStatus;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(String roleType) {
+        this.roleType = roleType;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(long userId) {
+        this.userId = userId;
+    }
+
+    public boolean isSelect() {
+        return isSelect;
+    }
+
+    public void setSelect(boolean select) {
+        isSelect = select;
+    }
+}

+ 114 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupMemberBean.java

@@ -0,0 +1,114 @@
+package com.common.im.bean;
+
+import android.text.TextUtils;
+
+import com.mcxtzhang.indexlib.IndexBar.bean.BaseIndexPinyinBean;
+
+import java.io.Serializable;
+
+/**
+ * 创建日期:2022/6/11 16:44
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class GroupMemberBean  extends BaseIndexPinyinBean implements Serializable {
+    /*
+    	"avatar": "",
+			"createTime": "",
+			"groupId": "",
+			"id": 0,
+			"isAdmin": true,
+			"nickname": "",
+			"roleType": "",
+			"updateTime": "",
+			"userId": 0
+     */
+
+    private String avatar;
+    private String createTime;
+    private String groupId;
+    private long id;
+    private boolean isAdmin;
+    private String nickname;
+    private String roleType;
+    private String updateTime;
+    private long userId;
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public boolean isAdmin() {
+        return isAdmin;
+    }
+
+    public void setAdmin(boolean admin) {
+        isAdmin = admin;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getRoleType() {
+        return roleType;
+    }
+
+    public void setRoleType(String roleType) {
+        this.roleType = roleType;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(long userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public String getTarget() {
+        return TextUtils.isEmpty(nickname) ? "#" : nickname;
+    }
+}

+ 51 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/GroupNoticeBean.java

@@ -0,0 +1,51 @@
+package com.common.im.bean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/11 18:20
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class GroupNoticeBean {
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public int total;
+    public int totalPage;
+    public List<RowsBean> rows;
+
+
+    public static class RowsBean {
+        /**
+         * "avatar": "",
+         * "content": "",
+         * "createTime": "",
+         * "delFlag": true,
+         * "groupId": "",
+         * "id": 0,
+         * "operatorId": 0,
+         * "sentToNewMemberFlag": true,
+         * "title": "",
+         * "topFlag": true,
+         * "updateTime": "",
+         * "username": ""
+         */
+
+        public String avatar;
+        public String content;
+        public String createTime;
+        public boolean delFlag;
+        public String groupId;
+        public long id;
+        public long operatorId;
+        public boolean sentToNewMemberFlag;
+        public String title;
+        public boolean topFlag;
+        public String updateTime;
+        public String username;
+    }
+}

+ 107 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/MusicSheetListBean.java

@@ -0,0 +1,107 @@
+package com.common.im.bean;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/20 17:07
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class MusicSheetListBean {
+
+    public int limit;
+    public int nextPage;
+    public int offset;
+    public int pageNo;
+    public int prePage;
+    public int total;
+    public int totalPage;
+    public List<RowsBean> rows;
+
+    public static class RowsBean {
+        /*
+        {
+				"addName": "",
+				"addUserAvatar": "",
+				"audioFileUrl": "",
+				"audioType": "",
+				"auditStatus": "",
+				"auditVersion": "",
+				"canEvaluate": "",
+				"chargeType": "",
+				"composer": "",
+				"createBy": 0,
+				"createTime": "",
+				"delFlag": true,
+				"favorite": "",
+				"hasBeat": "",
+				"hotFlag": "",
+				"id": 0,
+				"metronomeUrl": "",
+				"midiUrl": "",
+				"mp3Type": "",
+				"musicPrice": 0,
+				"musicSheetName": "",
+				"musicSubject": "",
+				"musicTag": "",
+				"musicTagNames": "",
+				"play": "",
+				"playSpeed": 0,
+				"remark": "",
+				"showFingering": "",
+				"sortNumber": 0,
+				"sourceType": "",
+				"state": "",
+				"subjectNames": "",
+				"submitAuditTime": "",
+				"topFlag": "",
+				"updateBy": 0,
+				"updateTime": "",
+				"url": "",
+				"userId": 0,
+				"xmlFileUrl": ""
+			}
+
+         */
+
+        public String addName;
+        public String addUserAvatar;
+        public String audioFileUrl;
+        public String audioType;
+        public String auditStatus;
+        public String auditVersion;
+        public String canEvaluate;
+        public String chargeType;
+        public String composer;
+        public String createTime;
+        public boolean delFlag;
+        public String favorite;
+        public String hasBeat;
+        public String hotFlag;
+        public int id;
+        public String metronomeUrl;
+        public String midiUrl;
+        public String mp3Type;
+        public double musicPrice;
+        public String musicSheetName;
+        public String musicSubject;
+        public String musicTag;
+        public String musicTagNames;
+        public String play;
+        public int playSpeed;
+        public String remark;
+        public String showFingering;
+        public int sortNumber;
+        public String sourceType;
+        public String state;
+        public String subjectNames;
+        public String submitAuditTime;
+        public String topFlag;
+        public String updateTime;
+        public String url;
+        public int userId;
+        public String xmlFileUrl;
+        public boolean isSelect;
+    }
+}

+ 142 - 0
rong_im/common_im_ui/src/main/java/com/common/im/bean/RongIMGroupInfo.java

@@ -0,0 +1,142 @@
+package com.common.im.bean;
+
+/**
+ * 创建日期:2022/6/9 16:59
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class RongIMGroupInfo {
+    /*
+   	"autoPassFlag": true,
+		"createBy": 0,
+		"createTime": "",
+		"existFlag": true,
+		"hasWaitAuditFlag": true,
+		"id": "",
+		"img": "",
+		"introduce": "",
+		"memberNum": 0,
+		"memo": "",
+		"name": "",
+		"type": "",
+		"updateTime": ""
+     */
+    private boolean autoPassFlag;
+    private long createBy;
+    private String createTime;
+    private boolean existFlag;
+    private boolean hasWaitAuditFlag;
+    private String id;
+    private String img;
+    private String introduce;
+    private int memberNum;
+    private String memo;
+    private String name;
+    private String type;
+    private String updateTime;
+
+    public boolean isAutoPassFlag() {
+        return autoPassFlag;
+    }
+
+    public void setAutoPassFlag(boolean autoPassFlag) {
+        this.autoPassFlag = autoPassFlag;
+    }
+
+    public long getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(long createBy) {
+        this.createBy = createBy;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public boolean isExistFlag() {
+        return existFlag;
+    }
+
+    public void setExistFlag(boolean existFlag) {
+        this.existFlag = existFlag;
+    }
+
+    public boolean isHasWaitAuditFlag() {
+        return hasWaitAuditFlag;
+    }
+
+    public void setHasWaitAuditFlag(boolean hasWaitAuditFlag) {
+        this.hasWaitAuditFlag = hasWaitAuditFlag;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getImg() {
+        return img;
+    }
+
+    public void setImg(String img) {
+        this.img = img;
+    }
+
+    public String getIntroduce() {
+        return introduce;
+    }
+
+    public void setIntroduce(String introduce) {
+        this.introduce = introduce;
+    }
+
+    public int getMemberNum() {
+        return memberNum;
+    }
+
+    public void setMemberNum(int memberNum) {
+        this.memberNum = memberNum;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+}

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

@@ -0,0 +1,88 @@
+package com.common.im.bean;
+
+
+public class RongIMUserInfo {
+
+    /**
+     "createTime": "",
+     "friendAvatar": "",
+     "friendId": 0,
+     "friendNickname": "",
+     "id": 0,
+     "memo": "",
+     "updateTime": "",
+     "userId": 0
+     */
+    private String createTime;
+    private String friendAvatar;
+    private String friendId;
+    private String friendNickname;
+    private long id;
+    private String memo;
+    private String updateTime;
+    private String userId;
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getFriendAvatar() {
+        return friendAvatar;
+    }
+
+    public void setFriendAvatar(String friendAvatar) {
+        this.friendAvatar = friendAvatar;
+    }
+
+    public String getFriendId() {
+        return friendId;
+    }
+
+    public void setFriendId(String friendId) {
+        this.friendId = friendId;
+    }
+
+    public String getFriendNickname() {
+        return friendNickname;
+    }
+
+    public void setFriendNickname(String friendNickname) {
+        this.friendNickname = friendNickname;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+}

+ 26 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/ChatGroupSettingContract.java

@@ -0,0 +1,26 @@
+package com.common.im.contract;
+
+import com.common.im.bean.GroupMemberBean;
+import com.common.im.bean.RongIMGroupInfo;
+import com.cooleshow.base.presenter.view.BaseView;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/11 14:43
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ChatGroupSettingContract {
+    interface ChatGroupSettingView extends BaseView {
+        void onConversation(boolean b);
+
+        void onGroupUsers(List<GroupMemberBean> data, String groupId);
+
+        void onQueryGroupDetail(RongIMGroupInfo data);
+    }
+
+    interface Presenter {
+    }
+}

+ 5 - 1
rong_im/common_im_ui/src/main/java/com/common/im/contract/ContactListFragmentContract.java

@@ -1,5 +1,7 @@
 package com.common.im.contract;
 
+import android.content.Context;
+
 import com.common.im.bean.ContactListBean;
 import com.cooleshow.base.presenter.view.BaseView;
 
@@ -12,9 +14,11 @@ public interface ContactListFragmentContract {
 
     interface ContactListFragmentView extends BaseView {
         void getFriendListSuccess(List<ContactListBean> contactListBeans);
+
+        void getFriendListError();
     }
 
     interface Presenter {
-        void queryFriendList(String searchCondition);
+        void queryFriendList(Context context, String searchCondition);
     }
 }

+ 17 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/ContactListTabPContract.java

@@ -0,0 +1,17 @@
+package com.common.im.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/9 18:07
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ContactListTabPContract {
+    interface ContactListTabView extends BaseView {
+    }
+
+    interface Presenter {
+    }
+}

+ 27 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/ContactRoomListFragmentContract.java

@@ -0,0 +1,27 @@
+package com.common.im.contract;
+
+import android.content.Context;
+
+import com.common.im.bean.ContactListBean;
+import com.common.im.bean.ContactRoomListBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/10 11:32
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ContactRoomListFragmentContract {
+    interface ContactRoomListFragmentView extends BaseView {
+        void getGroupListSuccess(List<ContactRoomListBean> contactListBeans);
+
+        void getGroupListError();
+    }
+
+    interface Presenter {
+        void queryGroupList(Context context, String searchCondition);
+    }
+}

+ 18 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/CreateGroupContract.java

@@ -0,0 +1,18 @@
+package com.common.im.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/10 17:40
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface CreateGroupContract {
+    interface CreateGroupView extends BaseView {
+        void createImGroupSuccess();
+    }
+
+    interface Presenter {
+    }
+}

+ 17 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/GroupMemberContract.java

@@ -0,0 +1,17 @@
+package com.common.im.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/13 15:26
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface GroupMemberContract {
+    interface GroupMemberView extends BaseView {
+    }
+
+    interface Presenter {
+    }
+}

+ 18 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/ImAppealContract.java

@@ -0,0 +1,18 @@
+package com.common.im.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/13 13:55
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ImAppealContract {
+    interface ImAppealView extends BaseView {
+        void sysImComplaintSuccess();
+    }
+
+    interface Presenter {
+    }
+}

+ 23 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/JoinGroupApplyContract.java

@@ -0,0 +1,23 @@
+package com.common.im.contract;
+
+import com.common.im.bean.GroupApplyBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/13 16:46
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface JoinGroupApplyContract {
+    interface JoinGroupApplyView extends BaseView {
+        void groupApplyListSuccess(List<GroupApplyBean> data);
+
+        void doGroupApplySuccess();
+    }
+
+    interface Presenter {
+    }
+}

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

@@ -1,16 +1,18 @@
 package com.common.im.contract;
 
+import com.common.im.bean.RongIMGroupInfo;
+import com.common.im.bean.RongIMUserInfo;
 import com.cooleshow.base.presenter.view.BaseView;
 
-import java.util.Date;
-import java.util.List;
-
 /**
  * Author by pq, Date on 2022/4/20.
  */
 public interface MessageFragmentContract {
 
     interface MessageFragmentView extends BaseView {
+        void onQueryFriendDetail(RongIMUserInfo data);
+
+        void onQueryGroupDetail(RongIMGroupInfo data);
     }
 
     interface Presenter {

+ 23 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/NoticeContract.java

@@ -0,0 +1,23 @@
+package com.common.im.contract;
+
+import com.common.im.bean.GroupNoticeBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/11 18:10
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface NoticeContract {
+    interface NoticeView extends BaseView {
+        void queryGroupNoticeSuccess(int page, GroupNoticeBean data);
+
+        void queryGroupNoticeError(int page);
+
+        void updateGroupNoticeSuccess();
+    }
+
+    interface Presenter {
+    }
+}

+ 19 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/NoticeEditContract.java

@@ -0,0 +1,19 @@
+package com.common.im.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/11 19:39
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface NoticeEditContract {
+    interface NoticeEditView extends BaseView {
+        void updateGroupNoticeSuccess();
+        void createGroupNoticeSuccess();
+    }
+
+    interface Presenter {
+    }
+}

+ 17 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/PhotoPreviewContract.java

@@ -0,0 +1,17 @@
+package com.common.im.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/13 14:32
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface PhotoPreviewContract {
+    interface PhotoPreviewView extends BaseView {
+    }
+
+    interface Presenter {
+    }
+}

+ 17 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/SearchHistoryMessageContract.java

@@ -0,0 +1,17 @@
+package com.common.im.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/11 16:06
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface SearchHistoryMessageContract {
+    interface SearchHistoryMessageView extends BaseView {
+    }
+
+    interface Presenter {
+    }
+}

+ 19 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/SelectScoreChatContract.java

@@ -0,0 +1,19 @@
+package com.common.im.contract;
+
+import com.common.im.bean.MusicSheetListBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/10 15:32
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface SelectScoreChatContract {
+    interface SelectScoreChatView extends BaseView {
+        void queryMusicListSuccess(int page , MusicSheetListBean data);
+        void queryMusicListError(int page);
+    }
+    interface Presenter {
+    }
+}

+ 19 - 0
rong_im/common_im_ui/src/main/java/com/common/im/contract/SetRemarksContract.java

@@ -0,0 +1,19 @@
+package com.common.im.contract;
+
+import com.common.im.bean.GroupNoticeBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * 创建日期:2022/6/13 11:19
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface SetRemarksContract {
+    interface SetRemarksView extends BaseView {
+        void  updateGroupInfoSuccess();
+    }
+
+    interface Presenter {
+    }
+}

+ 176 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/ChatGroupSettingPresenter.java

@@ -0,0 +1,176 @@
+package com.common.im.presenter;
+
+import android.content.Context;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.common.im.api.IMApi;
+import com.common.im.bean.GroupMemberBean;
+import com.common.im.bean.MusicSheetListBean;
+import com.common.im.bean.RongIMGroupInfo;
+import com.common.im.contract.ChatGroupSettingContract;
+import com.cooleshow.base.constanst.Constants;
+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 java.util.List;
+
+import io.rong.imkit.RongIM;
+import io.rong.imlib.RongIMClient;
+import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.Group;
+
+/**
+ * 创建日期:2022/6/11 14:42
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ChatGroupSettingPresenter extends BasePresenter<ChatGroupSettingContract.ChatGroupSettingView> implements ChatGroupSettingContract.Presenter {
+    public void conversationGet(Conversation.ConversationType conversationType, final String targetId) {
+        RongIM.getInstance().getConversationNotificationStatus(conversationType, targetId, new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
+            @Override
+            public void onSuccess(Conversation.ConversationNotificationStatus conversationNotificationStatus) {
+                if (getView() != null) {
+                    getView().onConversation(conversationNotificationStatus.getValue() == 0 ? true : false);
+                }
+            }
+
+            @Override
+            public void onError(RongIMClient.ErrorCode errorCode) {
+
+            }
+        });
+
+    }
+
+    public void conversationMute(Conversation.ConversationType conversationType, String targetId, Conversation.ConversationNotificationStatus notificationStatus) {
+        RongIM.getInstance().setConversationNotificationStatus(conversationType, targetId, notificationStatus, new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
+            @Override
+            public void onSuccess(Conversation.ConversationNotificationStatus conversationNotificationStatus) {
+                if (getView() != null) {
+                    getView().onConversation(true);
+                }
+            }
+
+            @Override
+            public void onError(RongIMClient.ErrorCode errorCode) {
+
+            }
+        });
+    }
+
+    public void conversationGetUnmute(Conversation.ConversationType conversationType, String targetId, Conversation.ConversationNotificationStatus notificationStatus) {
+        RongIM.getInstance().setConversationNotificationStatus(conversationType, targetId, notificationStatus, new RongIMClient.ResultCallback<Conversation.ConversationNotificationStatus>() {
+            @Override
+            public void onSuccess(Conversation.ConversationNotificationStatus conversationNotificationStatus) {
+                if (getView() != null) {
+                    getView().onConversation(false);
+                }
+            }
+
+            @Override
+            public void onError(RongIMClient.ErrorCode errorCode) {
+
+            }
+        });
+    }
+
+    public void queryGroupMembers(Context context, String groupId) {
+        String tempGroupId = groupId.replace("S", "").replace("s", "").replace("I", "").replace("i", "");
+
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("groupId", tempGroupId);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        if ("com.cooleshow.student".equals(context.getPackageName())) {
+            addSubscribe(create(IMApi.class).queryStuGroupMembers(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<GroupMemberBean>>(getView()) {
+                @Override
+                protected void onSuccess(List<GroupMemberBean> data) {
+                    if (getView() != null) {
+                        getView().onGroupUsers(data, groupId);
+                    }
+                }
+
+                @Override
+                public void onComplete() {
+                    super.onComplete();
+                    if (getView() != null) {
+                        getView().hideLoading();
+                    }
+                }
+            });
+        } else {
+            addSubscribe(create(IMApi.class).queryTeaGroupMembers(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<GroupMemberBean>>(getView()) {
+                @Override
+                protected void onSuccess(List<GroupMemberBean> data) {
+                    if (getView() != null) {
+                        getView().onGroupUsers(data, groupId);
+                    }
+                }
+
+                @Override
+                public void onComplete() {
+                    super.onComplete();
+                    if (getView() != null) {
+                        getView().hideLoading();
+                    }
+                }
+            });
+        }
+    }
+
+    //查询群详情
+    public void queryGroupDetail(Context context, String groupId) {
+        String tempGroupId = groupId.replace("S", "").replace("s", "").replace("I", "").replace("i", "");
+        if ("com.cooleshow.student".equals(context.getPackageName())) {
+            addSubscribe(create(IMApi.class).queryStuGroupDetail(tempGroupId), new BaseObserver<RongIMGroupInfo>() {
+                @Override
+                protected void onSuccess(RongIMGroupInfo data) {
+                    if (isViewAttached()) {
+                        getView().onQueryGroupDetail(data);
+                    }
+                    if (data != null) {
+                        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())));
+                        }
+                    }
+                }
+
+            });
+        }else{
+            addSubscribe(create(IMApi.class).queryTeaGroupDetail(tempGroupId), new BaseObserver<RongIMGroupInfo>() {
+                @Override
+                protected void onSuccess(RongIMGroupInfo data) {
+                    Log.e("asdfasdfasdfas", "onSuccess: ==============" );
+                    if (isViewAttached()) {
+                        getView().onQueryGroupDetail(data);
+                    }
+                    if (data != null) {
+                        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())));
+                        }
+                    }
+                }
+
+                @Override
+                public void onError(Throwable e) {
+                    super.onError(e);
+                    Log.e("asdfasdfasdfas", "onError: =============="+e.getMessage() );
+                }
+            });
+        }
+    }
+
+}

+ 37 - 12
rong_im/common_im_ui/src/main/java/com/common/im/presenter/ContactListPresenter.java

@@ -1,5 +1,7 @@
 package com.common.im.presenter;
 
+import android.content.Context;
+
 import com.common.im.api.IMApi;
 import com.common.im.bean.ContactListBean;
 import com.common.im.contract.ContactListFragmentContract;
@@ -20,25 +22,48 @@ import java.util.List;
 public class ContactListPresenter extends BasePresenter<ContactListFragmentContract.ContactListFragmentView> implements ContactListFragmentContract.Presenter {
 
     @Override
-    public void queryFriendList(String searchCondition) {
+    public void queryFriendList(Context context, String searchCondition) {
         JSONObject jsonObject = new JSONObject();
         try {
             jsonObject.putOpt("search", searchCondition);
         } catch (JSONException e) {
             e.printStackTrace();
         }
-        addSubscribe(create(IMApi.class).queryFriendList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<ContactListBean>>(getView()) {
-            @Override
-            protected void onSuccess(List<ContactListBean> data) {
-                if (getView() != null) {
-                    getView().getFriendListSuccess(data);
+        if ("com.cooleshow.student".equals(context.getPackageName())) {
+            addSubscribe(create(IMApi.class).queryStuFriendList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<ContactListBean>>(getView()) {
+                @Override
+                protected void onSuccess(List<ContactListBean> data) {
+                    if (getView() != null) {
+                        getView().getFriendListSuccess(data);
+                    }
+                }
+
+                @Override
+                public void onError(Throwable e) {
+                    super.onError(e);
+                    if (getView() != null) {
+                        getView().getFriendListError();
+                    }
+                }
+            });
+        }else{
+            addSubscribe(create(IMApi.class).queryTeaFriendList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<ContactListBean>>(getView()) {
+                @Override
+                protected void onSuccess(List<ContactListBean> data) {
+                    if (getView() != null) {
+                        getView().getFriendListSuccess(data);
+                    }
                 }
-            }
 
-            @Override
-            public void onError(Throwable e) {
-                super.onError(e);
-            }
-        });
+                @Override
+                public void onError(Throwable e) {
+                    super.onError(e);
+                    if (getView() != null) {
+                        getView().getFriendListError();
+                    }
+                }
+            });
+        }
+
     }
 }

+ 14 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/ContactListTabPresenter.java

@@ -0,0 +1,14 @@
+package com.common.im.presenter;
+
+import com.common.im.contract.ContactListTabPContract;
+import com.common.im.contract.MessageFragmentContract;
+import com.cooleshow.base.presenter.BasePresenter;
+
+/**
+ * 创建日期:2022/6/9 18:06
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ContactListTabPresenter extends BasePresenter<ContactListTabPContract.ContactListTabView> implements MessageFragmentContract.Presenter {
+}

+ 71 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/ContactRoomListPresenter.java

@@ -0,0 +1,71 @@
+package com.common.im.presenter;
+
+import android.content.Context;
+
+import com.common.im.api.IMApi;
+import com.common.im.bean.ContactListBean;
+import com.common.im.bean.ContactRoomListBean;
+import com.common.im.contract.ContactRoomListFragmentContract;
+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 java.util.List;
+
+/**
+ * 创建日期:2022/6/10 11:32
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ContactRoomListPresenter extends BasePresenter<ContactRoomListFragmentContract.ContactRoomListFragmentView> implements ContactRoomListFragmentContract.Presenter {
+
+    @Override
+    public void queryGroupList(Context context, String searchCondition) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("search", searchCondition);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        if ("com.cooleshow.student".equals(context.getPackageName())) {
+            addSubscribe(create(IMApi.class).queryStuGroupList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<ContactRoomListBean>>(getView()) {
+                @Override
+                protected void onSuccess(List<ContactRoomListBean> data) {
+                    if (getView() != null) {
+                        getView().getGroupListSuccess(data);
+                    }
+                }
+
+                @Override
+                public void onError(Throwable e) {
+                    super.onError(e);
+                    if (getView() != null) {
+                        getView().getGroupListError();
+                    }
+                }
+            });
+        }else{
+            addSubscribe(create(IMApi.class).queryTeaGroupList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<ContactRoomListBean>>(getView()) {
+                @Override
+                protected void onSuccess(List<ContactRoomListBean> data) {
+                    if (getView() != null) {
+                        getView().getGroupListSuccess(data);
+                    }
+                }
+
+                @Override
+                public void onError(Throwable e) {
+                    super.onError(e);
+                    if (getView() != null) {
+                        getView().getGroupListError();
+                    }
+                }
+            });
+        }
+
+    }
+}

+ 43 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/CreateGroupPresenter.java

@@ -0,0 +1,43 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.contract.CreateGroupContract;
+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;
+
+/**
+ * 创建日期:2022/6/10 17:39
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class CreateGroupPresenter extends BasePresenter<CreateGroupContract.CreateGroupView> implements CreateGroupContract.Presenter {
+    public void createGroup(String name,String introduce){
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("name", name);
+            jsonObject.put("introduce", introduce);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).createImGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().createImGroupSuccess();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+        });
+    }
+}

+ 14 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/GroupMemberPresenter.java

@@ -0,0 +1,14 @@
+package com.common.im.presenter;
+
+import com.common.im.contract.CreateGroupContract;
+import com.common.im.contract.GroupMemberContract;
+import com.cooleshow.base.presenter.BasePresenter;
+
+/**
+ * 创建日期:2022/6/13 15:26
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class GroupMemberPresenter extends BasePresenter<GroupMemberContract.GroupMemberView> implements GroupMemberContract.Presenter {
+}

+ 51 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/ImAppealPresenter.java

@@ -0,0 +1,51 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.contract.ImAppealContract;
+import com.common.im.contract.NoticeContract;
+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;
+
+/**
+ * 创建日期:2022/6/13 13:55
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ImAppealPresenter extends BasePresenter<ImAppealContract.ImAppealView> implements NoticeContract.Presenter {
+
+    public void sysImComplaint(String memo, String targetId,String type, String url) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("memo", memo);
+            jsonObject.putOpt("targetId", targetId);
+            jsonObject.putOpt("type", type);
+            jsonObject.putOpt("url", url);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).sysImComplaint(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().sysImComplaintSuccess();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+    }
+}

+ 82 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/JoinGroupApplyPresenter.java

@@ -0,0 +1,82 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.bean.GroupApplyBean;
+import com.common.im.contract.JoinGroupApplyContract;
+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 java.util.List;
+
+/**
+ * 创建日期:2022/6/13 16:45
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class JoinGroupApplyPresenter extends BasePresenter<JoinGroupApplyContract.JoinGroupApplyView> implements JoinGroupApplyContract.Presenter {
+
+    public void groupApplyList(String groupId){
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("auditStatus", "AUDITING");
+            jsonObject.putOpt("groupId", groupId);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).groupApplyList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<List<GroupApplyBean>>(getView()) {
+            @Override
+            protected void onSuccess(List<GroupApplyBean> data) {
+                if (getView() != null) {
+                    getView().groupApplyListSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+    }
+
+    public void doGroupApply(String auditIds,String auditStatus,String groupId){
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("auditIds", auditIds);
+            jsonObject.putOpt("auditStatus", auditStatus);
+            jsonObject.putOpt("groupId", groupId);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).doGroupApply(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().doGroupApplySuccess();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+    }
+
+}

+ 86 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/MessagePresenter.java

@@ -1,10 +1,96 @@
 package com.common.im.presenter;
 
+import android.content.Context;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.common.im.api.IMApi;
 import com.common.im.contract.MessageFragmentContract;
+import com.common.im.bean.RongIMGroupInfo;
+import com.common.im.bean.RongIMUserInfo;
 import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+
+import io.rong.imkit.RongIM;
+import io.rong.imlib.model.Group;
 
 /**
  * Author by pq, Date on 2022/5/6.
  */
 public class MessagePresenter extends BasePresenter<MessageFragmentContract.MessageFragmentView> implements MessageFragmentContract.Presenter {
+
+    public void queryFriendDetail(Context context,String userId) {
+        //根据用户编号获取用户基本信息
+        if ("com.cooleshow.student".equals(context.getPackageName())) {
+            addSubscribe(create(IMApi.class).queryStuFriendDetail(userId), new BaseObserver<RongIMUserInfo>(getView()) {
+                @Override
+                protected void onSuccess(RongIMUserInfo data) {
+                    if (getView() != null) {
+                        getView().onQueryFriendDetail(data);
+                    }
+                }
+            });
+        }else{
+            addSubscribe(create(IMApi.class).queryTeaFriendDetail(userId), new BaseObserver<RongIMUserInfo>(getView()) {
+                @Override
+                protected void onSuccess(RongIMUserInfo data) {
+                    if (getView() != null) {
+                        getView().onQueryFriendDetail(data);
+                    }
+                }
+            });
+        }
+
+    }
+
+
+    //查询群详情
+    public void queryGroupDetail(Context context, String groupId) {
+        String tempGroupId = groupId.replace("S", "").replace("s", "").replace("I", "").replace("i", "");
+        if ("com.cooleshow.student".equals(context.getPackageName())) {
+            addSubscribe(create(IMApi.class).queryStuGroupDetail(tempGroupId), new BaseObserver<RongIMGroupInfo>() {
+                @Override
+                protected void onSuccess(RongIMGroupInfo data) {
+                    if (isViewAttached()) {
+                        getView().onQueryGroupDetail(data);
+                    }
+                    if (data != null) {
+                        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())));
+                        }
+                    }
+                }
+
+            });
+        }else{
+            addSubscribe(create(IMApi.class).queryTeaGroupDetail(tempGroupId), new BaseObserver<RongIMGroupInfo>() {
+                @Override
+                protected void onSuccess(RongIMGroupInfo data) {
+                    Log.e("asdfasdfasdfas", "onSuccess: ==============" );
+                    if (isViewAttached()) {
+                        getView().onQueryGroupDetail(data);
+                    }
+                    if (data != null) {
+                        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())));
+                        }
+                    }
+                }
+
+                @Override
+                public void onError(Throwable e) {
+                    super.onError(e);
+                    Log.e("asdfasdfasdfas", "onError: =============="+e.getMessage() );
+                }
+            });
+        }
+    }
+
+
+
 }

+ 87 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/NoticeEditPresenter.java

@@ -0,0 +1,87 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.contract.NoticeEditContract;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.usercenter.helper.UserHelper;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import io.rong.imkit.userinfo.db.model.User;
+
+/**
+ * 创建日期:2022/6/11 19:38
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class NoticeEditPresenter extends BasePresenter<NoticeEditContract.NoticeEditView> implements NoticeEditContract.Presenter {
+    public void noticeUpdate(long id, String targetId,String title,String notice, boolean topFlag) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("id", id);
+            jsonObject.putOpt("title", title);
+            jsonObject.putOpt("content", notice);
+            jsonObject.putOpt("groupId", targetId);
+            jsonObject.putOpt("topFlag", topFlag);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).updateGroupNotice(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().updateGroupNoticeSuccess();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+
+    }
+
+    public void createGroupNotice(String title,String notice,String groupId,boolean topFlag){
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("avatar", UserHelper.getUserAvatar());
+            jsonObject.putOpt("username", UserHelper.getUserName());
+            jsonObject.putOpt("title", title);
+            jsonObject.putOpt("content", notice);
+            jsonObject.putOpt("groupId", groupId);
+            jsonObject.putOpt("topFlag", topFlag);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).createGroupNotice(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().createGroupNoticeSuccess();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+    }
+}

+ 92 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/NoticePresenter.java

@@ -0,0 +1,92 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.bean.GroupNoticeBean;
+import com.common.im.contract.NoticeContract;
+import com.cooleshow.base.constanst.Constants;
+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;
+
+/**
+ * 创建日期:2022/6/11 18:09
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class NoticePresenter extends BasePresenter<NoticeContract.NoticeView> implements NoticeContract.Presenter {
+    public void queryGroupNotice(String groupId, int page) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("groupId", groupId);
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).queryTeaGroupNotice(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<GroupNoticeBean>(getView()) {
+            @Override
+            protected void onSuccess(GroupNoticeBean data) {
+                if (getView() != null) {
+                    getView().queryGroupNoticeSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().queryGroupNoticeError(page);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+    }
+
+    public void noticeUpdate(long id, String targetId, String title, String notice, boolean topFlag) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("id", id);
+            jsonObject.putOpt("title", title);
+            jsonObject.putOpt("content", notice);
+            jsonObject.putOpt("groupId", targetId);
+            jsonObject.putOpt("topFlag", topFlag);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).updateGroupNotice(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().updateGroupNoticeSuccess();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+
+    }
+
+}

+ 14 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/PhotoPreviewPresenter.java

@@ -0,0 +1,14 @@
+package com.common.im.presenter;
+
+import com.common.im.contract.NoticeContract;
+import com.common.im.contract.PhotoPreviewContract;
+import com.cooleshow.base.presenter.BasePresenter;
+
+/**
+ * 创建日期:2022/6/13 14:31
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class PhotoPreviewPresenter extends BasePresenter<PhotoPreviewContract.PhotoPreviewView> implements PhotoPreviewContract.Presenter {
+}

+ 13 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/SearchHistoryMessagePresenter.java

@@ -0,0 +1,13 @@
+package com.common.im.presenter;
+
+import com.common.im.contract.SearchHistoryMessageContract;
+import com.cooleshow.base.presenter.BasePresenter;
+
+/**
+ * 创建日期:2022/6/11 16:05
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class SearchHistoryMessagePresenter extends BasePresenter<SearchHistoryMessageContract.SearchHistoryMessageView> implements SearchHistoryMessageContract.Presenter {
+}

+ 57 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/SelectScoreChatPresenter.java

@@ -0,0 +1,57 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.bean.MusicSheetListBean;
+import com.common.im.contract.SelectScoreChatContract;
+import com.cooleshow.base.constanst.Constants;
+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;
+
+/**
+ * 创建日期:2022/6/10 15:31
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class SelectScoreChatPresenter extends BasePresenter<SelectScoreChatContract.SelectScoreChatView> implements SelectScoreChatContract.Presenter {
+    public void queryPageCourseGroup(boolean isLoading, int page, String auditStatus,String search) {
+        if (isLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("auditStatus", auditStatus);
+            jsonObject.put("search", search);
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).queryMusicList(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<MusicSheetListBean>(getView()) {
+            @Override
+            protected void onSuccess(MusicSheetListBean data) {
+                if (getView() != null) {
+                    getView().queryMusicListSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                getView().hideLoading();
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+                    getView().queryMusicListError(page);
+                }
+            }
+        });
+    }
+}

+ 51 - 0
rong_im/common_im_ui/src/main/java/com/common/im/presenter/SetRemarksPresenter.java

@@ -0,0 +1,51 @@
+package com.common.im.presenter;
+
+import com.common.im.api.IMApi;
+import com.common.im.contract.NoticeContract;
+import com.common.im.contract.SetRemarksContract;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.usercenter.helper.UserHelper;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 创建日期:2022/6/13 11:18
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class SetRemarksPresenter extends BasePresenter<SetRemarksContract.SetRemarksView> implements SetRemarksContract.Presenter {
+
+
+    public void updateGroupInfo(String groupId,String name){
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("name", name);
+            jsonObject.putOpt("id", groupId);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(IMApi.class).updateGroupInfo(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().updateGroupInfoSuccess();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+    }
+}

+ 121 - 4
rong_im/common_im_ui/src/main/java/com/common/im/ui/MessageFragment.java

@@ -1,18 +1,27 @@
 package com.common.im.ui;
 
+import android.content.Context;
 import android.graphics.Typeface;
+import android.net.Uri;
+import android.text.TextUtils;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.TextView;
 
+import com.alibaba.android.arouter.launcher.ARouter;
 import com.common.im.adapter.MessagePagerAdapter;
 import com.common.im.contract.MessageFragmentContract;
 import com.common.im.presenter.MessagePresenter;
-import com.common.im.ui.contact.ContactPersonListFragment;
+import com.common.im.ui.contact.ContactListTabFragment;
 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.router.RouterPath;
 import com.cooleshow.base.utils.Utils;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.usercenter.helper.UserHelper;
 import com.google.android.material.tabs.TabLayout;
 import com.google.android.material.tabs.TabLayoutMediator;
 
@@ -21,18 +30,33 @@ import java.util.ArrayList;
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 
+import io.rong.imkit.RongIM;
+import io.rong.imkit.config.ConversationListBehaviorListener;
 import io.rong.imkit.conversationlist.ConversationListFragment;
+import io.rong.imkit.conversationlist.model.BaseUiConversation;
+import io.rong.imkit.userinfo.UserDataProvider;
+import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.Group;
+import io.rong.imlib.model.UserInfo;
 
 /**
  * Author by pq, Date on 2022/5/6.
  */
-public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBinding, MessagePresenter> implements MessageFragmentContract.MessageFragmentView {
+public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBinding, MessagePresenter> implements MessageFragmentContract.MessageFragmentView, View.OnClickListener {
     public static final String[] titles = new String[]{"聊天", "联系人"};
     private ArrayList<Fragment> fragments = new ArrayList<>();
+    String localUserid = "";
 
     @Override
     protected void initView(View rootView) {
         Utils.setHeadView(mViewBinding.viewStatusBar, requireContext(), 0);
+        if ("com.cooleshow.student".equals(getContext().getPackageName())) {
+            mViewBinding.imCreateGroup.setVisibility(View.GONE);
+        }else{
+            mViewBinding.imCreateGroup.setVisibility(View.VISIBLE);
+            mViewBinding.imCreateGroup.setOnClickListener(this);
+        }
+        localUserid = UserHelper.getUserId();
         TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(mViewBinding.tabLayout, mViewBinding.viewPager, new TabLayoutMediator.TabConfigurationStrategy() {
             @Override
             public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
@@ -64,16 +88,101 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
             public void onTabReselected(TabLayout.Tab tab) {
             }
         });
+        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.setFriendNickname(UserHelper.getUserName());
+                    data.setFriendAvatar(UserHelper.getUserAvatar());
+                    onQueryFriendDetail(data);
+                } else {
+                    if (presenter != null) {
+                        presenter.queryFriendDetail(getContext(),userId);
+                    }
+
+                }
+                return null;
+            }
+
+        }, true);
+
+        RongIM.setGroupInfoProvider(new UserDataProvider.GroupInfoProvider() {
+            @Override
+            public Group getGroupInfo(String groupId) {
+                Log.e("asdfasdfasdfas", "groupId: =============="+groupId );
+                if (groupId.contains("S") || groupId.contains("DAYA") || groupId.contains("I")) {
+                    return null;
+                }
+                if (presenter != null) {
+                    presenter.queryGroupDetail(getContext(),groupId);
+                }
+
+                return null;
+            }
+        }, true);
+        RongIM.setConversationListBehaviorListener(new ConversationListBehaviorListener() {
+            public boolean onConversationPortraitClick(Context context, Conversation.ConversationType
+                    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;
+            }
+
+            @Override
+            public boolean onConversationClick(Context context, View view, BaseUiConversation conversation) {
+                if (null != presenter && TextUtils.isEmpty(conversation.mCore.getConversationTitle())) {
+                    if ("group".equals(conversation.mCore.getConversationType())) {
+                        presenter.queryGroupDetail(getContext(),conversation.mCore.getTargetId());
+                    } else {
+                        String userId = conversation.mCore.getTargetId();
+                        if (localUserid.equals(userId)) {
+                            RongIMUserInfo data = new RongIMUserInfo();
+                            data.setFriendId(userId);
+                            data.setFriendNickname(UserHelper.getUserName());
+                            data.setFriendAvatar(UserHelper.getUserAvatar());
+                            onQueryFriendDetail(data);
+                        } else {
+                            presenter.queryFriendDetail(getContext(),userId);
+
+                        }
+                    }
+                }
+                return false;
+            }
+        });
+
         ConversationListFragment conversationListFragment = new ConversationListFragment();
-        ContactPersonListFragment contactPersonListFragment = new ContactPersonListFragment();
+//        ContactPersonListFragment contactPersonListFragment = new ContactPersonListFragment();
+        ContactListTabFragment contactListTabFragment=new ContactListTabFragment();
+
         fragments.add(conversationListFragment);
-        fragments.add(contactPersonListFragment);
+        fragments.add(contactListTabFragment);
         MessagePagerAdapter messagePagerAdapter = new MessagePagerAdapter(this);
         messagePagerAdapter.setData(fragments);
         mViewBinding.viewPager.setAdapter(messagePagerAdapter);
         tabLayoutMediator.attach();
     }
 
+    @Override
+    public void onQueryFriendDetail(RongIMUserInfo data) {
+        if (data != null) {
+            RongIM.getInstance().refreshUserInfoCache(new UserInfo(data.getFriendId() + "", data.getFriendNickname(), Uri.parse(data.getFriendAvatar())));
+
+        }
+    }
+
+    @Override
+    public void onQueryGroupDetail(RongIMGroupInfo data) {
+
+    }
+
     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);
@@ -96,4 +205,12 @@ public class MessageFragment extends BaseMVPFragment<FragmentMessageLayoutBindin
     protected MessagePresenter createPresenter() {
         return new MessagePresenter();
     }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.im_create_group) {
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_CREATE_GROUP)
+                    .navigation();
+        }
+    }
 }

+ 237 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ChatGroupSettingActivity.java

@@ -0,0 +1,237 @@
+package com.common.im.ui.activity;
+
+import android.content.Intent;
+import android.text.TextUtils;
+import android.view.View;
+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;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.common.im.adapter.MessageSettingGroupMemberAdapter;
+import com.common.im.bean.GroupMemberBean;
+import com.common.im.bean.RongIMGroupInfo;
+import com.common.im.contract.ChatGroupSettingContract;
+import com.common.im_ui.R;
+import com.common.im.presenter.ChatGroupSettingPresenter;
+import com.common.im_ui.databinding.ActivityChatGroupSettingBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.GlideUtils;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.RongIM;
+import io.rong.imkit.userinfo.model.GroupUserInfo;
+import io.rong.imlib.model.Conversation;
+
+/**
+ * 创建日期:2022/6/11 14:29
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_GROUP_SETTING)
+public class ChatGroupSettingActivity extends BaseMVPActivity<ActivityChatGroupSettingBinding, ChatGroupSettingPresenter> implements ChatGroupSettingContract.ChatGroupSettingView, View.OnClickListener {
+    private final int REQUEST_GROUP_REMARKS_CODE = 100;
+    @Override
+    public void onClick(View view) {
+        if (view.getId() == R.id.ll_history_message) {
+            //查看历史消息内容
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_GROUP_SEARCH_HISTORY)
+                    .withString("targetId", targetId)
+                    .navigation();
+        } else if (view.getId() == R.id.tv_group_name_remarks) {
+            //设置群名称
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_GROUP_SET_REMARK)
+                    .withString("targetId", targetId)
+                    .withString("remarks", tv_group_name_remarks.getText().toString().trim())
+                    .navigation(this,REQUEST_GROUP_REMARKS_CODE);
+        } else if (view.getId() == R.id.tv_group_member_list) {
+            //查看联系人
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_GROUP_MEMBER)
+                    .withSerializable("list", (Serializable) data)
+                    .navigation();
+
+        } else if (view.getId() == R.id.tv_group_apply_count) {
+            //查看入群申请
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_GROUP_JOIN_APPLY)
+                    .withString("targetId", targetId)
+                    .navigation();
+        } else if (view.getId() == R.id.tv_feedback) {
+            //反馈
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_IM_APPEAL)
+                    .withString("targetId", targetId)
+                    .withString("name", name)
+                    .withString("type", "GROUP")
+                    .navigation();
+        } else if (view.getId() == R.id.tv_notice) {
+            //群公告
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_GROUP_NOTICE)
+                    .withString("targetId", targetId)
+                    .navigation();
+        } else if (view.getId() == R.id.btn_confirm) {
+            //发消息
+            finish();
+        }
+
+    }
+
+    private ImageView iv_portrait;
+    private TextView tv_group_name;
+    private TextView tv_class_num;
+    private TextView tv_group_member_list;
+    private RecyclerView recyclerView;
+    private TextView tv_group_apply_count;
+    private TextView tv_group_name_remarks;
+    private CheckBox cb_message;
+    List<GroupMemberBean> data = new ArrayList<>();
+    MessageSettingGroupMemberAdapter adapter;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "群设置");
+        iv_portrait = viewBinding.ivPortrait;
+        tv_group_name = viewBinding.tvGroupName;
+        tv_class_num = viewBinding.tvClassNum;
+        tv_group_member_list = viewBinding.tvGroupMemberList;
+        tv_group_member_list.setOnClickListener(this);
+        recyclerView = viewBinding.recyclerView;
+        tv_group_apply_count = viewBinding.tvGroupApplyCount;
+        tv_group_apply_count.setOnClickListener(this);
+        tv_group_name_remarks = viewBinding.tvGroupNameRemarks;
+        tv_group_name_remarks.setOnClickListener(this);
+        viewBinding.llHistoryMessage.setOnClickListener(this);
+        cb_message = viewBinding.cbMessage;
+        viewBinding.tvNotice.setOnClickListener(this);
+        viewBinding.tvFeedback.setOnClickListener(this);
+        viewBinding.btnConfirm.setOnClickListener(this);
+
+        LinearLayoutManager manager = new LinearLayoutManager(this);
+        manager.setOrientation(LinearLayoutManager.HORIZONTAL);
+        recyclerView.setLayoutManager(manager);
+        adapter = new MessageSettingGroupMemberAdapter(data);
+        recyclerView.setAdapter(adapter);
+        adapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                GroupMemberBean groupMemberBean = (GroupMemberBean) adapter.getItem(position);
+                RongIM.getInstance().startPrivateChat(ChatGroupSettingActivity.this, groupMemberBean.getUserId() + "", data.get(position).getNickname());
+
+            }
+        });
+
+    }
+
+    private String targetId;
+    private String name;
+
+    @Override
+    public void initData() {
+        super.initData();
+        targetId = getIntent().getStringExtra("targetId");
+        name = getIntent().getStringExtra("name");
+
+        presenter.conversationGet(Conversation.ConversationType.GROUP, targetId);
+
+        cb_message.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                if (buttonView.isPressed()) {
+                    if (isChecked) {
+                        presenter.conversationMute(Conversation.ConversationType.GROUP, targetId, Conversation.ConversationNotificationStatus.DO_NOT_DISTURB);
+                    } else {
+                        presenter.conversationGetUnmute(Conversation.ConversationType.GROUP, targetId, Conversation.ConversationNotificationStatus.NOTIFY);
+
+                    }
+                }
+            }
+        });
+        presenter.queryGroupDetail(this, targetId);
+        presenter.queryGroupMembers(this, targetId);
+    }
+
+    @Override
+    protected ActivityChatGroupSettingBinding getLayoutView() {
+        return ActivityChatGroupSettingBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ChatGroupSettingPresenter createPresenter() {
+        return new ChatGroupSettingPresenter();
+    }
+
+    @Override
+    public void onConversation(boolean b) {
+        cb_message.setChecked(b);
+    }
+
+    @Override
+    public void onGroupUsers(List<GroupMemberBean> data, String groupId) {
+        this.data.clear();
+        this.data.addAll(data);
+        tv_group_member_list.setText("查看全部" + data.size() + "名群成员");
+        for (int i = 0; i < data.size(); i++) {
+            try {
+                GroupMemberBean usersBean = data.get(i);
+                String id = usersBean.getUserId() + "";
+                String name = usersBean.getNickname();
+                String title = usersBean.getRoleType();
+                String nameStr = TextUtils.isEmpty(title) ? name : name + "(" + title + ")";
+                if (!TextUtils.isEmpty(id)) {
+                    RongIM.getInstance().refreshGroupUserInfoCache(new GroupUserInfo(groupId, id, nameStr));
+                }
+            } catch (Exception e) {
+            }
+
+        }
+    }
+
+    @Override
+    public void onQueryGroupDetail(RongIMGroupInfo data) {
+        if (null != data) {
+            if ("com.cooleshow.student".equals(getPackageName())) {
+                GlideUtils.INSTANCE.loadImage(this, data.getImg(), iv_portrait, R.drawable.rc_default_group_portrait_stu);
+            } else {
+                if (TextUtils.isEmpty(data.getType()) || (!data.getType().equals("VIP") && !data.getType().equals("COMM"))) {
+                    GlideUtils.INSTANCE.loadImage(this, data.getImg(), iv_portrait, R.drawable.ic_group_list_mussic_team_stu);
+                } else {
+                    GlideUtils.INSTANCE.loadImage(this, data.getImg(), iv_portrait, R.drawable.ic_group_list_vip);
+
+                }
+            }
+            if (!TextUtils.isEmpty(data.getMemo())) {
+                tv_class_num.setVisibility(View.VISIBLE);
+                tv_class_num.setText(data.getMemo());
+            } else {
+                tv_class_num.setVisibility(View.GONE);
+            }
+            tv_group_name.setText(data.getName());
+            tv_group_name_remarks.setText(data.getName());
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (resultCode==RESULT_OK){
+            if (requestCode==REQUEST_GROUP_REMARKS_CODE){
+                tv_group_name_remarks.setText(data.getStringExtra("remarks"));
+                tv_group_name.setText(data.getStringExtra("remarks"));
+            }
+        }
+    }
+}

+ 57 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/CreateGroupActivity.java

@@ -0,0 +1,57 @@
+package com.common.im.ui.activity;
+
+import android.text.TextUtils;
+import android.view.View;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.ActivityCreateGroupBinding;
+import com.common.im.contract.CreateGroupContract;
+import com.common.im.presenter.CreateGroupPresenter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+
+/**
+ * 创建日期:2022/6/10 17:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_CREATE_GROUP)
+public class CreateGroupActivity extends BaseMVPActivity<ActivityCreateGroupBinding, CreateGroupPresenter> implements CreateGroupContract.CreateGroupView, View.OnClickListener {
+    @Override
+    public void onClick(View view) {
+        if (view.getId() == R.id.tv_create) {
+            String groupName = viewBinding.etGroupName.getText().toString().trim();
+            if (TextUtils.isEmpty(groupName)){
+                ToastUtils.showShort("请输入粉丝群名称!");
+                return;
+            }
+            String introduction = viewBinding.etIntroduction.getText().toString().trim();
+            presenter.createGroup(groupName,introduction);
+        }
+    }
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "创建粉丝群");
+        viewBinding.tvCreate.setOnClickListener(this);
+    }
+
+    @Override
+    protected ActivityCreateGroupBinding getLayoutView() {
+        return ActivityCreateGroupBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected CreateGroupPresenter createPresenter() {
+        return new CreateGroupPresenter();
+    }
+
+    @Override
+    public void createImGroupSuccess() {
+        ToastUtils.showShort("创建成功");
+        finish();
+    }
+}

+ 125 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/GroupMemberActivity.java

@@ -0,0 +1,125 @@
+package com.common.im.ui.activity;
+
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.common.im.adapter.GroupMemberAdapter;
+import com.common.im.bean.GroupMemberBean;
+import com.common.im.contract.GroupMemberContract;
+import com.common.im.presenter.GroupMemberPresenter;
+import com.common.im_ui.databinding.ActivityGroupMemberBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.widgets.DensityUtil;
+import com.mcxtzhang.indexlib.IndexBar.widget.IndexBar;
+import com.mcxtzhang.indexlib.suspension.SuspensionDecoration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.RongIM;
+
+/**
+ * 创建日期:2022/6/13 15:25
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_GROUP_MEMBER)
+public class GroupMemberActivity extends BaseMVPActivity<ActivityGroupMemberBinding, GroupMemberPresenter> implements GroupMemberContract.GroupMemberView, View.OnClickListener {
+    @Override
+    public void onClick(View v) {
+
+    }
+
+    EditText etSearch;
+    ImageView ivSearch;
+    RecyclerView recyclerview;
+    IndexBar livLetters;
+    TextView tvHint;
+    private String search;
+    private LinearLayoutManager mManager;
+    private GroupMemberAdapter adapter;
+    private SuspensionDecoration mDecoration;
+    private List<GroupMemberBean> mDatas = new ArrayList<>();
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "群聊成员");
+        etSearch = viewBinding.etSearch;
+        ivSearch = viewBinding.ivSearch;
+        recyclerview = viewBinding.expendList;
+        livLetters = viewBinding.livLetters;
+        tvHint = viewBinding.tvHint;
+
+
+        recyclerview.setLayoutManager(mManager = new LinearLayoutManager(this));
+        RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
+        recyclerview.setRecycledViewPool(viewPool);
+        viewPool.setMaxRecycledViews(0, 100);
+
+        adapter = new GroupMemberAdapter(mDatas);
+        recyclerview.setAdapter(adapter);
+        mDecoration = new SuspensionDecoration(this, mDatas);
+        mDecoration.setColorTitleBg(getResources().getColor(com.cooleshow.base.R.color.color_f6f8f9));
+        mDecoration.setmTitleHeight(DensityUtil.dp2px(this, 30));
+        recyclerview.addItemDecoration(mDecoration);
+        livLetters.setmPressedShowTextView(tvHint)//设置HintTextView
+                .setNeedRealIndex(false)//设置需要真实的索引
+                .setmLayoutManager(mManager);//设置RecyclerView的LayoutManager
+        adapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                GroupMemberBean item = (GroupMemberBean) adapter.getItem(position);
+                RongIM.getInstance().startPrivateChat(GroupMemberActivity.this, item.getUserId() + "", item.getNickname());
+
+            }
+        });
+
+    }
+
+    @Override
+    protected ActivityGroupMemberBinding getLayoutView() {
+        return ActivityGroupMemberBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected GroupMemberPresenter createPresenter() {
+        return new GroupMemberPresenter();
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        List<GroupMemberBean> list = (List<GroupMemberBean>) getIntent().getSerializableExtra("list");
+        if (list == null) {
+            list = new ArrayList<>();
+        }
+        mDatas.clear();
+        if (list.size() > 0) {
+            for (int i = 0; i < list.size(); i++) {
+                if (null != list.get(i)) {
+                    mDatas.add(list.get(i));
+                }
+            }
+        }
+        try {
+
+            livLetters.setmSourceDatas(mDatas)//设置数据
+                    .invalidate();
+            mDecoration.setmDatas(mDatas);
+            adapter.notifyDataSetChanged();
+        } catch (Exception e) {
+
+        }
+    }
+}

+ 204 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/ImAppealActivity.java

@@ -0,0 +1,204 @@
+package com.common.im.ui.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Parcelable;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.common.im.adapter.AddPhotoListAdapter;
+import com.common.im.contract.ImAppealContract;
+import com.common.im.presenter.ImAppealPresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.ActivityImAppealBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.utils.helper.upload.UploadHelper;
+import com.daya.live_teaching.utils.GlideEngine;
+import com.luck.picture.lib.PictureSelector;
+import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/13 13:54
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_IM_APPEAL)
+public class ImAppealActivity extends BaseMVPActivity<ActivityImAppealBinding, ImAppealPresenter> implements ImAppealContract.ImAppealView {
+
+
+    private EditText et_content;
+    private Button btn_commit;
+    private RecyclerView recyclerView;
+    private int maxSelectNum = 3;
+    private AddPhotoListAdapter addPhotoListAdapter;
+    List<LocalMedia> selectList = new ArrayList<>();
+    List<String> urlList = new ArrayList<>();
+    private String targetId;
+    private String name;
+    private String type;
+    private String memo;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "投诉");
+
+        Intent intent = getIntent();
+        targetId = intent.getStringExtra("targetId");
+        name = intent.getStringExtra("name");
+        type = intent.getStringExtra("type");
+        et_content=viewBinding.etContent;
+        btn_commit=viewBinding.btnCommit;
+        recyclerView=viewBinding.recyclerView;
+        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);
+        recyclerView.setLayoutManager(gridLayoutManager);
+        addNewEmpty();
+        addPhotoListAdapter = new AddPhotoListAdapter(selectList);
+        recyclerView.setAdapter(addPhotoListAdapter);
+        addPhotoListAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                LocalMedia item = (LocalMedia) adapter.getItem(position);
+                if (item.getPath().equals("123")){
+                    PictureSelector.create(ImAppealActivity.this)
+                            .openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
+                            .loadImageEngine(GlideEngine.createGlideEngine())
+                            .theme(com.cooleshow.base.R.style.picture_daya_style)// 主题样式设置 具体参考 values/styles   用法:R.style.picture.white.style
+                            .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
+                            .maxSelectNum(maxSelectNum+1 - selectList.size())
+                            .compress(true)// 是否压缩 true or false
+                            .forResult(PictureConfig.CHOOSE_REQUEST);
+                }else{
+                    ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_PHOTO_PREVIEW)
+                            .withInt("position", position)
+                            .withParcelableArrayList("list", (ArrayList<? extends Parcelable>)selectList)
+                            .navigation(ImAppealActivity.this,100);
+                }
+            }
+        });
+        btn_commit.setOnClickListener(view -> {
+            if (null == selectList || selectList.size() <= 0) {
+                ToastUtils.showShort("请选择聊天截图");
+                return;
+            }
+            memo = et_content.getText().toString().trim();
+            if (TextUtils.isEmpty(memo)) {
+                ToastUtils.showShort("请输入投诉的理由");
+                return;
+            }
+            for (int i = 0; i < selectList.size(); i++) {
+                String compressPath = selectList.get(i).getCompressPath();
+                if (!TextUtils.isEmpty(compressPath)) {
+                    upLoadVideo(this,compressPath);
+                }
+            }
+        });
+    }
+
+    private void addNewEmpty(){
+        LocalMedia localMedia=new LocalMedia();
+        localMedia.setPath("123");
+        selectList.add(localMedia);
+    }
+
+
+    public void upLoadVideo(Activity activity, String filePath) {
+        UploadHelper uploadHelper = new UploadHelper(activity);
+        uploadHelper.uploadFile(new File(filePath));
+        uploadHelper.setUpLoadCallBack(new UploadHelper.UpLoadCallBack() {
+            @Override
+            public void onSuccess(String url) {
+                urlList.add(url);
+                if (urlList.size() == selectList.size()) {
+                    String attachment = "";
+                    for (int i = 0; i < urlList.size(); i++) {
+                        attachment += ("," + urlList.get(i));
+                    }
+                    urlList.clear();
+                    String attachments = attachment.substring(1);
+
+                    presenter.sysImComplaint(memo,targetId,type,attachments);
+                }
+            }
+
+            @Override
+            public void onFailure() {
+
+            }
+        });
+    }
+
+
+
+    @Override
+    protected ActivityImAppealBinding getLayoutView() {
+        return ActivityImAppealBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ImAppealPresenter createPresenter() {
+        return new ImAppealPresenter();
+    }
+
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (resultCode == RESULT_OK) {
+            switch (requestCode) {
+                case PictureConfig.CHOOSE_REQUEST:
+                    // 图片、视频、音频选择结果回调
+                    List<LocalMedia> list = PictureSelector.obtainMultipleResult(data);
+                    selectList.addAll(0,list);
+                    if (selectList.size()>maxSelectNum){
+                        selectList.remove(maxSelectNum);
+                    }
+                    addPhotoListAdapter.notifyDataSetChanged();
+
+                    // 例如 LocalMedia 里面返回三种path
+                    // 1.media.getPath(); 为原图path
+                    // 2.media.getCutPath();为裁剪后path,需判断media.isCut();是否为true  注意:音视频除外
+                    // 3.media.getCompressPath();为压缩后path,需判断media.isCompressed();是否为true  注意:音视频除外
+                    // 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的
+                    //                    GlideImageLoaderUtils.getInstance().loadCircleImage(this,selectList.get(0).getCutPath(),ivPortrait);
+
+                    break;
+                case 100:
+                    // 图片、视频、音频选择结果回调
+                    List<LocalMedia> list1 = data.getParcelableArrayListExtra("list");
+                    selectList.clear();
+                    selectList.addAll(list1);
+                    if (selectList.size()<maxSelectNum){
+                        addNewEmpty();
+                    }
+                    addPhotoListAdapter.notifyDataSetChanged();
+                    break;
+
+            }
+        }
+    }
+
+    @Override
+    public void sysImComplaintSuccess() {
+        ToastUtils.showShort("已收到您的投诉,我们会认真审核并处理");
+        finish();
+    }
+}

+ 136 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/JoinGroupApplyActivity.java

@@ -0,0 +1,136 @@
+package com.common.im.ui.activity;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.common.im.adapter.JoinGroupApplyAdapter;
+import com.common.im.bean.GroupApplyBean;
+import com.common.im.contract.JoinGroupApplyContract;
+import com.common.im.presenter.JoinGroupApplyPresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.ActivityJoinGroupApplyBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/13 16:44
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_GROUP_JOIN_APPLY)
+public class JoinGroupApplyActivity extends BaseMVPActivity<ActivityJoinGroupApplyBinding, JoinGroupApplyPresenter> implements JoinGroupApplyContract.JoinGroupApplyView, View.OnClickListener {
+
+    private JoinGroupApplyAdapter joinGroupApplyAdapter;
+    private List<GroupApplyBean> dataList = new ArrayList<>();
+    private String targetId;
+    private LinearLayout ll_bottom;
+
+    @Override
+    protected void initView() {
+        targetId = getIntent().getStringExtra("targetId");
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "入群申请");
+        viewBinding.toolbarInclude.tvRightText.setText("批量操作");
+        viewBinding.toolbarInclude.tvRightText.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRightText.setTextColor(getResources().getColor(com.cooleshow.base.R.color.common_black));
+        viewBinding.toolbarInclude.tvRightText.setOnClickListener(this);
+        ll_bottom = viewBinding.llBottom;
+        viewBinding.tvRefuse.setOnClickListener(this);
+        viewBinding.tvPass.setOnClickListener(this);
+        RecyclerView rvAddress = viewBinding.recyclerView;
+        LinearLayoutManager manager = new LinearLayoutManager(this);
+        rvAddress.setLayoutManager(manager);
+        joinGroupApplyAdapter = new JoinGroupApplyAdapter(dataList);
+        rvAddress.setAdapter(joinGroupApplyAdapter);
+        joinGroupApplyAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                if (joinGroupApplyAdapter.isSelect()) {
+                    GroupApplyBean item = (GroupApplyBean) adapter.getItem(position);
+                    item.setSelect(!item.isSelect());
+                    joinGroupApplyAdapter.notifyDataSetChanged();
+                }
+            }
+        });
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        presenter.groupApplyList(targetId);
+    }
+
+    @Override
+    protected ActivityJoinGroupApplyBinding getLayoutView() {
+        return ActivityJoinGroupApplyBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected JoinGroupApplyPresenter createPresenter() {
+        return new JoinGroupApplyPresenter();
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == com.cooleshow.base.R.id.tv_right_text) {
+            if (viewBinding.toolbarInclude.tvRightText.getText().toString().equals("批量操作")) {
+                viewBinding.toolbarInclude.tvRightText.setText("完成");
+                joinGroupApplyAdapter.setSelect(true);
+                ll_bottom.setVisibility(View.VISIBLE);
+            } else {
+                viewBinding.toolbarInclude.tvRightText.setText("批量操作");
+                joinGroupApplyAdapter.setSelect(false);
+                ll_bottom.setVisibility(View.GONE);
+            }
+            joinGroupApplyAdapter.notifyDataSetChanged();
+        } else if (v.getId() == R.id.tv_refuse) {
+            //拒绝
+            String auditIds = "";
+            for (GroupApplyBean groupApplyBean : dataList) {
+                if (groupApplyBean.isSelect()) {
+                    auditIds = auditIds + groupApplyBean.getId() + ",";
+                }
+            }
+            if (!TextUtils.isEmpty(auditIds)){
+                auditIds=auditIds.substring(0,auditIds.length()-1);
+                presenter.doGroupApply(auditIds,"REJECT",targetId);
+            }
+
+        } else if (v.getId() == R.id.tv_pass) {
+            //同意
+            String auditIds = "";
+            for (GroupApplyBean groupApplyBean : dataList) {
+                if (groupApplyBean.isSelect()) {
+                    auditIds = auditIds + groupApplyBean.getId() + ",";
+                }
+            }
+            if (!TextUtils.isEmpty(auditIds)){
+                auditIds=auditIds.substring(0,auditIds.length()-1);
+                presenter.doGroupApply(auditIds,"OPEN",targetId);
+            }
+        }
+    }
+
+    @Override
+    public void groupApplyListSuccess(List<GroupApplyBean> data) {
+        dataList.clear();
+        dataList.addAll(data);
+        joinGroupApplyAdapter.notifyDataSetChanged();
+    }
+
+    @Override
+    public void doGroupApplySuccess() {
+        presenter.groupApplyList(targetId);
+    }
+}

+ 237 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/NoticeActivity.java

@@ -0,0 +1,237 @@
+package com.common.im.ui.activity;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.common.im.adapter.NoticeListAdapter;
+import com.common.im.adapter.NoticePopuListAdapter;
+import com.common.im.bean.GroupNoticeBean;
+import com.common.im.contract.NoticeContract;
+import com.common.im.presenter.NoticePresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.ActivityNoticeBinding;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.PopupUtil;
+import com.cooleshow.base.widgets.DensityUtil;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.utils.StatusBarUtil;
+
+/**
+ * 创建日期:2022/6/11 17:52
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_GROUP_NOTICE)
+public class NoticeActivity extends BaseMVPActivity<ActivityNoticeBinding, NoticePresenter> implements NoticeContract.NoticeView, View.OnClickListener {
+
+    private int currentPage;
+
+    private String targetId = "";
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.floatbutton) {
+            ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_GROUP_NOTICE_EDIT)
+                    .withString("targetId", targetId)
+                    .navigation();
+        }
+    }
+
+    RecyclerView recyclerView;
+    ImageView floatbutton;
+
+    List<GroupNoticeBean.RowsBean> noticeData = new ArrayList<>();
+    private NoticeListAdapter mAdapter;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "群公告");
+        targetId = getIntent().getStringExtra("targetId");
+        recyclerView = viewBinding.recyclerView;
+        floatbutton = viewBinding.floatbutton;
+        floatbutton.setOnClickListener(this);
+        viewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                queryData();
+            }
+        });
+
+        LinearLayoutManager manager = new LinearLayoutManager(this);
+        recyclerView.setLayoutManager(manager);
+        mAdapter = new NoticeListAdapter(noticeData);
+        recyclerView.setAdapter(mAdapter);
+
+        mAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    queryData();
+                } else {
+                    mAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+        mAdapter.setmSettingClickListener(new NoticeListAdapter.SettingClickListener() {
+            @Override
+            public void onSettingClick(View v, GroupNoticeBean.RowsBean bean) {
+                List<String> popuList = new ArrayList<>();
+                popuList.clear();
+                popuList.add("编辑公告");
+                if (bean.topFlag) {
+                    popuList.add("取消置顶");
+                } else {
+                    popuList.add("置顶");
+                }
+                initPopu(popuList, v, bean);
+            }
+        });
+
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+
+    @Override
+    public void initData() {
+        super.initData();
+
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        currentPage = 1;
+        queryData();
+    }
+
+    private void initPopu(List<String> popuList, View view, GroupNoticeBean.RowsBean bean) {
+        PopupUtil.showInDropWrapNObg(this, R.layout.notice_on_popu, view,
+                DensityUtil.dp2px(this, 20), DensityUtil.dp2px(this, 20), (view1, popupWindow) -> {
+                    RecyclerView recyclerView = view1.findViewById(R.id.recyclerView);
+                    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(NoticeActivity.this);
+                    recyclerView.setLayoutManager(linearLayoutManager);
+                    NoticePopuListAdapter adapter = new NoticePopuListAdapter(popuList);
+                    recyclerView.setAdapter(adapter);
+                    adapter.setOnItemClickListener(new OnItemClickListener() {
+                        @Override
+                        public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                            if (position == 0) {
+                                ARouter.getInstance().build(RouterPath.ChatCenter.CHAT_GROUP_NOTICE_EDIT)
+                                        .withString("targetId", targetId)
+                                        .withString("title", bean.title)
+                                        .withString("notice", bean.content)
+                                        .withBoolean("isTop", bean.topFlag)
+                                        .withLong("id", bean.id)
+                                        .navigation();
+                            }
+                            if (position == 1) {
+                                if (popuList.get(position).equals("置顶")) {
+                                    presenter.noticeUpdate(bean.id, targetId, bean.title, bean.content, true);
+                                } else {
+                                    presenter.noticeUpdate(bean.id, targetId, bean.title, bean.content, false);
+                                }
+                            }
+                            popupWindow.dismiss();
+                        }
+                    });
+
+
+                });
+    }
+
+
+    private boolean hasNext = true;
+
+    private void queryData() {
+        //根据默认筛选条件查询
+        presenter.queryGroupNotice(targetId, currentPage);
+    }
+
+    @Override
+    protected ActivityNoticeBinding getLayoutView() {
+        return ActivityNoticeBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected NoticePresenter createPresenter() {
+        return new NoticePresenter();
+    }
+
+    @Override
+    public void queryGroupNoticeSuccess(int page, GroupNoticeBean dataList) {
+        if (dataList != null) {
+            if (page == 1) {
+                //第一页
+                viewBinding.refreshLayout.finishRefresh();
+                if (mAdapter != null) {
+                    mAdapter.getData().clear();
+                    mAdapter.notifyDataSetChanged();
+                    if (dataList.rows != null && dataList.rows.size() > 0) {
+                        checkHasNext(dataList.rows.size());
+                        mAdapter.setNewInstance(dataList.rows);
+                    }
+                }
+            } else {
+                //加载更多
+                if (mAdapter != null) {
+                    if (dataList.rows != null && dataList.rows.size() > 0) {
+                        mAdapter.getLoadMoreModule().loadMoreComplete();
+                        checkHasNext(dataList.rows.size());
+                        mAdapter.addData(dataList.rows);
+                    } else {
+                        mAdapter.getLoadMoreModule().loadMoreEnd();
+                    }
+                }
+            }
+        }
+    }
+
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+    @Override
+    public void queryGroupNoticeError(int page) {
+        if (page == 1) {
+            viewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mAdapter != null) {
+                currentPage--;
+                mAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+
+    @Override
+    public void updateGroupNoticeSuccess() {
+        currentPage = 1;
+        queryData();
+    }
+}

+ 99 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/NoticeEditActivity.java

@@ -0,0 +1,99 @@
+package com.common.im.ui.activity;
+
+import android.content.Intent;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.common.im.contract.NoticeEditContract;
+import com.common.im.presenter.NoticeEditPresenter;
+import com.common.im_ui.databinding.ActivityNoticeEditBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+
+/**
+ * 创建日期:2022/6/11 19:25
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_GROUP_NOTICE_EDIT)
+public class NoticeEditActivity extends BaseMVPActivity<ActivityNoticeEditBinding, NoticeEditPresenter> implements NoticeEditContract.NoticeEditView, View.OnClickListener {
+    @Override
+    public void onClick(View v) {
+
+    }
+
+    EditText etNotice;
+    EditText etTitle;
+    CheckBox cbRoof;
+    Button btnCommit;
+    private String targetId;
+    private String title;
+    private String notice;
+    private boolean isTop;
+    private long id;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "群公告编辑");
+        etNotice = viewBinding.etNotice;
+        etTitle = viewBinding.etTitle;
+        cbRoof = viewBinding.cbRoof;
+        btnCommit = viewBinding.btnCommit;
+
+
+        Intent intent = getIntent();
+        targetId = intent.getStringExtra("targetId");
+        title = intent.getStringExtra("title");
+        notice = intent.getStringExtra("notice");
+        isTop = intent.getBooleanExtra("isTop", false);
+        id = intent.getLongExtra("id", 0);
+        cbRoof.setChecked(isTop);
+        etTitle.setText(title);
+        etNotice.setText(notice);
+        btnCommit.setOnClickListener(v -> {
+            String title = etTitle.getText().toString().trim();
+            if (TextUtils.isEmpty(title)) {
+                ToastUtils.showShort("请输入标题");
+                return;
+            }
+            String notice = etNotice.getText().toString().trim();
+            if (TextUtils.isEmpty(notice)) {
+                ToastUtils.showShort("请填写群公告,1-255字");
+                return;
+            }
+            if (TextUtils.isEmpty(NoticeEditActivity.this.title)) {
+                presenter.createGroupNotice(title,notice,targetId, cbRoof.isChecked() );
+            } else {
+                presenter.noticeUpdate(id, targetId, title, notice, cbRoof.isChecked());
+            }
+        });
+    }
+
+    @Override
+    protected ActivityNoticeEditBinding getLayoutView() {
+        return ActivityNoticeEditBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected NoticeEditPresenter createPresenter() {
+        return new NoticeEditPresenter();
+    }
+
+    @Override
+    public void updateGroupNoticeSuccess() {
+        ToastUtils.showShort("发布成功");
+        finish();
+    }
+
+    @Override
+    public void createGroupNoticeSuccess() {
+        ToastUtils.showShort("发布成功");
+        finish();
+    }
+}

+ 189 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/PhotoPreviewActivity.java

@@ -0,0 +1,189 @@
+package com.common.im.ui.activity;
+
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Parcelable;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.viewpager.widget.PagerAdapter;
+import androidx.viewpager.widget.ViewPager;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.common.im.contract.ImAppealContract;
+import com.common.im.contract.PhotoPreviewContract;
+import com.common.im.presenter.ImAppealPresenter;
+import com.common.im.presenter.PhotoPreviewPresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.ActivityImAppealBinding;
+import com.common.im_ui.databinding.ActivityPhotoPreviewBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.GlideUtils;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.photoview.PhotoView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/13 14:30
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_PHOTO_PREVIEW)
+public class PhotoPreviewActivity extends BaseMVPActivity<ActivityPhotoPreviewBinding, PhotoPreviewPresenter> implements PhotoPreviewContract.PhotoPreviewView, View.OnClickListener {
+    @Override
+    public void onClick(View v) {
+
+    }
+    private TextView tv_title;
+    ViewPager viewpager;
+    private boolean isRemove;
+    private List<LocalMedia> selectList;
+    private int selectedPosition = 0;
+    private PhotoPreviewListAdapter adapter;
+
+    @Override
+    protected void initView() {
+        selectList = getIntent().getParcelableArrayListExtra("list");
+        selectedPosition = getIntent().getIntExtra("position", 0);
+        isRemove = getIntent().getBooleanExtra("isRemove", true);
+        if (selectList == null) {
+            selectList = new ArrayList<>();
+            selectedPosition = 0;
+        }
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "");
+        tv_title= viewBinding.toolbarInclude.title;
+        tv_title.setText((selectedPosition + 1) + "/" + selectList.size());
+        adapter = new PhotoPreviewListAdapter();
+        viewpager=viewBinding.viewpager;
+        viewpager.setAdapter(adapter);
+        viewpager.setCurrentItem(selectedPosition);
+        viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                selectedPosition = position;
+                tv_title.setText((position + 1) + "/" + selectList.size());
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+
+            }
+        });
+
+        if (isRemove) {
+            viewBinding.toolbarInclude.tvRight.setVisibility(View.VISIBLE);
+            viewBinding.toolbarInclude.tvRight.setBackgroundResource(com.cooleshow.base.R.drawable.ic_delete);
+            viewBinding.toolbarInclude.tvRight.setOnClickListener(view -> {
+                if (selectList.size() > 0) {
+                    if (selectedPosition > selectList.size() - 1) {
+                        selectedPosition -= 1;
+                    }
+                    selectList.remove(selectedPosition);
+                    if (selectList.size() == 0) {
+                        initResult();
+                        return;
+                    }
+                    adapter = null;
+                    adapter = new PhotoPreviewListAdapter();
+                    viewpager.setAdapter(adapter);
+                    if (selectedPosition == selectList.size()) {
+                        viewpager.setCurrentItem(0);
+                        tv_title.setText("1/" + selectList.size());
+                    } else {
+                        viewpager.setCurrentItem(selectedPosition);
+                    }
+                    if (selectedPosition == 0) {
+                        tv_title.setText("1/" + selectList.size());
+                    }
+
+                }
+            });
+        }
+    }
+
+    @Override
+    protected ActivityPhotoPreviewBinding getLayoutView() {
+        return ActivityPhotoPreviewBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected PhotoPreviewPresenter createPresenter() {
+        return new PhotoPreviewPresenter();
+    }
+
+    private void initResult() {
+        Intent intent = new Intent();
+        intent.putParcelableArrayListExtra("list", (ArrayList<? extends Parcelable>) selectList);
+        setResult(RESULT_OK, intent);
+        finish();
+    }
+    /**
+     * 需要拦截press的事件
+     *
+     * @param keyCode
+     * @param event
+     * @return
+     */
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            initResult();
+            return true;
+        } else {
+            return super.onKeyDown(keyCode, event);
+        }
+
+    }
+
+    public class PhotoPreviewListAdapter extends PagerAdapter {
+
+        @Override
+        public int getCount() {
+            return selectList.size();
+        }
+
+        @Override
+        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
+            return view == object;
+        }
+
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            View inflater = LayoutInflater.from(PhotoPreviewActivity.this).inflate(R.layout.photo_preview_list_item, null);
+            PhotoView ivIcon = inflater.findViewById(R.id.iv_icon);
+            GlideUtils.INSTANCE.loadImage(PhotoPreviewActivity.this,selectList.get(position).getPath(),ivIcon);
+            container.addView(inflater);
+            return inflater;
+
+
+        }
+
+        @Override
+        public void destroyItem(ViewGroup container, int position, Object object) {
+            container.removeView((View) object);
+        }
+
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        adapter = new PhotoPreviewListAdapter();
+        viewpager.setAdapter(adapter);
+    }
+
+
+}

+ 285 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/SearchHistoryMessageActivity.java

@@ -0,0 +1,285 @@
+package com.common.im.ui.activity;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.text.Editable;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.text.style.ForegroundColorSpan;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.common.im.adapter.MessageSearchAdapter;
+import com.common.im.contract.SearchHistoryMessageContract;
+import com.common.im.presenter.SearchHistoryMessagePresenter;
+import com.common.im_ui.databinding.ActivitySearchHistoryMessageBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.SoftKeyboardUtil;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import io.rong.imkit.RongIM;
+import io.rong.imkit.userinfo.RongUserInfoManager;
+import io.rong.imkit.utils.StatusBarUtil;
+import io.rong.imlib.RongIMClient;
+import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.Group;
+import io.rong.imlib.model.Message;
+import io.rong.imlib.model.SearchConversationResult;
+import io.rong.imlib.model.UserInfo;
+
+/**
+ * 创建日期:2022/6/11 16:02
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_GROUP_SEARCH_HISTORY)
+public class SearchHistoryMessageActivity extends BaseMVPActivity<ActivitySearchHistoryMessageBinding, SearchHistoryMessagePresenter> implements SearchHistoryMessageContract.SearchHistoryMessageView, TextWatcher {
+
+
+    private EditText etSearch;
+    private ImageView ivSearch;
+    private TextView tvAction;
+    private RecyclerView recyclerView;
+    private TextView tvEmpty;
+
+    private MessageSearchAdapter adapter;
+    private List<Message> data = new ArrayList<>();
+    private List<Conversation> conversations = new ArrayList<>();
+    @Override
+    protected void initView() {
+        etSearch = viewBinding.etSearch;
+        ivSearch = viewBinding.ivSearch;
+        tvAction = viewBinding.tvAction;
+        recyclerView = viewBinding.recyclerView;
+        tvEmpty = viewBinding.tvEmptyView;
+
+        etSearch.addTextChangedListener(this);
+        ivSearch.setOnClickListener(view -> {
+            searchMessage(targetId, Conversation.ConversationType.GROUP, etSearch.getText().toString().trim());
+        });
+        tvAction.setOnClickListener(view -> {
+            SoftKeyboardUtil.hideSoftKeyboard(this);
+            finish();
+        });
+
+
+
+        adapter = new MessageSearchAdapter(data);
+        recyclerView.setLayoutManager(new LinearLayoutManager(this));
+        recyclerView.setAdapter(adapter);
+        if (TextUtils.isEmpty(targetId)) {
+            RongIM.getInstance().getConversationList(new RongIMClient.ResultCallback<List<Conversation>>() {
+                @Override
+                public void onSuccess(List<Conversation> conversations) {
+                    if (conversations != null && conversations.size() > 0) {
+                        SearchHistoryMessageActivity.this.conversations.addAll(conversations);
+                    }
+                }
+
+                @Override
+                public void onError(RongIMClient.ErrorCode errorCode) {
+                }
+
+            }, Conversation.ConversationType.GROUP, Conversation.ConversationType.PRIVATE);
+
+        }
+        adapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                Message message = (Message) adapter.getItem(position);
+                if (message != null) {
+                    String name = "";
+                    if (Conversation.ConversationType.GROUP == message.getConversationType()) {
+                        Group groupInfo = RongUserInfoManager.getInstance().getGroupInfo(message.getTargetId());
+                        if (groupInfo != null) {
+                            name = groupInfo.getName();
+                        }
+                    } else {
+                        UserInfo userInfo = RongUserInfoManager.getInstance().getUserInfo(message.getSenderUserId());
+                        if (userInfo != null) {
+                            name = userInfo.getName();
+                        }
+                    }
+
+                    RongIM.getInstance().startConversation(SearchHistoryMessageActivity.this,
+                            message.getConversationType(),
+                            message.getTargetId(), name,
+                            message.getSentTime());
+                }
+            }
+        });
+
+
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        StatusBarUtil.setStatusBarDarkTheme(this, true);
+    }
+
+    private String targetId;
+    @Override
+    public void initData() {
+        super.initData();
+        targetId = getIntent().getStringExtra("targetId");
+
+
+    }
+    public void searchMessage(String targetId, Conversation.ConversationType
+            conversationType, String match) {
+        data.clear();
+        if (TextUtils.isEmpty(targetId)) {
+            for (Conversation conversation : conversations) {
+                searchIMClientMessage(conversation.getTargetId(), conversation.getConversationType(), match);
+            }
+        }
+        searchIMClientMessage(targetId, conversationType, match);
+    }
+
+    @Override
+    protected ActivitySearchHistoryMessageBinding getLayoutView() {
+        return ActivitySearchHistoryMessageBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected SearchHistoryMessagePresenter createPresenter() {
+        return new SearchHistoryMessagePresenter();
+    }
+
+    private void searchIMClientMessage(String targetId, Conversation.ConversationType
+            conversationType, String match) {
+        RongIMClient.getInstance().searchMessages(conversationType,
+                targetId, match, 0, 0, new RongIMClient.ResultCallback<List<Message>>() {
+
+                    @Override
+                    public void onSuccess(List<Message> messages) {
+                        Iterator<Message> it = messages.iterator();
+                        while(it.hasNext()){
+                            Message conversation = it.next();
+                            if (conversation.getTargetId().contains("S") || conversation.getTargetId().contains("DAYA") || conversation.getTargetId().contains("I")) {
+                                it.remove();
+                            }
+                        }
+                        updateData(messages, match);
+                    }
+
+                    @Override
+                    public void onError(RongIMClient.ErrorCode errorCode) {
+                        updateData(new ArrayList<>(), match);
+                    }
+                });
+    }
+
+    public void updateData(List<Message> data, String search) {
+        if (data != null && data.size() > 0) {
+            this.data.addAll(data);
+        }
+        if (this.data.size() == 0) {
+            tvEmpty.setVisibility(View.VISIBLE);
+            String empty = String.format("没有搜到%s相关的信息", search);
+            int start = empty.indexOf(search);
+            tvEmpty.setText(getSpannable(empty, start, start + search.length()));
+            recyclerView.setVisibility(View.GONE);
+        } else {
+            tvEmpty.setVisibility(View.GONE);
+            recyclerView.setVisibility(View.VISIBLE);
+            if (adapter != null) {
+                adapter.setSearch(search);
+                adapter.notifyDataSetChanged();
+            }
+        }
+    }
+
+    public SpannableStringBuilder getSpannable(String target, int start, int end) {
+        SpannableStringBuilder spannableStringBuilder;
+        if (TextUtils.isEmpty(target)) {
+            spannableStringBuilder = new SpannableStringBuilder("");
+        } else {
+            spannableStringBuilder = new SpannableStringBuilder(target);
+        }
+
+        spannableStringBuilder.setSpan(new ForegroundColorSpan(getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa)), start, end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+        return spannableStringBuilder;
+    }
+
+
+    public void search(String search) {
+        if (TextUtils.isEmpty(search)) {
+
+            clear();
+            recyclerView.setVisibility(View.GONE);
+            tvEmpty.setVisibility(View.GONE);
+        } else {
+            searchMessage(targetId, Conversation.ConversationType.GROUP, search);
+        }
+    }
+
+    public void clear() {
+        this.data.clear();
+        adapter.setSearch("");
+        adapter.notifyDataSetChanged();
+    }
+
+    /**
+     * 搜索会话
+     *
+     * @param match
+     */
+    public void searchConversation(String match) {
+        RongIMClient.getInstance().searchConversations(match,
+                new Conversation.ConversationType[]{Conversation.ConversationType.PRIVATE, Conversation.ConversationType.GROUP},
+                new String[]{"RC:TxtMsg", "RC:ImgTextMsg", "RC:FileMsg"}, new RongIMClient.ResultCallback<List<SearchConversationResult>>() {
+
+                    @Override
+                    public void onSuccess(List<SearchConversationResult> searchConversationResults) {
+                    }
+
+                    @Override
+                    public void onError(RongIMClient.ErrorCode errorCode) {
+                    }
+                });
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+    }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+    }
+
+    @Override
+    public void afterTextChanged(Editable editable) {
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                String search = editable.toString();
+                if (TextUtils.isEmpty(search)) {
+                    clear();
+                } else {
+                    search(search);
+                }
+            }
+        }, 300);
+    }
+}

+ 246 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/SelectScoreChatActivity.java

@@ -0,0 +1,246 @@
+package com.common.im.ui.activity;
+
+import android.util.Base64;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.chad.library.adapter.base.listener.OnLoadMoreListener;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.ActivitySelectScoreChatBinding;
+import com.common.im.bean.MusicSheetListBean;
+import com.cooleshow.base.constanst.Constants;
+import com.common.im.contract.SelectScoreChatContract;
+import com.common.im.presenter.SelectScoreChatPresenter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.common.im.adapter.MineScoreAdapter;
+import com.cooleshow.base.utils.ToastUtils;
+import com.rong.io.live.manager.RCChatRoomMessageManager;
+import com.scwang.smart.refresh.layout.SmartRefreshLayout;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.RongIM;
+import io.rong.imkit.widget.RCChatShareMusicMessage;
+import io.rong.imlib.IRongCallback;
+import io.rong.imlib.MessageTag;
+import io.rong.imlib.RongIMClient;
+import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.Message;
+import io.rong.message.TextMessage;
+
+/**
+ * 创建日期:2022/6/10 15:28
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_SELECT_SCORE)
+public class SelectScoreChatActivity extends BaseMVPActivity<ActivitySelectScoreChatBinding, SelectScoreChatPresenter> implements SelectScoreChatContract.SelectScoreChatView, View.OnClickListener {
+
+    @Override
+    public void onClick(View view) {
+        if (view.getId() == R.id.tv_search) {
+            search = viewBinding.etTargetName.getText().toString().trim();
+            currentPage = 1;
+            queryScore(true);
+        } else if (view.getId() == com.cooleshow.base.R.id.tv_right_text) {
+            //发送曲谱到聊天室
+            for (MusicSheetListBean.RowsBean rowsBean : dataList) {
+                if (rowsBean.isSelect) {
+                    sendMessage(rowsBean);
+                    break;
+                }
+            }
+
+            finish();
+        }
+    }
+
+    private SmartRefreshLayout refreshLayout;
+    private RecyclerView recyclerView;
+    private MineScoreAdapter mineScoreAdapter;
+    List<MusicSheetListBean.RowsBean> dataList = new ArrayList<>();
+    private String targetId = "";
+
+    @Override
+    protected void initView() {
+        targetId = getIntent().getStringExtra("targetId");
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "曲谱");
+        viewBinding.tvSearch.setOnClickListener(this);
+        viewBinding.toolbarInclude.tvRightText.setText("确定");
+        viewBinding.toolbarInclude.tvRightText.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRightText.setOnClickListener(this);
+        viewBinding.toolbarInclude.tvRightText.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        refreshLayout = viewBinding.refreshLayout;
+        recyclerView = viewBinding.recyclerView;
+        refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                currentPage = 1;
+                queryScore(true);
+            }
+        });
+
+        mineScoreAdapter = new MineScoreAdapter(dataList);
+//        mAdapter.getLoadMoreModule().setEnableLoadMoreIfNotFullPage(false);
+        mineScoreAdapter.getLoadMoreModule().setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore() {
+                //上拉加载
+                if (hasNext) {
+                    currentPage++;
+                    queryScore(false);
+                } else {
+                    mineScoreAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        });
+        recyclerView.setLayoutManager(new LinearLayoutManager(this));
+        recyclerView.setAdapter(mineScoreAdapter);
+       /* viewBinding.etTargetName.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+            @Override
+            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+                if (actionId == EditorInfo.IME_ACTION_SEARCH || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
+                    //点击搜索要做的操作
+                    search = viewBinding.etTargetName.getText().toString().trim();
+                    currentPage = 1;
+                    queryScore(true);
+                    return true;
+                }
+                return false;
+            }
+        });*/
+        mineScoreAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                MusicSheetListBean.RowsBean item = (MusicSheetListBean.RowsBean) adapter.getItem(position);
+                if (!item.isSelect) {
+                    for (MusicSheetListBean.RowsBean rowsBean : dataList) {
+                        if (rowsBean.id == item.id) {
+                            rowsBean.isSelect = true;
+                        } else {
+                            rowsBean.isSelect = false;
+                        }
+                    }
+                    mineScoreAdapter.notifyDataSetChanged();
+                }
+
+            }
+        });
+
+    }
+
+    private void sendMessage(MusicSheetListBean.RowsBean item) {
+        RCChatShareMusicMessage rcChatShareMusicMessage = new RCChatShareMusicMessage();
+
+        rcChatShareMusicMessage.setSongName(item.musicSheetName);
+        rcChatShareMusicMessage.setSongAuth(item.composer);
+        rcChatShareMusicMessage.setMusicTagNames(item.musicSheetName);
+        rcChatShareMusicMessage.setTeacherAvatar(item.addUserAvatar);
+        rcChatShareMusicMessage.setTeacherName(item.addName);
+        rcChatShareMusicMessage.setSongId(item.id + "");
+        rcChatShareMusicMessage.setChargeType(item.chargeType);
+
+        Message locationMsg = Message.obtain(targetId, Conversation.ConversationType.GROUP, rcChatShareMusicMessage);
+        MessageTag annotation = rcChatShareMusicMessage.getClass().getAnnotation(MessageTag.class);
+        if (annotation != null) {
+            locationMsg.setObjectName(annotation.value());
+        }
+        RongIM.getInstance().sendMessage(locationMsg, "曲谱分享", "[曲谱分享]", new IRongCallback.ISendMessageCallback() {
+            @Override
+            public void onAttached(Message message) {
+
+            }
+
+            @Override
+            public void onSuccess(Message message) {
+                ToastUtils.showShort("发送成功");
+            }
+
+            @Override
+            public void onError(Message message, RongIMClient.ErrorCode errorCode) {
+                ToastUtils.showShort("发送失败");
+            }
+        });
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        currentPage = 1;
+        queryScore(false);
+    }
+
+    @Override
+    protected ActivitySelectScoreChatBinding getLayoutView() {
+        return ActivitySelectScoreChatBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected SelectScoreChatPresenter createPresenter() {
+        return new SelectScoreChatPresenter();
+    }
+
+    private int currentPage;
+    private boolean hasNext = true;
+    private String search = "";
+
+    private void queryScore(boolean isLoading) {
+        //根据默认筛选条件查询
+        presenter.queryPageCourseGroup(isLoading, currentPage, "PASS", search);
+    }
+
+    /**
+     * 检查是否还有下一页
+     *
+     * @param dataSize
+     */
+    private void checkHasNext(int dataSize) {
+        hasNext = dataSize >= Constants.DEFAULT_DATA_SIZE;
+    }
+
+    @Override
+    public void queryMusicListSuccess(int page, MusicSheetListBean data) {
+        if (data != null) {
+            if (page == 1) {
+                dataList.clear();
+                viewBinding.refreshLayout.finishRefresh();
+                if (data.rows != null && data.rows.size() > 0) {
+                    checkHasNext(data.rows.size());
+                    dataList.addAll(data.rows);
+                }
+                mineScoreAdapter.notifyDataSetChanged();
+            } else {
+                if (data.rows != null && data.rows.size() > 0) {
+                    mineScoreAdapter.getLoadMoreModule().loadMoreComplete();
+                    checkHasNext(data.rows.size());
+                } else {
+                    mineScoreAdapter.getLoadMoreModule().loadMoreEnd();
+                }
+            }
+        }
+
+    }
+
+    @Override
+    public void queryMusicListError(int page) {
+        if (page == 1) {
+            viewBinding.refreshLayout.finishRefresh();
+        } else {
+            if (mineScoreAdapter != null) {
+                currentPage--;
+                mineScoreAdapter.getLoadMoreModule().loadMoreFail();
+            }
+        }
+    }
+}

+ 102 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/activity/SetRemarksActivity.java

@@ -0,0 +1,102 @@
+package com.common.im.ui.activity;
+
+import android.content.Intent;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.common.im.contract.SetRemarksContract;
+import com.common.im.presenter.SetRemarksPresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.ActivitySetRemarkBinding;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.ToastUtils;
+
+/**
+ * 创建日期:2022/6/13 11:15
+ *
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.ChatCenter.CHAT_GROUP_SET_REMARK)
+public class SetRemarksActivity extends BaseMVPActivity<ActivitySetRemarkBinding, SetRemarksPresenter> implements SetRemarksContract.SetRemarksView, View.OnClickListener {
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == com.cooleshow.base.R.id.tv_right_text) {
+            remarks = et_remarks.getText().toString().trim();
+            if (TextUtils.isEmpty(remarks)) {
+                ToastUtils.showShort("请输入备注名");
+                return;
+            }
+            presenter.updateGroupInfo(targetId, remarks);
+        } else if (id == R.id.iv_close) {
+            et_remarks.setText("");
+        }
+    }
+
+    private EditText et_remarks;
+    private String targetId;
+    private String remarks;
+    private ImageView iv_close;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "设置备注名");
+        viewBinding.toolbarInclude.tvRightText.setText("完成");
+        viewBinding.toolbarInclude.tvRightText.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        viewBinding.toolbarInclude.tvRightText.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRightText.setOnClickListener(this);
+        et_remarks = viewBinding.etRemarks;
+        iv_close = viewBinding.ivClose;
+        iv_close.setOnClickListener(this);
+        Intent intent = getIntent();
+        targetId = intent.getStringExtra("targetId");
+        remarks = intent.getStringExtra("remarks");
+        et_remarks.setText(remarks);
+        et_remarks.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                if (et_remarks.getText().toString().length() > 0) {
+                    iv_close.setVisibility(View.VISIBLE);
+                } else {
+                    iv_close.setVisibility(View.GONE);
+                }
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+
+            }
+        });
+    }
+
+    @Override
+    protected ActivitySetRemarkBinding getLayoutView() {
+        return ActivitySetRemarkBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected SetRemarksPresenter createPresenter() {
+        return new SetRemarksPresenter();
+    }
+
+    @Override
+    public void updateGroupInfoSuccess() {
+        ToastUtils.showShort("设置成功");
+        Intent intent = new Intent();
+        intent.putExtra("remarks", remarks);
+        setResult(RESULT_OK,intent);
+        finish();
+    }
+}

+ 112 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/contact/ContactListTabFragment.java

@@ -0,0 +1,112 @@
+package com.common.im.ui.contact;
+
+import android.view.View;
+
+import androidx.fragment.app.Fragment;
+import androidx.viewpager.widget.ViewPager;
+
+import com.common.im.adapter.ContactListTabPagerAdapter;
+import com.common.im.presenter.ContactListTabPresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.FragmentContactListTabBinding;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.google.android.material.tabs.TabLayout;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 创建日期:2022/6/9 18:01
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ContactListTabFragment  extends BaseMVPFragment<FragmentContactListTabBinding, ContactListTabPresenter> implements View.OnClickListener {
+    @Override
+    protected FragmentContactListTabBinding getLayoutView() {
+        return FragmentContactListTabBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ContactListTabPresenter createPresenter() {
+        return new ContactListTabPresenter();
+    }
+    private ViewPager viewPager;
+
+    @Override
+    protected void initView(View rootView) {
+        viewPager = mViewBinding.viewpager;
+        mViewBinding.llRoom.setOnClickListener(this);
+        mViewBinding.llSingle.setOnClickListener(this);
+        viewPager.setCurrentItem(0);
+        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+            @Override
+            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+
+            }
+
+            @Override
+            public void onPageSelected(int position) {
+                if (position==0){
+                    selectSingle();
+                }else{
+                    selectRoom();
+                }
+            }
+
+            @Override
+            public void onPageScrollStateChanged(int state) {
+
+            }
+        });
+    }
+
+    private void selectSingle(){
+        mViewBinding.imContactRoom.setBackgroundResource(R.drawable.icon_contact_room_normal);
+        mViewBinding.imContactSingle.setBackgroundResource(R.drawable.icon_contact_single_select);
+        mViewBinding.tvContactRoom.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_666666));
+        mViewBinding.tvContactSingle.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+    }
+
+    private void selectRoom(){
+        mViewBinding.imContactRoom.setBackgroundResource(R.drawable.icon_contact_room_select);
+        mViewBinding.imContactSingle.setBackgroundResource(R.drawable.icon_contact_single_normal);
+        mViewBinding.tvContactRoom.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        mViewBinding.tvContactSingle.setTextColor(getResources().getColor(com.cooleshow.base.R.color.color_666666));
+    }
+
+    @Override
+    protected void initData() {
+        initTabLayoutAndViewPager();
+    }
+
+
+
+
+    private List<Fragment> fragments = new ArrayList<>();
+    private List<String> titles = new ArrayList<String>(Arrays.asList("联系人", "群聊"));
+
+    private void initTabLayoutAndViewPager() {
+        fragments.clear();
+      /*  for (int i = 0; i < titles.size(); i++) {
+            tabLayout.addTab(tabLayout.newTab().setText(titles.get(i)));
+            Fragment adFragment = HomeWorkFragment.newInstance(auditStatusList.get(i));
+            fragments.add(adFragment);
+        }*/
+        fragments.add(new ContactPersonListFragment());
+        fragments.add(new ContactRoomListFragment());
+
+        viewPager.setAdapter(new ContactListTabPagerAdapter(getParentFragmentManager(), fragments, titles));
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.ll_single) {
+            viewPager.setCurrentItem(0);
+        } else if (id == R.id.ll_room) {
+            viewPager.setCurrentItem(1);
+        }
+    }
+}

+ 54 - 2
rong_im/common_im_ui/src/main/java/com/common/im/ui/contact/ContactPersonListFragment.java

@@ -2,9 +2,13 @@ package com.common.im.ui.contact;
 
 
 import android.graphics.Color;
+import android.os.Bundle;
+import android.text.TextUtils;
 import android.view.View;
 
 
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
 import com.common.im.adapter.ContactListAdapter;
 import com.common.im.bean.ContactListBean;
 import com.common.im.contract.ContactListFragmentContract;
@@ -15,16 +19,27 @@ import com.cooleshow.base.utils.SizeUtils;
 import com.cooleshow.base.widgets.EmptyViewLayout;
 import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.mcxtzhang.indexlib.suspension.SuspensionDecoration;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.LinearLayoutManager;
 
+import io.rong.common.RLog;
+import io.rong.imkit.config.ConversationListBehaviorListener;
+import io.rong.imkit.config.RongConfigCenter;
+import io.rong.imkit.conversationlist.model.GatheredConversation;
+import io.rong.imkit.utils.RouteUtils;
+import io.rong.imlib.RongIMClient;
+import io.rong.imlib.model.Conversation;
+
 /**
  * 联系人列表
  */
-public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactListLayoutBinding, ContactListPresenter> implements ContactListFragmentContract.ContactListFragmentView {
+public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactListLayoutBinding, ContactListPresenter> implements ContactListFragmentContract.ContactListFragmentView, View.OnClickListener {
 
     private SuspensionDecoration mDecoration;
     private List<ContactListBean> mDatas = new ArrayList<>();
@@ -44,6 +59,7 @@ public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactLi
 
     @Override
     protected void initView(View rootView) {
+        mViewBinding.viewSearchBg.setOnClickListener(this);
         mListAdapter = new ContactListAdapter(R.layout.item_contact_list_layout);
         LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
         mViewBinding.recyclerView.setLayoutManager(layoutManager);
@@ -55,11 +71,32 @@ public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactLi
                 .setNeedRealIndex(false)//设置需要真实的索引
                 .setmLayoutManager(layoutManager);//设置RecyclerView的LayoutManager
         mViewBinding.recyclerView.setAdapter(mListAdapter);
+        mListAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                ContactListBean item = (ContactListBean) adapter.getItem(position);
+                goChat(view, item.friendId + "", item.friendNickname);
+            }
+        });
+
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                presenter.queryFriendList(getContext(), searchCondition);
+            }
+        });
+
+    }
+
+    private void goChat(View view, String targetId, String nickName) {
+        Bundle bundle = new Bundle();
+        bundle.putString(RouteUtils.TITLE, nickName);
+        RouteUtils.routeToConversationActivity(view.getContext(), Conversation.ConversationType.PRIVATE, targetId, bundle);
     }
 
     @Override
     protected void initData() {
-        presenter.queryFriendList(searchCondition);
+        presenter.queryFriendList(getContext(), searchCondition);
     }
 
     @Override
@@ -67,6 +104,7 @@ public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactLi
         if (isDetached()) {
             return;
         }
+        mViewBinding.refreshLayout.finishRefresh();
         if (mListAdapter != null) {
             if (contactListBeans != null && contactListBeans.size() > 0) {
                 mDatas = contactListBeans;
@@ -80,6 +118,14 @@ public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactLi
         }
     }
 
+    @Override
+    public void getFriendListError() {
+        if (isDetached()) {
+            return;
+        }
+        mViewBinding.refreshLayout.finishRefresh();
+    }
+
     private void showEmptyView() {
         if (mEmptyViewLayout == null) {
             mEmptyViewLayout = new EmptyViewLayout(getContext());
@@ -87,4 +133,10 @@ public class ContactPersonListFragment extends BaseMVPFragment<FragmentContactLi
         mEmptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_content, "暂无联系人");
         mListAdapter.setEmptyView(mEmptyViewLayout);
     }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.view_search_bg) {
+        }
+    }
 }

+ 144 - 0
rong_im/common_im_ui/src/main/java/com/common/im/ui/contact/ContactRoomListFragment.java

@@ -0,0 +1,144 @@
+package com.common.im.ui.contact;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.listener.OnItemClickListener;
+import com.common.im.adapter.ContactListAdapter;
+import com.common.im.adapter.ContactRoomListAdapter;
+import com.common.im.bean.ContactListBean;
+import com.common.im.bean.ContactRoomListBean;
+import com.common.im.contract.ContactListFragmentContract;
+import com.common.im.contract.ContactRoomListFragmentContract;
+import com.common.im.presenter.ContactListPresenter;
+import com.common.im.presenter.ContactRoomListPresenter;
+import com.common.im_ui.R;
+import com.common.im_ui.databinding.FragmentContactListLayoutBinding;
+import com.common.im_ui.databinding.FragmentContactRoomListBinding;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.SizeUtils;
+import com.cooleshow.base.widgets.EmptyViewLayout;
+import com.mcxtzhang.indexlib.suspension.SuspensionDecoration;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnRefreshListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.rong.imkit.RongIM;
+import io.rong.imkit.config.ConversationListBehaviorListener;
+import io.rong.imkit.config.RongConfigCenter;
+import io.rong.imkit.userinfo.RongUserInfoManager;
+import io.rong.imkit.utils.RouteUtils;
+import io.rong.imlib.RongIMClient;
+import io.rong.imlib.model.Conversation;
+import io.rong.imlib.model.Group;
+
+/**
+ * 创建日期:2022/6/10 10:42
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ContactRoomListFragment extends BaseMVPFragment<FragmentContactRoomListBinding, ContactRoomListPresenter> implements ContactRoomListFragmentContract.ContactRoomListFragmentView, View.OnClickListener {
+
+    private List<ContactRoomListBean> mDatas = new ArrayList<>();
+    private ContactRoomListAdapter mListAdapter;
+    private String searchCondition;
+    private EmptyViewLayout mEmptyViewLayout;
+
+    @Override
+    protected FragmentContactRoomListBinding getLayoutView() {
+        return FragmentContactRoomListBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ContactRoomListPresenter createPresenter() {
+        return new ContactRoomListPresenter();
+    }
+
+    @Override
+    protected void initView(View rootView) {
+        mViewBinding.viewSearchBg.setOnClickListener(this);
+        mListAdapter = new ContactRoomListAdapter(R.layout.item_contact_list_layout);
+        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
+        mViewBinding.recyclerView.setLayoutManager(layoutManager);
+        mViewBinding.recyclerView.setAdapter(mListAdapter);
+        mListAdapter.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
+                ContactRoomListBean item = (ContactRoomListBean) adapter.getItem(position);
+                goChat( item.getId() + "",item.getName());
+            }
+        });
+        mViewBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {
+            @Override
+            public void onRefresh(@NonNull RefreshLayout refreshLayout) {
+                presenter.queryGroupList(getContext(),searchCondition);
+            }
+        });
+    }
+
+    private void goChat( String targetId, String nickName) {
+        RongIM.getInstance().startGroupChat(getContext(),targetId,nickName);
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        presenter.queryGroupList(getContext(),searchCondition);
+    }
+
+    @Override
+    public void getGroupListSuccess(List<ContactRoomListBean> contactListBeans) {
+        if (isDetached()) {
+            return;
+        }
+        for (ContactRoomListBean contactListBean : contactListBeans) {
+            Group group = RongUserInfoManager.getInstance().getGroupInfo(contactListBean.getId());
+        }
+        mViewBinding.refreshLayout.finishRefresh();
+        if (mListAdapter != null) {
+            if (contactListBeans != null && contactListBeans.size() > 0) {
+                mDatas = contactListBeans;
+                mListAdapter.setNewInstance(contactListBeans);
+            } else {
+                showEmptyView();
+            }
+        }
+    }
+
+    @Override
+    public void getGroupListError() {
+        if (isDetached()) {
+            return;
+        }
+        mViewBinding.refreshLayout.finishRefresh();
+    }
+
+    private void showEmptyView() {
+        if (mEmptyViewLayout == null) {
+            mEmptyViewLayout = new EmptyViewLayout(getContext());
+        }
+        mEmptyViewLayout.setContent(com.cooleshow.base.R.drawable.icon_empty_content, "暂无内容");
+        mListAdapter.setEmptyView(mEmptyViewLayout);
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v.getId() == R.id.view_search_bg) {
+        }
+    }
+}

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


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


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


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


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


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


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


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


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


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


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio