honghengqiang 1 year ago
parent
commit
8e4d95608d
82 changed files with 1084 additions and 105 deletions
  1. 5 5
      app/build.gradle
  2. 2 2
      app/src/main/java/com/swago/app/SplashVm.kt
  3. 1 1
      baseswago/build.gradle
  4. 15 3
      baseswago/src/main/java/com/swago/baseswago/PersonDataDFragment.kt
  5. 49 2
      baseswago/src/main/java/com/swago/baseswago/UserVm.kt
  6. 1 1
      baseswago/src/main/java/com/swago/baseswago/baseroom/IRoomInfo.kt
  7. 1 0
      baseswago/src/main/java/com/swago/baseswago/constant/ARouteConstant.kt
  8. 2 2
      baseswago/src/main/java/com/swago/baseswago/constant/UrlConstant.kt
  9. 44 3
      baseswago/src/main/java/com/swago/baseswago/dialog/HandleDialogFragment.kt
  10. 11 1
      baseswago/src/main/java/com/swago/baseswago/im/GroupMsgParser.kt
  11. 7 0
      baseswago/src/main/java/com/swago/baseswago/im/ImConstant.kt
  12. 1 0
      baseswago/src/main/java/com/swago/baseswago/im/RoomMsgType.kt
  13. 11 1
      baseswago/src/main/java/com/swago/baseswago/inter/UserApi.kt
  14. 13 0
      baseswago/src/main/java/com/swago/baseswago/model/RoomManagerModel.kt
  15. 38 0
      baseswago/src/main/java/com/swago/baseswago/model/UserInfoModel.java
  16. 77 0
      baseswago/src/main/java/com/swago/baseswago/model/im/BecomeManagerBean.java
  17. 1 0
      baseswago/src/main/java/com/swago/baseswago/model/im/RoomChatMsgBean.java
  18. 1 0
      baseswago/src/main/java/com/swago/baseswago/model/im/UserJoinRoomBean.java
  19. 2 1
      baseswago/src/main/java/com/swago/baseswago/model/live/ForceCloseModel.kt
  20. 2 1
      baseswago/src/main/java/com/swago/baseswago/model/live/ReceiveModel.kt
  21. 2 1
      baseswago/src/main/java/com/swago/baseswago/model/live/RoomAuthModel.kt
  22. 6 0
      baseswago/src/main/res/drawable/shape_afb9c3_stroke_50.xml
  23. 25 0
      baseswago/src/main/res/layout/dialog_handle.xml
  24. 18 3
      baseswago/src/main/res/layout/dialog_person_data.xml
  25. BIN
      baseswago/src/main/res/mipmap-xxhdpi/ic_room_admin.png
  26. 10 0
      baseswago/src/main/res/values-ar/strings.xml
  27. 10 0
      baseswago/src/main/res/values-in/strings.xml
  28. 10 0
      baseswago/src/main/res/values-ms/strings.xml
  29. 10 0
      baseswago/src/main/res/values-zh/strings.xml
  30. 10 1
      baseswago/src/main/res/values/strings.xml
  31. 20 8
      build.gradle
  32. 1 1
      gradle/wrapper/gradle-wrapper.properties
  33. 14 0
      home/src/main/java/com/swago/home/MineFragment.kt
  34. 16 0
      home/src/main/res/layout/fragment_mine.xml
  35. BIN
      home/src/main/res/mipmap-xxhdpi/icon_mine_room_manager.webp
  36. BIN
      room/src/main/assets/dandao_one.svga
  37. BIN
      room/src/main/assets/dandao_three.svga
  38. BIN
      room/src/main/assets/dandao_two.svga
  39. 59 2
      room/src/main/java/com/swago/room/adapter/RoomChatAdapter.kt
  40. 1 1
      room/src/main/java/com/swago/room/anchor/AnchorRoomActivity.kt
  41. 2 1
      room/src/main/java/com/swago/room/anchor/AnchorRoomFragment.kt
  42. 1 7
      room/src/main/java/com/swago/room/base/BaseComFragment.kt
  43. 6 0
      room/src/main/java/com/swago/room/bean/UserRoomModel.kt
  44. 6 2
      room/src/main/java/com/swago/room/dialog/ForceCloseRoomDialog.kt
  45. 2 0
      room/src/main/java/com/swago/room/dialog/SendMsgDialog.kt
  46. 207 3
      room/src/main/java/com/swago/room/giftdandao/GiftDanDaoView.kt
  47. 32 18
      room/src/main/java/com/swago/room/user/UserRoomFragment.kt
  48. 40 3
      room/src/main/java/com/swago/room/vm/MsgVm.kt
  49. 16 1
      room/src/main/res/layout/dialog_force_close_room.xml
  50. 15 0
      room/src/main/res/layout/item_admin.xml
  51. 54 20
      room/src/main/res/layout/view_item_gift.xml
  52. BIN
      room/src/main/res/mipmap-xxhdpi/bg_dan_dao_one.webp
  53. BIN
      room/src/main/res/mipmap-xxhdpi/bg_dan_dao_two.webp
  54. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_eight.png
  55. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_five.png
  56. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_four.png
  57. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_nine.png
  58. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_one.png
  59. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_seven.png
  60. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_six.png
  61. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_three.png
  62. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_two.png
  63. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_x.png
  64. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_zero.png
  65. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_eight.png
  66. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_five.png
  67. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_four.png
  68. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_nine.png
  69. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_one.png
  70. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_seven.png
  71. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_six.png
  72. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_three.png
  73. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_two.png
  74. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_x.png
  75. BIN
      room/src/main/res/mipmap-xxhdpi/ic_dan_dao_zero.png
  76. BIN
      room/src/main/res/raw/lottieCar.zip
  77. BIN
      room/src/main/res/raw/lottieboat.zip
  78. 32 10
      tuikit/src/main/java/com/tencent/qcloud/tim/uikit/modules/chat/layout/input/InputLayout.java
  79. 2 0
      user/src/main/AndroidManifest.xml
  80. 84 0
      user/src/main/java/com/swago/user/roommanager/RoomManagerActivity.kt
  81. 22 0
      user/src/main/java/com/swago/user/roommanager/RoomManagerAdapter.kt
  82. 67 0
      user/src/main/res/layout/item_room_manager.xml

+ 5 - 5
app/build.gradle

@@ -8,15 +8,15 @@ plugins {
 }
 
 android {
-    compileSdkVersion 30
-    buildToolsVersion "30.0.3"
+    compileSdkVersion 31
+    buildToolsVersion "31.0.0"
 
     defaultConfig {
         applicationId "com.swago.app"
         minSdkVersion 21
-        targetSdkVersion 30
-        versionCode 1160
-        versionName "1.1.6.0"
+        targetSdkVersion 31
+        versionCode 1170
+        versionName "1.1.7.0"
         multiDexEnabled true
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 

+ 2 - 2
app/src/main/java/com/swago/app/SplashVm.kt

@@ -105,8 +105,8 @@ class SplashVm(application: Application) : BaseViewModel(application) {
 
     private fun setBaseUrl(baseUrl: String) {
         if (BuildConfig.DEBUG) {
-            UrlConstant.BASE_URL =   "http:test-api.swago.cn"
-//            UrlConstant.BASE_URL =   "http:huawei.swago.cn"
+//            UrlConstant.BASE_URL =   "http:test-api.swago.cn"
+            UrlConstant.BASE_URL =   "http:huawei.swago.cn"
 //            UrlConstant.BASE_URL =    "https://api.swagobei.com"
 //            UrlConstant.BASE_URL =   "https://pro-api.swago.cn"
         } else {

+ 1 - 1
baseswago/build.gradle

@@ -111,7 +111,7 @@ dependencies {
     api 'com.android.billingclient:billing-ktx:4.1.0'
     //抓包
     debugImplementation "com.readystatesoftware.chuck:library:1.1.0"
-    releaseCompile "com.readystatesoftware.chuck:library-no-op:1.1.0"
+    releaseImplementation "com.readystatesoftware.chuck:library-no-op:1.1.0"
     //国家选择
     api project(path: ':lib_country_picker')
     //滑动栏

+ 15 - 3
baseswago/src/main/java/com/swago/baseswago/PersonDataDFragment.kt

@@ -34,19 +34,22 @@ class PersonDataDFragment : BaseXDFragment<DialogPersonDataBinding>() {
     var uid = ""
     var nickName = ""
     var account = ""
+    var roomId:String = ""
     var isAnchor = false //在直播间是不是打开资料卡
+    var isAdmin = false
     private var inRoom = false
     private var isForbid = 0 //0没有被禁言  1已被禁言
     var openGiftDialog:((nickName:String,userId:String)->Unit)? = null
     var sendMsgInRoom:((nickName:String)->Unit)? = null
 
     companion object{
-        fun newInstance(uid:String,isAnchor:Boolean=false,inRoom:Boolean=false): PersonDataDFragment {
+        fun newInstance(uid:String,isAnchor:Boolean=false,inRoom:Boolean=false,roomId:String=""): PersonDataDFragment {
             val dialog = PersonDataDFragment()
             val bundle = Bundle()
             bundle.putString("uid",uid)
             bundle.putBoolean("inRoom",inRoom)
             bundle.putBoolean("isAnchor",isAnchor)
+            bundle.putString("roomId",roomId)
             dialog.arguments = bundle
             return dialog
         }
@@ -58,8 +61,9 @@ class PersonDataDFragment : BaseXDFragment<DialogPersonDataBinding>() {
             uid = it.getString("uid","")
             inRoom = it.getBoolean("inRoom")
             isAnchor = it.getBoolean("isAnchor")
+            roomId = it.getString("roomId","")
             if (!TextUtils.isEmpty(uid)){
-                userVm.getOtherUserInfo(uid)
+                userVm.getOtherUserInfo(uid,roomId)
             }
 
             UserInfo.getUserInfo()?.let {
@@ -137,7 +141,7 @@ class PersonDataDFragment : BaseXDFragment<DialogPersonDataBinding>() {
 
             binding.ivMore.setOnClickListener(object:NoDoubleClickListener(){
                 override fun onClick() {
-                    HandleDialogFragment.newInstance(uid,account,isForbid,isAnchor,inRoom).show(parentFragmentManager,"HandleDialogFragment")
+                    HandleDialogFragment.newInstance(uid,account,isForbid,isAnchor,inRoom,isAdmin).show(parentFragmentManager,"HandleDialogFragment")
                 }
             })
 
@@ -202,6 +206,14 @@ class PersonDataDFragment : BaseXDFragment<DialogPersonDataBinding>() {
             }else{
                 binding.ivCup.visibility = View.GONE
             }
+
+            if (it.is_room_admin== 1){
+                binding.ivRoomAdmin.visibility = View.VISIBLE
+            }else{
+                binding.ivRoomAdmin.visibility = View.GONE
+            }
+
+            isAdmin = it.is_room_admin == 1
         }
 
 

+ 49 - 2
baseswago/src/main/java/com/swago/baseswago/UserVm.kt

@@ -47,9 +47,9 @@ class UserVm(application: Application) : BaseViewModel(application) {
         MutableLiveData<OtherUserInfoModel>()
     }
 
-    fun getOtherUserInfo(uid: String) {
+    fun getOtherUserInfo(uid: String,roomId:String) {
         requestData {
-            val data = ApiManager.userApi.getOtherUserInfo(uid)
+            val data = ApiManager.userApi.getOtherUserInfo(uid,roomId)
             otherUserInfoLiveData.value = data
         }
     }
@@ -248,4 +248,51 @@ class UserVm(application: Application) : BaseViewModel(application) {
     }
 
 
+    /**
+     * 直播间管理员列表
+     */
+    val roomManagerListLiveData by lazy {
+        MutableLiveData<List<ListBean>?>()
+    }
+
+    fun getRoomManager(page:Int){
+        requestData2 {
+            requestData {
+                val data = ApiManager.userApi.getRoomManagerList(page)
+                data.list?.let {
+                    roomManagerListLiveData.value = it
+                }
+            }
+
+
+            requestError {
+                roomManagerListLiveData.value = null
+            }
+        }
+    }
+
+    /**
+     * 设置房间管理员和取消房间管理员
+     */
+    val setRoomAdminLiveData  by lazy {
+        MutableLiveData<Int>()
+    }
+
+    fun setRoomAdmin(userId:String,type:Int){
+        requestData2 {
+            requestData {
+                UserInfo.getUserInfo()?.let {
+                    ApiManager.userApi.setRoomAdmin(it.id,userId,type)
+                    setRoomAdminLiveData.value = type
+                }
+                SwagoLoading.cancelLoadingDialog()
+            }
+
+
+            requestError {
+                SwagoLoading.cancelLoadingDialog()
+            }
+        }
+    }
+
 }

+ 1 - 1
baseswago/src/main/java/com/swago/baseswago/baseroom/IRoomInfo.kt

@@ -28,5 +28,5 @@ interface IRoomInfo {
 
     fun getRoomSystemMsg():String
     fun getIsRobot():Boolean
-
+    fun getRoomAdmin():Int //用户是否是直播间管理员
 }

+ 1 - 0
baseswago/src/main/java/com/swago/baseswago/constant/ARouteConstant.kt

@@ -14,6 +14,7 @@ object ARouteConstant {
     object User {
         private const val rootPath = "/user"
         const val followFan = "$rootPath/FollowAndFansActivity"
+        const val roomManager = "$rootPath/RoomManagerActivity"
         const val editInfo = "$rootPath/EditInfoActivity"
         const val setting = "$rootPath/SettingActivity"
         const val level = "$rootPath/LevelActivity"

+ 2 - 2
baseswago/src/main/java/com/swago/baseswago/constant/UrlConstant.kt

@@ -14,8 +14,8 @@ import java.io.File
 object UrlConstant {
 
     var BASE_URL = if (BuildConfig.DEBUG) {
-            "http:test-api.swago.cn"
-//            "http:huawei.swago.cn"
+//            "http:test-api.swago.cn"
+            "http:huawei.swago.cn"
 //        "https://api.swagobei.com"
 //        "https://pro-api.swago.cn"
     } else {

+ 44 - 3
baseswago/src/main/java/com/swago/baseswago/dialog/HandleDialogFragment.kt

@@ -3,6 +3,7 @@ package com.swago.baseswago.dialog
 import android.os.Bundle
 import android.view.Gravity
 import android.view.View
+import android.widget.Toast
 import androidx.fragment.app.viewModels
 import com.swago.baseswago.HandleVm
 import com.swago.baseswago.R
@@ -27,6 +28,7 @@ class HandleDialogFragment : BaseXDFragment<DialogHandleBinding>() {
     private var isForbid = 0
     private var inRoom = false
     private var isAnchor = false
+    private var isRoomAdmin = false
 
 
     init {
@@ -36,13 +38,14 @@ class HandleDialogFragment : BaseXDFragment<DialogHandleBinding>() {
 
 
     companion object{
-        fun newInstance(userId:String,account:String,isForbid:Int,isAnchor:Boolean,inRoom:Boolean=false): HandleDialogFragment {
+        fun newInstance(userId:String,account:String,isForbid:Int,isAnchor:Boolean,inRoom:Boolean=false,isRoomAdmin:Boolean=false): HandleDialogFragment {
             val args = Bundle()
             args.putString("userId",userId)
             args.putString("account",account)
             args.putInt("isForbid",isForbid)
             args.putBoolean("inRoom",inRoom)
             args.putBoolean("isAnchor",isAnchor)
+            args.putBoolean("isRoomAdmin",isRoomAdmin)
             val fragment = HandleDialogFragment()
             fragment.arguments = args
             return fragment
@@ -56,6 +59,7 @@ class HandleDialogFragment : BaseXDFragment<DialogHandleBinding>() {
             isForbid = it.getInt("isForbid",0)
             inRoom = it.getBoolean("inRoom",false)
             isAnchor = it.getBoolean("isAnchor",false)
+            isRoomAdmin = it.getBoolean("isRoomAdmin",false)
             if (isForbid == 1){
                 binding.tvMute.text = AppContext.getContext().resources.getString(R.string.cancel_forbid_speak)
             }else {
@@ -63,11 +67,25 @@ class HandleDialogFragment : BaseXDFragment<DialogHandleBinding>() {
             }
             if (inRoom){
                 if (isAnchor){
+                    //主播
                     binding.tvKick.visibility = View.VISIBLE
                     binding.tvMute.visibility = View.VISIBLE
+                    if (isRoomAdmin){
+                        binding.tvDeleteRoomAdmin.visibility = View.VISIBLE
+                    }else{
+                        binding.tvSetRoomAdmin.visibility = View.VISIBLE
+                    }
                 }else{
-                    binding.tvKick.visibility = View.GONE
-                    binding.tvMute.visibility = View.GONE
+                    //用户
+                    SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
+                        if (iRoomInfo.getRoomAdmin()==1){
+                            binding.tvKick.visibility = View.VISIBLE
+                            binding.tvMute.visibility = View.VISIBLE
+                        }else{
+                            binding.tvKick.visibility = View.GONE
+                            binding.tvMute.visibility = View.GONE
+                        }
+                    }
                 }
             }else{
                 binding.tvKick.visibility = View.GONE
@@ -157,6 +175,17 @@ class HandleDialogFragment : BaseXDFragment<DialogHandleBinding>() {
                 }
             }
         })
+
+        binding.tvSetRoomAdmin.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                userVm.setRoomAdmin(userId,1)
+            }
+        })
+        binding.tvDeleteRoomAdmin.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                userVm.setRoomAdmin(userId,2)
+            }
+        })
     }
 
     override fun initLiveData() {
@@ -181,5 +210,17 @@ class HandleDialogFragment : BaseXDFragment<DialogHandleBinding>() {
                 SwagoRoomManager.closeRoom()
             }
         }
+
+        userVm.setRoomAdminLiveData.observe(this){
+            if (it==1){
+                binding.tvSetRoomAdmin.visibility = View.GONE
+                binding.tvDeleteRoomAdmin.visibility = View.VISIBLE
+                Toast.makeText(AppContext.getContext(), AppContext.getContext().getString(R.string.set_room_manager_success), Toast.LENGTH_SHORT).show()
+            }else{
+                binding.tvSetRoomAdmin.visibility = View.VISIBLE
+                binding.tvDeleteRoomAdmin.visibility = View.GONE
+                Toast.makeText(AppContext.getContext(), AppContext.getContext().getString(R.string.delete_room_manager_success), Toast.LENGTH_SHORT).show()
+            }
+        }
     }
 }

+ 11 - 1
baseswago/src/main/java/com/swago/baseswago/im/GroupMsgParser.kt

@@ -11,6 +11,7 @@ import com.swago.baseswago.im.ImConstant.beauty_game_grab_host_two
 import com.swago.baseswago.im.ImConstant.beauty_game_host
 import com.swago.baseswago.im.ImConstant.cancel_forbid_speak
 import com.swago.baseswago.im.ImConstant.close_mic_chat
+import com.swago.baseswago.im.ImConstant.delete_room_admin
 import com.swago.baseswago.im.ImConstant.error_to_close_mic
 import com.swago.baseswago.im.ImConstant.follow_anchor_success
 import com.swago.baseswago.im.ImConstant.forbid_speak
@@ -29,6 +30,7 @@ import com.swago.baseswago.im.ImConstant.red_envelope
 import com.swago.baseswago.im.ImConstant.red_envelope_broadcast
 import com.swago.baseswago.im.ImConstant.remove_room
 import com.swago.baseswago.im.ImConstant.room_chat_text
+import com.swago.baseswago.im.ImConstant.set_room_admin
 import com.swago.baseswago.im.ImConstant.svg_gift
 import com.swago.baseswago.im.ImConstant.update_audience
 import com.swago.baseswago.im.ImConstant.user_exit_room
@@ -129,7 +131,7 @@ class GroupMsgParser : IGroupNewMsgParser {
                     parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
                 }
 
-                remove_room,forbid_speak,cancel_forbid_speak -> {
+                remove_room,forbid_speak,cancel_forbid_speak, delete_room_admin -> {
                     parameterizedTypeImpl = ParameterizedTypeImpl(
                         arrayOf<Type>(ReceiveModel::class.java),
                         CusNewMsgBean::class.java,
@@ -137,6 +139,14 @@ class GroupMsgParser : IGroupNewMsgParser {
                     )
                     parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
                 }
+                set_room_admin -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(BecomeManagerBean::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
 
                 force_close_live_room -> {
                     parameterizedTypeImpl = ParameterizedTypeImpl(

+ 7 - 0
baseswago/src/main/java/com/swago/baseswago/im/ImConstant.kt

@@ -130,6 +130,13 @@ object ImConstant {
      */
     const val error_to_close_mic = 220
 
+
+    /**
+     * 设置和取消直播间管理员
+     */
+    const val set_room_admin = 221
+    const val delete_room_admin = 222
+
     /**********游戏相关IM********/
     const val fruit_game = 1001
     const val beauty_game = 1002

+ 1 - 0
baseswago/src/main/java/com/swago/baseswago/im/RoomMsgType.kt

@@ -10,5 +10,6 @@ object RoomMsgType {
     const val USER_ENTER_ROOM = 2
     const val SYSTEM_MESSAGE = 3
     const val FOLLOW_MESSAGE = 4
+    const val BECOME_MANAGER = 5
 
 }

+ 11 - 1
baseswago/src/main/java/com/swago/baseswago/inter/UserApi.kt

@@ -26,7 +26,7 @@ interface UserApi {
     //用户信息
     @FormUrlEncoded
     @POST("/v1/user/detail")
-    suspend fun getOtherUserInfo(@Field("id") id: String): OtherUserInfoModel
+    suspend fun getOtherUserInfo(@Field("id") id: String,@Field("room_id") room_id: String): OtherUserInfoModel
 
     //修改用户信息
     @POST("/v1/user/modify")
@@ -107,4 +107,14 @@ interface UserApi {
     @POST("/v1/rtc/broadcast/log/black/list")
     suspend fun getRoomBlackList(@Field("page") page: Int):RoomBlackBean
 
+    //直播间管理员
+    @FormUrlEncoded
+    @POST("/v1/rtc/broadcast/room/admin/list")
+    suspend fun getRoomManagerList(@Field("page") page: Int,@Field("page_size") size: Int = 20):RoomManagerModel
+
+    //设置直播间管理员  //类型(1设置房间管理员2取消房间管理员)
+    @FormUrlEncoded
+    @POST("/v1/rtc/broadcast/set/room/admin")
+    suspend fun setRoomAdmin(@Field("room_id") room_id: String,@Field("user_id") user_id: String,@Field("type") type: Int):Any
+
 }

+ 13 - 0
baseswago/src/main/java/com/swago/baseswago/model/RoomManagerModel.kt

@@ -0,0 +1,13 @@
+package com.swago.baseswago.model
+
+data class RoomManagerModel(
+    val list: List<ListBean>?,
+    val total: Int
+)
+
+data class ListBean(
+    val admin_user_id: String,
+    val admin_user_name: String,
+    val created_at:String,
+    val admin_user_head_img_url:String
+)

+ 38 - 0
baseswago/src/main/java/com/swago/baseswago/model/UserInfoModel.java

@@ -73,6 +73,20 @@ public class UserInfoModel {
      */
     private int is_cup;
 
+    /**
+     * 房间管理员
+     */
+    private int is_room_admin;
+
+    /**
+     * 系统私信禁言状态
+     */
+    private int private_msg_status;
+
+    /**
+     * 系统直播间禁言状态
+     */
+    private int broadcast_msg_status;
 
     public String getUser_constellation() {
         return user_constellation;
@@ -321,4 +335,28 @@ public class UserInfoModel {
     public void setIs_cup(int is_cup) {
         this.is_cup = is_cup;
     }
+
+    public int getIs_room_admin() {
+        return is_room_admin;
+    }
+
+    public void setIs_room_admin(int is_room_admin) {
+        this.is_room_admin = is_room_admin;
+    }
+
+    public int getPrivate_msg_status() {
+        return private_msg_status;
+    }
+
+    public void setPrivate_msg_status(int private_msg_status) {
+        this.private_msg_status = private_msg_status;
+    }
+
+    public int getBroadcast_msg_status() {
+        return broadcast_msg_status;
+    }
+
+    public void setBroadcast_msg_status(int broadcast_msg_status) {
+        this.broadcast_msg_status = broadcast_msg_status;
+    }
 }

+ 77 - 0
baseswago/src/main/java/com/swago/baseswago/model/im/BecomeManagerBean.java

@@ -0,0 +1,77 @@
+package com.swago.baseswago.model.im;
+
+import static com.swago.baseswago.im.RoomMsgType.BECOME_MANAGER;
+
+import androidx.annotation.NonNull;
+
+import com.swago.baseswago.R;
+import com.swago.baseswago.im.IRoomChat;
+import com.swago.baseswago.util.AppContext;
+
+public class BecomeManagerBean implements IRoomChat {
+    private String roomId;
+    private String receiverId;
+    private String nickname;
+
+    public String getRoomId() {
+        return roomId;
+    }
+
+    public void setRoomId(String roomId) {
+        this.roomId = roomId;
+    }
+
+    public String getReceiverId() {
+        return receiverId;
+    }
+
+    public void setReceiverId(String receiverId) {
+        this.receiverId = receiverId;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    @NonNull
+    @Override
+    public String getSenderName() {
+        return nickname;
+    }
+
+    @NonNull
+    @Override
+    public String getMsgContent() {
+        return String.format(AppContext.getContext().getResources().getString(R.string.become_room_manager),nickname);
+    }
+
+    @Override
+    public int getMsgType() {
+        return BECOME_MANAGER;
+    }
+
+    @Override
+    public int getUserLevel() {
+        return 0;
+    }
+
+    @Override
+    public int getIsBenefit() {
+        return 0;
+    }
+
+    @NonNull
+    @Override
+    public String getSenderId() {
+        return receiverId;
+    }
+
+    @Override
+    public boolean getIsPrettyId() {
+        return false;
+    }
+}

+ 1 - 0
baseswago/src/main/java/com/swago/baseswago/model/im/RoomChatMsgBean.java

@@ -22,6 +22,7 @@ public class RoomChatMsgBean implements IRoomChat {
     public int isOfficial;
     public int isCrown;
     public int isCup;
+    public int isAdmin;
 
 
     @NonNull

+ 1 - 0
baseswago/src/main/java/com/swago/baseswago/model/im/UserJoinRoomBean.java

@@ -25,6 +25,7 @@ public class UserJoinRoomBean implements IRoomChat {
     public int isPrettyAccount;
     public int isService;
     public int isOfficial;
+    public int isAdmin;
 
     @NonNull
     @Override

+ 2 - 1
baseswago/src/main/java/com/swago/baseswago/model/live/ForceCloseModel.kt

@@ -2,5 +2,6 @@ package com.swago.baseswago.model.live
 
 data class ForceCloseModel (
     val roomId:String="",
-    val closedReason:String=""
+    val closedReason:String="",
+    val closeTime:Long = 0
 )

+ 2 - 1
baseswago/src/main/java/com/swago/baseswago/model/live/ReceiveModel.kt

@@ -6,5 +6,6 @@ package com.swago.baseswago.model.live
  */
 data class ReceiveModel(
     var roomId:String="",
-    var receiverId:String = ""
+    var receiverId:String = "",
+    var nickname:String = ""
 )

+ 2 - 1
baseswago/src/main/java/com/swago/baseswago/model/live/RoomAuthModel.kt

@@ -6,5 +6,6 @@ package com.swago.baseswago.model.live
  */
 data class RoomAuthModel(
     var is_black:Int = 1,
-    var is_forbid:Int = 1
+    var is_forbid:Int = 1,
+    var is_room_admin:Int=0, ////是否房间管理员
 )

+ 6 - 0
baseswago/src/main/res/drawable/shape_afb9c3_stroke_50.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <stroke android:color="#afb9c3"
+        android:width="1dp"/>
+    <corners android:radius="50dp"/>
+</shape>

+ 25 - 0
baseswago/src/main/res/layout/dialog_handle.xml

@@ -3,6 +3,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    xmlns:tools="http://schemas.android.com/tools"
     android:background="@drawable/shape_white_top_20"
     android:orientation="vertical">
 
@@ -31,6 +32,7 @@
         android:text="@string/add_room_chat_black"
         android:gravity="center"
         android:visibility="gone"
+        tools:visibility="visible"
         android:textColor="#000"
         android:textSize="16dp" />
 
@@ -40,6 +42,7 @@
         android:layout_height="45dp"
         android:text="@string/never_watcher_the_anchor"
         android:gravity="center"
+        tools:visibility="visible"
         android:visibility="gone"
         android:textColor="#000"
         android:textSize="16dp" />
@@ -61,4 +64,26 @@
         android:textColor="#000"
         android:textSize="16dp" />
 
+    <TextView
+        android:id="@+id/tvSetRoomAdmin"
+        android:layout_width="match_parent"
+        android:layout_height="45dp"
+        android:gravity="center"
+        tools:visibility="visible"
+        android:visibility="gone"
+        android:text="@string/set_room_admin"
+        android:textColor="#000"
+        android:textSize="16dp" />
+
+    <TextView
+        android:id="@+id/tvDeleteRoomAdmin"
+        android:layout_width="match_parent"
+        android:layout_height="45dp"
+        android:gravity="center"
+        tools:visibility="visible"
+        android:visibility="gone"
+        android:text="@string/delete_room_admin"
+        android:textColor="#000"
+        android:textSize="16dp" />
+
 </LinearLayout>

+ 18 - 3
baseswago/src/main/res/layout/dialog_person_data.xml

@@ -89,11 +89,26 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_marginTop="5dp"
-                app:layout_constraintEnd_toStartOf="@+id/ivVip"
+                app:layout_constraintEnd_toStartOf="@+id/ivRoomAdmin"
                 app:layout_constraintStart_toStartOf="parent"
                 app:layout_constraintTop_toBottomOf="@+id/tvAccount" />
 
 
+            <ImageView
+                android:id="@+id/ivRoomAdmin"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="5dp"
+                android:src="@mipmap/ic_room_admin"
+                android:visibility="gone"
+                app:layout_constraintEnd_toStartOf="@+id/ivVip"
+                app:layout_constraintStart_toEndOf="@+id/tvLevelView"
+                app:layout_constraintTop_toTopOf="@+id/tvLevelView"
+                app:layout_constraintBottom_toBottomOf="@+id/tvLevelView"
+                tools:visibility="visible" />
+
+
+
             <ImageView
                 android:id="@+id/ivVip"
                 android:layout_width="wrap_content"
@@ -102,7 +117,7 @@
                 android:src="@mipmap/vip"
                 android:visibility="gone"
                 app:layout_constraintEnd_toStartOf="@+id/ivCrown"
-                app:layout_constraintStart_toEndOf="@+id/tvLevelView"
+                app:layout_constraintStart_toEndOf="@+id/ivRoomAdmin"
                 app:layout_constraintTop_toTopOf="@+id/tvLevelView"
                 app:layout_constraintBottom_toBottomOf="@+id/tvLevelView"
                 tools:visibility="visible" />
@@ -161,7 +176,7 @@
                 app:layout_constraintBottom_toBottomOf="@+id/tvLevelView"
                 app:layout_constraintTop_toTopOf="@+id/tvLevelView"
                 app:layout_constraintStart_toEndOf="@+id/tvAgent"
-                app:layout_constraintEnd_toEndOf="parent"
+               app:layout_constraintEnd_toEndOf="parent"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"/>
 

BIN
baseswago/src/main/res/mipmap-xxhdpi/ic_room_admin.png


+ 10 - 0
baseswago/src/main/res/values-ar/strings.xml

@@ -198,4 +198,14 @@
     <string name="lian_mai_ing_sure_close">أنت حاليًا متصل بالميكروفون، هل أنت متأكد أنك تريد إغلاق غرفة البث؟</string>
     <string name="anchor_refuse_you_lian_mai">رفض المضيف طلبك للاتصال بالميكروفون</string>
     <string name="delete_conversation">هل تريد حذف هذه المحادثة؟</string>
+    <string name="exclusive_entrance_effect">تأثير الدخول</string>
+    <string name="room_manager">مشرف الغرفة</string>
+    <string name="set_room_admin">تعيين مشرف الغرفة</string>
+    <string name="delete_room_admin">إلغاء مشرف الغرفة</string>
+    <string name="set_room_manager_success">تعيين مشرف الغرفة بالنجاح</string>
+    <string name="delete_room_manager_success">إلغاء مشرف الغرفة بالنجاح</string>
+    <string name="do_delete_room_admin">هل تتأكد من إلغاء مشرف الغرفة؟</string>
+    <string name="become_room_manager">%s يصبح مشرف الغرفة</string>
+    <string name="ban_live_reason">سبب الحظر: %s</string>
+    <string name="ban_live_time">مدة الحظر: %s</string>
 </resources>

+ 10 - 0
baseswago/src/main/res/values-in/strings.xml

@@ -202,4 +202,14 @@
     <string name="lian_mai_ing_sure_close">Anda sedang telepon, apakah yakin menyelesaikan live?</string>
     <string name="anchor_refuse_you_lian_mai">Host telah menolak permohonan telepon Anda.</string>
     <string name="delete_conversation">Apakah Anda ingin menghapus percakapan ini?</string>
+    <string name="exclusive_entrance_effect">Efek masuk</string>
+    <string name="room_manager">Admin ruangan</string>
+    <string name="set_room_admin">Mengatur admin ruangan</string>
+    <string name="delete_room_admin">Hapus admin ruangan</string>
+    <string name="set_room_manager_success">Mengatur admin ruangan sukses</string>
+    <string name="delete_room_manager_success">Hapus admin ruangan sukses</string>
+    <string name="do_delete_room_admin">Yakin hapus pengguna ini dari admin ruangan?</string>
+    <string name="become_room_manager">%s menjadi admin ruangan ini</string>
+    <string name="ban_live_reason">Alasan Banned Live:%s</string>
+    <string name="ban_live_time">Durasi Banned Live:%s</string>
 </resources>

+ 10 - 0
baseswago/src/main/res/values-ms/strings.xml

@@ -199,4 +199,14 @@
     <string name="lian_mai_ing_sure_close">Anda sedang menyambung ke mikrofon, adakah anda pasti mahu menutup ruang langsung?</string>
     <string name="anchor_refuse_you_lian_mai">Sauh menolak permohonan anda untuk Lianmai</string>
     <string name="delete_conversation">Adakah anda mahu memadamkan perbualan ini?</string>
+    <string name="exclusive_entrance_effect">Kesan Khas Kemasukan</string>
+    <string name="room_manager">Pentadbir bilik</string>
+    <string name="set_room_admin">Tetapkan pentadbir bilik</string>
+    <string name="delete_room_admin">Padamkan pentadbir bilik</string>
+    <string name="set_room_manager_success">Pentadbir bilik berjaya diselesaikan</string>
+    <string name="delete_room_manager_success">entadbir bilik berjaya dihapuskan</string>
+    <string name="do_delete_room_admin">Adakah anda pasti mahu memadamkan identiti pentadbir pengguna?</string>
+    <string name="become_room_manager">%s menjadi Pentadbir Bilik</string>
+    <string name="ban_live_reason">Sebab Penyiaran Terlarang:%s</string>
+    <string name="ban_live_time">Masa Terlarang:%s</string>
 </resources>

+ 10 - 0
baseswago/src/main/res/values-zh/strings.xml

@@ -198,4 +198,14 @@
     <string name="lian_mai_ing_sure_close">您当前正在连麦,确定要关闭直播间么?</string>
     <string name="anchor_refuse_you_lian_mai">主播拒绝了您的连麦申请</string>
     <string name="delete_conversation">您想要删除该聊天么?</string>
+    <string name="exclusive_entrance_effect">入场特效</string>
+    <string name="room_manager">房间管理员</string>
+    <string name="set_room_admin">设置房间管理员</string>
+    <string name="delete_room_admin">删除房间管理员</string>
+    <string name="set_room_manager_success">房间管理员设置成功</string>
+    <string name="delete_room_manager_success">房间管理员删除成功</string>
+    <string name="do_delete_room_admin">您确定要删除该用户管理员身份么?</string>
+    <string name="become_room_manager">%s成为该房间管理员</string>
+    <string name="ban_live_reason">禁播原因:%s</string>
+    <string name="ban_live_time">禁播时长:%s</string>
 </resources>

+ 10 - 1
baseswago/src/main/res/values/strings.xml

@@ -219,6 +219,15 @@
     <string name="anchor_refuse_you_lian_mai">The anchor rejected your application for MIC-connected</string>
     <string name="delete_conversation">Do you want to delete this conversation?</string>
 
-    <string name="exclusive_entrance_effect">Exclusive entrance effect</string>
+    <string name="exclusive_entrance_effect">Entry special effects</string>
+    <string name="room_manager">Room administrator</string>
+    <string name="set_room_admin">Set up room administrator</string>
+    <string name="delete_room_admin">delete room administrator</string>
+    <string name="set_room_manager_success">Set room administrator successfully</string>
+    <string name="delete_room_manager_success">Cancel room administrator successfully</string>
+    <string name="do_delete_room_admin">Are you sure about canceling room administrator??</string>
+    <string name="become_room_manager">%s becomes the room administrator</string>
+    <string name="ban_live_reason">Reason for banning:%s</string>
+    <string name="ban_live_time">Block time:%s</string>
 
 </resources>

+ 20 - 8
build.gradle

@@ -1,18 +1,24 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 buildscript {
-    ext.kotlin_version = "1.5.21"
+    ext.kotlin_version = "1.7.10"
     repositories {
         google()
-        maven { url 'https://jitpack.io' }
+        maven {
+            allowInsecureProtocol = true
+            url 'https://jitpack.io'
+        }
         mavenCentral()
-        maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" }
+        maven {
+            allowInsecureProtocol = true
+            url "https://mirrors.tencent.com/nexus/repository/maven-public/"
+        }
     }
     dependencies {
-        classpath "com.android.tools.build:gradle:4.2.2"
-        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30'
+        classpath "com.android.tools.build:gradle:7.2.1"
+        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10'
         classpath 'com.google.gms:google-services:4.3.10'
         classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
-        classpath 'com.google.firebase:perf-plugin:1.4.0'
+        classpath 'com.google.firebase:perf-plugin:1.4.1'
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
     }
@@ -21,9 +27,15 @@ buildscript {
 allprojects {
     repositories {
         google()
-        maven { url 'https://jitpack.io' }
+        maven {
+            allowInsecureProtocol = true
+            url 'https://jitpack.io'
+        }
         mavenCentral()
-        maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" }
+        maven {
+            allowInsecureProtocol = true
+            url "https://mirrors.tencent.com/nexus/repository/maven-public/"
+        }
     }
 
     configurations.all{

+ 1 - 1
gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,6 @@
 #Sat Jul 17 08:43:24 CST 2021
 distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
 distributionPath=wrapper/dists
 zipStorePath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME

+ 14 - 0
home/src/main/java/com/swago/home/MineFragment.kt

@@ -34,6 +34,8 @@ class MineFragment : BaseXFragment<FragmentMineBinding>() {
             binding.tvXWithdrawal.visibility = View.VISIBLE
         }
 
+
+
         binding.llFans.setOnClickListener(object: NoDoubleClickListener(){
             override fun onClick() {
                 ARouter.getInstance()
@@ -122,6 +124,12 @@ class MineFragment : BaseXFragment<FragmentMineBinding>() {
             }
         })
 
+        binding.tvRoomManager.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                ARouter.getInstance().build(ARouteConstant.User.roomManager).navigation()
+            }
+        })
+
         payVm.getBenefit()
     }
 
@@ -168,6 +176,12 @@ class MineFragment : BaseXFragment<FragmentMineBinding>() {
             }else{
                 binding.ivCup.visibility = View.GONE
             }
+
+            if (it.user_type== 1){
+                binding.tvRoomManager.visibility = View.VISIBLE
+            }else{
+                binding.tvRoomManager.visibility = View.GONE
+            }
         }
 
         payVm.benefitLiveData.observe(this){

+ 16 - 0
home/src/main/res/layout/fragment_mine.xml

@@ -361,6 +361,22 @@
             android:textSize="16dp" />
 
 
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvRoomManager"
+            android:layout_width="match_parent"
+            android:layout_height="50dp"
+            android:visibility="gone"
+            tools:visibility="visible"
+            android:drawableStart="@mipmap/icon_mine_room_manager"
+            android:drawableEnd="@mipmap/more_small"
+            android:drawablePadding="5dp"
+            android:gravity="center_vertical"
+            android:paddingStart="20dp"
+            android:paddingEnd="20dp"
+            android:text="@string/room_manager"
+            android:textColor="#000"
+            android:textSize="16dp" />
+
         <com.swago.baseswago.cusview.MediumTextView
             android:id="@+id/tvCustomService"
             android:layout_width="match_parent"

BIN
home/src/main/res/mipmap-xxhdpi/icon_mine_room_manager.webp


BIN
room/src/main/assets/dandao_one.svga


BIN
room/src/main/assets/dandao_three.svga


BIN
room/src/main/assets/dandao_two.svga


+ 59 - 2
room/src/main/java/com/swago/room/adapter/RoomChatAdapter.kt

@@ -6,19 +6,20 @@ import android.os.Build
 import android.text.*
 import android.text.method.LinkMovementMethod
 import android.text.style.ClickableSpan
+import android.text.style.ForegroundColorSpan
 import android.text.style.ImageSpan
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
 import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.content.ContextCompat
 import com.chad.library.adapter.base.BaseQuickAdapter
 import com.chad.library.adapter.base.BaseViewHolder
 import com.swago.baseswago.cusview.LiangView
 import com.swago.baseswago.cusview.SwagoLevelView
 import com.swago.baseswago.im.IRoomChat
 import com.swago.baseswago.im.RoomMsgType
-import com.swago.baseswago.model.im.FollowSuccessMsgBean
 import com.swago.baseswago.model.im.RoomChatMsgBean
 import com.swago.baseswago.model.im.UserJoinRoomBean
 import com.swago.formatAr
@@ -50,6 +51,7 @@ class RoomChatAdapter :
         const val IS_SERVICE = "service"
         const val IS_CROWN = "crown"
         const val IS_CUP = "cup"
+        const val IS_ADMIN = "admin"
     }
 
     init {
@@ -60,6 +62,7 @@ class RoomChatAdapter :
         localImageKey.add(IS_SERVICE)
         localImageKey.add(IS_CROWN)
         localImageKey.add(IS_CUP)
+        localImageKey.add(IS_ADMIN)
     }
 
     var showUserInfoDialog: ((iChatMsg: IRoomChat) -> Unit)? = null
@@ -73,6 +76,12 @@ class RoomChatAdapter :
             when (item.getMsgType()) {
                 RoomMsgType.ROOM_CHAT_TEXT -> {
                     val sb = StringBuffer()
+                    if (item is RoomChatMsgBean&&item.isAdmin==1) {
+                        count++
+                        sb.append("<img src='" + "file:///xx/")
+                            .append(IS_ADMIN).append(".png")
+                            .append("'> ")
+                    }
 
                     if (item.getIsPrettyId()) {
                         count++
@@ -174,6 +183,17 @@ class RoomChatAdapter :
                     span = SpannableString(item.getMsgContent())
                     setBackgroundRes(R.id.tvContent, R.drawable.shape_20000000_14)
                 }
+                RoomMsgType.BECOME_MANAGER -> {
+                    span = SpannableString(item.getMsgContent())
+                    setBackgroundRes(R.id.tvContent, R.drawable.shape_20000000_14)
+                    span.setSpan(
+                        ForegroundColorSpan(
+                            ContextCompat.getColor(
+                                itemView.context,
+                                R.color._ff9300
+                            )
+                        ), 0, item.getMsgContent().length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+                }
                 RoomMsgType.FOLLOW_MESSAGE -> {
                     setBackgroundRes(R.id.tvContent, R.drawable.shape_20000000_14)
                     val sb = StringBuffer()
@@ -270,6 +290,13 @@ class RoomChatAdapter :
                 RoomMsgType.USER_ENTER_ROOM -> {
                     val sb = StringBuffer()
 
+                    if (item is UserJoinRoomBean&&item.isAdmin==1) {
+                        count++
+                        sb.append("<img src='" + "file:///xx/")
+                            .append(IS_ADMIN).append(".png")
+                            .append("'> ")
+                    }
+
                     if (item.getIsPrettyId()) {
                         count++
                         sb.append("<img src='" + "file:///xx/")
@@ -416,7 +443,14 @@ class RoomChatAdapter :
                         end,
                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
                     )
-                } else if(imageSpan.source != null && imageSpan!!.source!!.contains(PRETTY_KEY)){
+                }else if(imageSpan.source != null && imageSpan!!.source!!.contains(IS_ADMIN)){
+                    span.setSpan(
+                        setAdmin(helper.itemView as ViewGroup),
+                        start,
+                        end,
+                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+                    )
+                }  else if(imageSpan.source != null && imageSpan!!.source!!.contains(PRETTY_KEY)){
                     span.setSpan(
                         setPrettyId(item.getSenderId(), helper.itemView as ViewGroup),
                         start,
@@ -469,6 +503,29 @@ class RoomChatAdapter :
         }
     }
 
+    private fun setAdmin(viewGroup: ViewGroup): CustomImageSpan {
+        var bm = iconBitmapCachePool["admin"]
+        if (bm == null) {
+            val view = LayoutInflater.from(mContext)
+                .inflate(R.layout.item_admin, viewGroup, false) as ConstraintLayout
+            view.measure(
+                View.MeasureSpec.makeMeasureSpec(
+                    (1 shl 30) - 1,
+                    View.MeasureSpec.AT_MOST
+                ),
+                View.MeasureSpec.makeMeasureSpec(
+                    (1 shl 30) - 1,
+                    View.MeasureSpec.AT_MOST
+                )
+            )
+            bm = convertViewToBitmap(view)
+            if (bm != null) {
+                iconBitmapCachePool["admin"] = bm
+            }
+        }
+        return CustomImageSpan(mContext, bm, CustomImageSpan.ALIGN_FONTCENTER)
+    }
+
     private fun setCup(viewGroup: ViewGroup): CustomImageSpan {
         var bm = iconBitmapCachePool["cup"]
         if (bm == null) {

+ 1 - 1
room/src/main/java/com/swago/room/anchor/AnchorRoomActivity.kt

@@ -146,7 +146,7 @@ class AnchorRoomActivity : AbsAnchorActivity<ActivityAnchorRoomBinding, IRoomInf
         }
 
         msgVm.forceCloseAnchorRoom = {
-            ForceCloseRoomDialog.newInstance(it)
+            ForceCloseRoomDialog.newInstance(it.closedReason,it.closeTime)
                 .show(supportFragmentManager, "ForceCloseRoomDialog")
         }
 

+ 2 - 1
room/src/main/java/com/swago/room/anchor/AnchorRoomFragment.kt

@@ -4,6 +4,7 @@ import android.widget.Toast
 import com.swago.baseswago.PersonDataDFragment
 import com.swago.baseswago.agora.AgoraManager
 import com.swago.baseswago.baseroom.IRoomInfo
+import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.model.live.pk.ProcessPKModel
 import com.swago.baseswago.model.live.pk.PunishPKModel
 import com.swago.baseswago.model.live.pk.StartPKModel
@@ -74,7 +75,7 @@ class AnchorRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
         }
 
         (iHeader as ComHeaderView).showUserInfo = {
-            PersonDataDFragment.newInstance(it, isAnchor = true, inRoom = true)
+            PersonDataDFragment.newInstance(it, isAnchor = true, inRoom = true,SwagoRoomManager.iRoomInfo?.getRoomId()?:"")
                 .apply {
                     this.openGiftDialog = {nickName, userId ->
                         GiftDialog.newInstance(

+ 1 - 7
room/src/main/java/com/swago/room/base/BaseComFragment.kt

@@ -203,7 +203,7 @@ abstract class BaseComFragment<T : FragmentBaseComBinding> : BaseXFragment<T>(),
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
                 isAnchor = iRoomInfo.getAnchorId() == UserInfo.getUserInfo()?.id
             }
-            PersonDataDFragment.newInstance(it.getSenderId(), isAnchor = isAnchor, inRoom = true)
+            PersonDataDFragment.newInstance(it.getSenderId(), isAnchor = isAnchor, inRoom = true,SwagoRoomManager.iRoomInfo?.getRoomId()?:"")
                 .apply {
                     this.openGiftDialog = { nickName, userId ->
                         openGiftDialog(nickName, userId)
@@ -306,12 +306,6 @@ abstract class BaseComFragment<T : FragmentBaseComBinding> : BaseXFragment<T>(),
                 }
             }.show(childFragmentManager,"RedEnvelopResultDialog")
         }
-
-        //用户在直播间是否被禁言权限
-        roomVm.roomAuthLiveData.observe(this) {
-            isForbid = it.is_forbid == 1
-        }
-
     }
 
     private fun openGiftDialog(nickName: String, userId: String) {

+ 6 - 0
room/src/main/java/com/swago/room/bean/UserRoomModel.kt

@@ -16,6 +16,8 @@ class UserRoomModel :  IRoomInfo{
 
     var momentModel:MomentModel? = null
 
+    var userInRoomIsAdmin:Int = 0//用户自己是否是直播间管理员
+
     override fun getAnchorName(): String {
         return roomModel?.user_name?:""
     }
@@ -115,4 +117,8 @@ class UserRoomModel :  IRoomInfo{
            false
         }
     }
+
+    override fun getRoomAdmin(): Int {
+        return userInRoomIsAdmin
+    }
 }

+ 6 - 2
room/src/main/java/com/swago/room/dialog/ForceCloseRoomDialog.kt

@@ -7,6 +7,7 @@ import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.dialog.BaseXDFragment
 import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.NoDoubleClickListener
+import com.swago.baseswago.util.TimeUtil
 import com.swago.room.R
 import com.swago.room.databinding.DialogForceCloseRoomBinding
 
@@ -22,9 +23,10 @@ class ForceCloseRoomDialog : BaseXDFragment<DialogForceCloseRoomBinding>(),
     var time = 5
 
     companion object{
-        fun newInstance(content:String): ForceCloseRoomDialog {
+        fun newInstance(content:String,closeTime:Long): ForceCloseRoomDialog {
             val args = Bundle()
             args.putString("msg",content)
+            args.putLong("time",closeTime)
             val fragment = ForceCloseRoomDialog()
             fragment.arguments = args
             return fragment
@@ -38,7 +40,9 @@ class ForceCloseRoomDialog : BaseXDFragment<DialogForceCloseRoomBinding>(),
     override fun initLiveData() {
         arguments?.let {
             val msg = it.getString("msg","")
-            binding.tvMsg.text = msg
+            val time = it.getLong("time",0)
+            binding.tvMsg.text = AppContext.getContext().resources.getString(R.string.ban_live_reason).format(msg)
+            binding.tvTime.text = AppContext.getContext().resources.getString(R.string.ban_live_time).format(TimeUtil.convertMinSecond(time))
             binding.tvClose.text = AppContext.getContext().resources.getString(R.string.got_it_ss).format(time)
         }
 

+ 2 - 0
room/src/main/java/com/swago/room/dialog/SendMsgDialog.kt

@@ -123,6 +123,7 @@ class SendMsgDialog : BaseXDFragment<DialogSendMsgBinding>() {
                         roomChatMsgBean.isOfficial = it.is_official
                         roomChatMsgBean.isCrown = it.is_crown
                         roomChatMsgBean.isCup = it.is_cup
+                        roomChatMsgBean.isAdmin = SwagoRoomManager.iRoomInfo?.getRoomAdmin()?:0
                         addSenderMsgToRoomChatList?.invoke(roomChatMsgBean)
 
                         val jsonObject = JSONObject()
@@ -137,6 +138,7 @@ class SendMsgDialog : BaseXDFragment<DialogSendMsgBinding>() {
                         jsonObject.put("isOfficial", it.is_official)
                         jsonObject.put("isCrown", it.is_crown)
                         jsonObject.put("isCup", it.is_cup)
+                        jsonObject.put("isAdmin", SwagoRoomManager.iRoomInfo?.getRoomAdmin()?:0)
 
                         val jsonObjectType = JSONObject()
                         jsonObjectType.put("type", room_chat_text)

+ 207 - 3
room/src/main/java/com/swago/room/giftdandao/GiftDanDaoView.kt

@@ -13,13 +13,19 @@ import android.view.View
 import android.view.animation.BounceInterpolator
 import android.view.animation.DecelerateInterpolator
 import android.widget.FrameLayout
+import android.widget.ImageView
+import android.widget.Toast
 import com.bumptech.glide.Glide
+import com.opensource.svgaplayer.SVGADrawable
+import com.opensource.svgaplayer.SVGAParser
+import com.opensource.svgaplayer.SVGAVideoEntity
 import com.swago.baseswago.model.live.gift.IMGiftModel
 import com.swago.baseswago.util.AppContext
 import com.swago.baseswago.util.LogUtil
 import com.swago.baseswago.util.UserInfo
 import com.swago.room.R
 import com.swago.room.databinding.ViewItemGiftBinding
+import java.io.File
 
 /**
  *@date 2022/1/22 16:57
@@ -29,11 +35,16 @@ class GiftDanDaoView : FrameLayout {
 
     var isBusy = false
     private var binding: ViewItemGiftBinding? = null
+    private var svgParser: SVGAParser? = null
 
     private var giftCount = 0
 
     var imCurrentGiftModel: IMGiftModel? = null
 
+    private val imageViewData by lazy {
+        ArrayList<ImageView>()
+    }
+
     constructor(context: Context) : super(context) {
         initView(context)
     }
@@ -41,12 +52,19 @@ class GiftDanDaoView : FrameLayout {
     constructor(context: Context, mAttributeSet: AttributeSet?) : super(context, mAttributeSet) {
         initView(context)
     }
+    //1 499..998   2 999..9998  3 9999
+    private var svgaPlayWhichType = 0
 
     private var vibrator: Vibrator? = null
 
     private fun initView(context: Context) {
         vibrator = context.getSystemService(Service.VIBRATOR_SERVICE) as Vibrator
         binding = ViewItemGiftBinding.inflate(LayoutInflater.from(context), this, true)
+        svgParser = SVGAParser(context)
+        for (i in 0..5){
+            val imageView = ImageView(context)
+            imageViewData.add(imageView)
+        }
     }
 
     fun addData(imGiftModel: IMGiftModel) {
@@ -75,16 +93,74 @@ class GiftDanDaoView : FrameLayout {
             }
             LogUtil.d("礼物个数", "x${imGiftModel.giftNum}")
             clItemGift.visibility = View.VISIBLE
+            imCurrentGiftModel = imGiftModel
+            ivBg.visibility = View.INVISIBLE
+            svgaImageView.visibility = View.INVISIBLE
+            tvNum.visibility = View.INVISIBLE
+            llNum.visibility = View.INVISIBLE
+            llNum.removeAllViews()
+
             if (imCurrentGiftModel != null && imGiftModel.isCombo == 1) {
                 giftCount += imGiftModel.giftOneceNum
-                tvNum.text = "x${giftCount}"
             } else {
                 //执行进场动画
                 giftCount = imGiftModel.giftOneceNum
-                tvNum.text = "x${giftCount}"
                 giftEnterAnimator.start()
             }
-            imCurrentGiftModel = imGiftModel
+
+            //设置背景
+            if (giftCount in 1..198){
+                ivBg.visibility = View.VISIBLE
+                tvNum.visibility = View.VISIBLE
+                tvNum.text = "x${giftCount}"
+                ivBg.setImageResource(R.mipmap.bg_dan_dao_one)
+            }
+            if (giftCount in 199..498){
+                ivBg.visibility = View.VISIBLE
+                tvNum.visibility = View.VISIBLE
+                tvNum.text = "x${giftCount}"
+                ivBg.setImageResource(R.mipmap.bg_dan_dao_two)
+            }
+            if (giftCount in 499..998){
+                svgaImageView.visibility = View.VISIBLE
+                llNum.visibility = View.VISIBLE
+                loadGiftNum(giftCount)
+                if (svgaPlayWhichType!=1){
+                    svgaPlayWhichType = 1
+                    playSvg("dandao_one.svga")
+                }else{
+                    if (!svgaImageView.isAnimating){
+                        playSvg("dandao_one.svga")
+                    }
+                }
+            }
+            if (giftCount in 999..9998){
+                svgaImageView.visibility = View.VISIBLE
+                llNum.visibility = View.VISIBLE
+                loadGiftNum(giftCount)
+                if (svgaPlayWhichType!=2){
+                    svgaPlayWhichType = 2
+                    playSvg("dandao_two.svga")
+                }else{
+                    if (!svgaImageView.isAnimating){
+                        playSvg("dandao_two.svga")
+                    }
+                }
+            }
+            if (giftCount >9998){
+                svgaImageView.visibility = View.VISIBLE
+                llNum.visibility = View.VISIBLE
+                loadGiftLargeNum(giftCount)
+                if (svgaPlayWhichType!=3){
+                    svgaPlayWhichType = 3
+                    playSvg("dandao_three.svga")
+                }else{
+                    if (!svgaImageView.isAnimating){
+                        playSvg("dandao_three.svga")
+                    }
+                }
+            }
+
 
             clItemGift.removeCallbacks(showRunnable)
             clItemGift.postDelayed(showRunnable, 3000)
@@ -119,6 +195,106 @@ class GiftDanDaoView : FrameLayout {
         }
     }
 
+    private fun loadGiftLargeNum(giftCount: Int) {
+        binding?.apply {
+            val giftContStr = giftCount.toString()
+            if (giftContStr.length>imageViewData.size){
+                imageViewData.clear()
+                for (i in 0..giftContStr.length){
+                    val imageView = ImageView(context)
+                    imageViewData.add(imageView)
+                }
+            }
+            imageViewData[0].setImageResource(R.mipmap.ic_dan_dao_x)
+            llNum.addView(imageViewData[0])
+            giftCount.toString().toCharArray().forEachIndexed {  index,char ->
+                when(char){
+                    '0' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_zero)
+                    }
+                    '1' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_one)
+                    }
+                    '2' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_two)
+                    }
+                    '3' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_three)
+                    }
+                    '4' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_four)
+                    }
+                    '5' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_five)
+                    }
+                    '6' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_six)
+                    }
+                    '7' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_seven)
+                    }
+                    '8' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_eight)
+                    }
+                    '9' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_big_nine)
+                    }
+                }
+                llNum.addView(imageViewData[index+1])
+            }
+        }
+    }
+
+    private fun loadGiftNum(giftCount: Int) {
+        binding?.apply {
+            val giftContStr = giftCount.toString()
+            if (giftContStr.length>imageViewData.size){
+                imageViewData.clear()
+                for (i in 0..giftContStr.length){
+                    val imageView = ImageView(context)
+                    imageViewData.add(imageView)
+                }
+            }
+            imageViewData[0].setImageResource(R.mipmap.ic_dan_dao_x)
+            llNum.addView(imageViewData[0])
+            giftCount.toString().toCharArray().forEachIndexed {  index,char ->
+                when(char){
+                    '0' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_zero)
+                    }
+                    '1' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_one)
+                    }
+                    '2' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_two)
+                    }
+                    '3' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_three)
+                    }
+                    '4' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_four)
+                    }
+                    '5' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_five)
+                    }
+                    '6' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_six)
+                    }
+                    '7' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_seven)
+                    }
+                    '8' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_eight)
+                    }
+                    '9' -> {
+                        imageViewData[index+1].setImageResource(R.mipmap.ic_dan_dao_nine)
+                    }
+                }
+                llNum.addView(imageViewData[index+1])
+            }
+        }
+    }
+
 
     private val giftEnterAnimator by lazy {
         val tx = ObjectAnimator.ofFloat(
@@ -155,12 +331,40 @@ class GiftDanDaoView : FrameLayout {
         }
     }
 
+    private fun playSvg(path:String){
+        svgParser?.let {
+            it.decodeFromAssets(path,object:SVGAParser.ParseCompletion{
+                override fun onComplete(videoItem: SVGAVideoEntity) {
+                    binding?.apply {
+                        val drawable = SVGADrawable(videoItem)
+                        svgaImageView.setImageDrawable(drawable)
+                        svgaImageView.loops = 99999
+                        svgaImageView.startAnimation()
+                    }
+                }
+
+                override fun onError() {
+                    Toast.makeText(AppContext.getContext(), "播放异常", Toast.LENGTH_SHORT).show()
+                }
+            },object:SVGAParser.PlayCallback{
+                override fun onPlay(file: List<File>) {
+                }
+
+            })
+
+        }
+    }
+
 
     fun clear() {
         vibrator?.cancel()
         isBusy = false
         imCurrentGiftModel = null
+        svgaPlayWhichType = 0
         binding?.apply {
+            if (svgaImageView.isAnimating){
+                svgaImageView.stopAnimation()
+            }
             clWinPrize.visibility = View.INVISIBLE
             clItemGift.visibility = View.INVISIBLE
             clWinPrize.removeCallbacks(winPrizeRunnable)

+ 32 - 18
room/src/main/java/com/swago/room/user/UserRoomFragment.kt

@@ -9,6 +9,7 @@ import com.swago.baseswago.baseroom.IRoomInfo
 import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.dialog.BenefitBagDialog
 import com.swago.baseswago.dialog.ReportDialog
+import com.swago.baseswago.model.UserInfoModel
 import com.swago.baseswago.model.im.UserJoinRoomBean
 import com.swago.baseswago.model.live.pk.ProcessPKModel
 import com.swago.baseswago.model.live.pk.PunishPKModel
@@ -19,6 +20,7 @@ import com.swago.baseswago.util.NoDoubleClickListener
 import com.swago.baseswago.util.UserInfo
 import com.swago.room.R
 import com.swago.room.base.BaseComFragment
+import com.swago.room.bean.UserRoomModel
 import com.swago.room.databinding.FragmentBaseComBinding
 import com.swago.room.dialog.ShareDialog
 import com.swago.room.game.GameListDialog
@@ -106,23 +108,17 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
         }
 
         footerView.openGameFun = {
-//            if (gameList.size == 1){
-//                //直接弹出游戏弹窗
-//                setGameDefaultData(0)
-//            }else{
-//                //弹出游戏选择弹窗
-//                GameListDialog.newInstance(gameList).apply {
-//                    this.openDialogFun = {
-//                        openGameDialog()
-//                    }
-//                }.show(childFragmentManager,"GameListDialog")
-//            }
-            val data = UserJoinRoomBean()
-            data.senderLevel = 80
-            data.senderName = "Sw1234dfdsfsfssdfsfd"
-            data.isBenefit = 0
-            data.userAvatar = "https://developer.android.google.cn/static/images/home/android-logo-13-twotone-1_1440.png"
-            msgVm.joinRoomManager.addJoinRoomData(data)
+            if (gameList.size == 1){
+                //直接弹出游戏弹窗
+                setGameDefaultData(0)
+            }else{
+                //弹出游戏选择弹窗
+                GameListDialog.newInstance(gameList).apply {
+                    this.openDialogFun = {
+                        openGameDialog()
+                    }
+                }.show(childFragmentManager,"GameListDialog")
+            }
         }
 
         footerView.openShareFun = {
@@ -156,9 +152,27 @@ class UserRoomFragment : BaseComFragment<FragmentBaseComBinding>() {
             (iHeader as ComHeaderView).setFollow()
         }
 
+        //用户在直播间是否被禁言权限
+        roomVm.roomAuthLiveData.observe(this) {
+            isForbid = it.is_forbid == 1 || UserInfo.getUserInfo()?.broadcast_msg_status==1
+            SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
+                if (iRoomInfo is UserRoomModel){
+                    iRoomInfo.userInRoomIsAdmin = it.is_room_admin
+                }
+            }
+        }
+
+        msgVm.setOrDeleteRoomAdmin = {
+            SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
+                if (iRoomInfo is UserRoomModel){
+                    iRoomInfo.userInRoomIsAdmin = it
+                }
+            }
+        }
+
 
         (iHeader as ComHeaderView).showUserInfo = {
-            PersonDataDFragment.newInstance(it, isAnchor = false, inRoom = true)
+            PersonDataDFragment.newInstance(it, isAnchor = false, inRoom = true,SwagoRoomManager.iRoomInfo?.getRoomId()?:"")
                 .apply {
                     this.openGiftDialog = { nickName, userId ->
                         GiftDialog.newInstance(

+ 40 - 3
room/src/main/java/com/swago/room/vm/MsgVm.kt

@@ -8,6 +8,7 @@ import com.swago.baseswago.baseroom.viewmodel.AbsMsgVm
 import com.swago.baseswago.im.IRoomChat
 import com.swago.baseswago.im.ImConstant.anchor_close_room
 import com.swago.baseswago.im.ImConstant.cancel_forbid_speak
+import com.swago.baseswago.im.ImConstant.delete_room_admin
 import com.swago.baseswago.im.ImConstant.follow_anchor_success
 import com.swago.baseswago.im.ImConstant.forbid_speak
 import com.swago.baseswago.im.ImConstant.force_close_live_room
@@ -18,6 +19,7 @@ import com.swago.baseswago.im.ImConstant.red_envelope
 import com.swago.baseswago.im.ImConstant.red_envelope_broadcast
 import com.swago.baseswago.im.ImConstant.remove_room
 import com.swago.baseswago.im.ImConstant.room_chat_text
+import com.swago.baseswago.im.ImConstant.set_room_admin
 import com.swago.baseswago.im.ImConstant.svg_gift
 import com.swago.baseswago.im.ImConstant.update_audience
 import com.swago.baseswago.im.ImConstant.user_exit_room
@@ -46,7 +48,7 @@ class MsgVm(application: Application) : AbsMsgVm(application) {
     var anchorRoomClosed: ((data: AnchorRoomClosedBean?) -> Unit)? = null
 
     //强制关播
-    var forceCloseAnchorRoom: ((closedReason: String) -> Unit)? = null
+    var forceCloseAnchorRoom: ((forceCloseModel: ForceCloseModel) -> Unit)? = null
 
     var inComeChange: ((income: String) -> Unit)? = null
 
@@ -60,6 +62,9 @@ class MsgVm(application: Application) : AbsMsgVm(application) {
 
     var newRedEnvelopeCome: ((redEnvelope: RedEnvelope) -> Unit)? = null
 
+    //设置或者取消房间管理员
+    var setOrDeleteRoomAdmin: ((isSet: Int) -> Unit)? = null
+
     //红包传送门
     var openRedEnvelopPortal: ((redEnvelope: RedEnvelope) -> Unit)? = null
 
@@ -134,8 +139,10 @@ class MsgVm(application: Application) : AbsMsgVm(application) {
         //后台强制关播
         imGroupNewMsgListener.handleMsgType<CusNewMsgBean<ForceCloseModel>>(force_close_live_room) {
             SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
-                if (iRoomInfo.getRoomId() == (it.data?.roomId ?: "")) {
-                    forceCloseAnchorRoom?.invoke(it.data?.closedReason ?: "")
+                it.data?.let {
+                    if (iRoomInfo.getRoomId() == (it.roomId)) {
+                        forceCloseAnchorRoom?.invoke(it)
+                    }
                 }
             }
         }
@@ -266,6 +273,36 @@ class MsgVm(application: Application) : AbsMsgVm(application) {
                 }
             }
         }
+
+        //设置管理员
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<BecomeManagerBean>>(set_room_admin) {
+            SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
+                UserInfo.getUserInfo()?.let { userInfo ->
+                    it.data?.let {
+                        if (it.roomId == iRoomInfo.getRoomId()) {
+                            if ( it.receiverId == userInfo.id){
+                                setOrDeleteRoomAdmin?.invoke(1)
+                            }
+                            newChatMsgFun?.invoke(it)
+                        }
+                    }
+                }
+            }
+        }
+
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<ReceiveModel>>(delete_room_admin) {
+            SwagoRoomManager.iRoomInfo?.let { iRoomInfo ->
+                UserInfo.getUserInfo()?.let { userInfo ->
+                    it.data?.let {
+                        if (it.roomId == iRoomInfo.getRoomId() && it.receiverId == userInfo.id) {
+                            setOrDeleteRoomAdmin?.invoke(0)
+                        }
+                    }
+                }
+            }
+        }
+
+
     }
 
     override fun changeRoom(iRoomInfo: IRoomInfo) {

+ 16 - 1
room/src/main/res/layout/dialog_force_close_room.xml

@@ -51,12 +51,27 @@
             android:layout_width="0dp"
             android:layout_height="wrap_content"/>
 
+        <com.swago.baseswago.cusview.RegularTextView
+            android:id="@+id/tvTime"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvMsg"
+            android:layout_marginTop="16dp"
+            android:textSize="14dp"
+            android:textColor="#435568"
+            android:gravity="center"
+            android:layout_marginStart="24dp"
+            android:layout_marginEnd="24dp"
+            tools:text="Your live studio has been closed by the administrator"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
 
         <com.swago.baseswago.cusview.BoldTextView
             android:id="@+id/tvClose"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/tvMsg"
+            app:layout_constraintTop_toBottomOf="@+id/tvTime"
             app:layout_constraintBottom_toBottomOf="parent"
             android:layout_marginBottom="24dp"
             android:layout_marginTop="24dp"

+ 15 - 0
room/src/main/res/layout/item_admin.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <ImageView
+        android:id="@+id/tvAgent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:src="@mipmap/ic_room_admin"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 54 - 20
room/src/main/res/layout/view_item_gift.xml

@@ -12,18 +12,39 @@
         android:id="@+id/clContainer"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/clWinPrize"
-        android:background="@drawable/shape_ffff9300_00ff9300_20"
-        android:layout_marginStart="10dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content">
 
+        <ImageView
+            android:id="@+id/ivBg"
+            android:visibility="gone"
+            tools:visibility="visible"
+            android:layout_marginStart="10dp"
+            tools:src="@mipmap/bg_dan_dao_two"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <com.opensource.svgaplayer.SVGAImageView
+            android:id="@+id/svgaImageView"
+            android:visibility="gone"
+            tools:visibility="visible"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_width="283dp"
+            android:layout_height="60dp"/>
+
         <de.hdodenhof.circleimageview.CircleImageView
             android:id="@+id/ivAvatar"
-            android:layout_marginStart="2dp"
+            android:layout_marginStart="12dp"
             android:layout_marginTop="2dp"
             android:layout_marginBottom="2dp"
             android:src="@mipmap/default_avatar"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             android:layout_width="36dp"
             android:layout_height="36dp"/>
@@ -40,7 +61,7 @@
             android:layout_marginStart="5dp"
             app:layout_constraintStart_toEndOf="@+id/ivAvatar"
             android:layout_marginTop="2dp"
-            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/ivAvatar"
             android:layout_width="80dp"
             android:layout_height="wrap_content"/>
 
@@ -57,7 +78,7 @@
             android:layout_marginStart="5dp"
             app:layout_constraintStart_toEndOf="@+id/ivAvatar"
             android:layout_marginBottom="2dp"
-            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintBottom_toBottomOf="@+id/ivAvatar"
             android:layout_width="80dp"
             android:layout_height="wrap_content"/>
 
@@ -65,29 +86,42 @@
             android:id="@+id/ivGiftIcon"
             android:src="@mipmap/default_avatar"
             app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintStart_toStartOf="parent"
             android:layout_marginStart="128dp"
             app:layout_constraintEnd_toEndOf="parent"
-            android:layout_marginEnd="10dp"
             android:layout_width="40dp"
             android:layout_height="40dp"/>
 
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
+        <TextView
+            android:id="@+id/tvNum"
+            android:textSize="18dp"
+            android:textColor="#fff"
+            android:text="x123456789"
+            android:visibility="invisible"
+            tools:visibility="visible"
+            android:layout_marginStart="5dp"
+            android:textStyle="bold|italic"
+            app:layout_constraintTop_toTopOf="@+id/clContainer"
+            app:layout_constraintStart_toEndOf="@+id/ivGiftIcon"
+            app:layout_constraintBottom_toBottomOf="@+id/clContainer"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
 
-    <TextView
-        android:id="@+id/tvNum"
-        android:textSize="18dp"
-        android:textColor="#fff"
-        android:text="x123456789"
-        android:layout_marginStart="5dp"
-        android:textStyle="bold|italic"
-        app:layout_constraintTop_toTopOf="@+id/clContainer"
-        app:layout_constraintStart_toEndOf="@+id/clContainer"
-        app:layout_constraintBottom_toBottomOf="@+id/clContainer"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"/>
+        <LinearLayout
+            android:id="@+id/llNum"
+            android:layout_marginStart="5dp"
+            android:orientation="horizontal"
+            android:visibility="invisible"
+            tools:visibility="visible"
+            app:layout_constraintTop_toTopOf="@+id/clContainer"
+            app:layout_constraintStart_toEndOf="@+id/ivGiftIcon"
+            app:layout_constraintBottom_toBottomOf="@+id/clContainer"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
+        </LinearLayout>
 
+    </androidx.constraintlayout.widget.ConstraintLayout>
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/clWinPrize"

BIN
room/src/main/res/mipmap-xxhdpi/bg_dan_dao_one.webp


BIN
room/src/main/res/mipmap-xxhdpi/bg_dan_dao_two.webp


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_eight.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_five.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_four.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_nine.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_one.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_seven.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_six.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_three.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_two.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_x.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_big_zero.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_eight.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_five.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_four.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_nine.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_one.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_seven.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_six.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_three.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_two.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_x.png


BIN
room/src/main/res/mipmap-xxhdpi/ic_dan_dao_zero.png


BIN
room/src/main/res/raw/lottieCar.zip


BIN
room/src/main/res/raw/lottieboat.zip


+ 32 - 10
tuikit/src/main/java/com/tencent/qcloud/tim/uikit/modules/chat/layout/input/InputLayout.java

@@ -15,15 +15,17 @@ import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 import android.webkit.MimeTypeMap;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import androidx.annotation.Nullable;
 import androidx.fragment.app.FragmentManager;
 
+import com.swago.baseswago.util.AppContext;
+import com.swago.baseswago.util.UserInfo;
 import com.tencent.imsdk.v2.V2TIMCallback;
 import com.tencent.imsdk.v2.V2TIMConversation;
 import com.tencent.imsdk.v2.V2TIMGroupAtInfo;
 import com.tencent.imsdk.v2.V2TIMManager;
-
 import com.tencent.qcloud.tim.uikit.R;
 import com.tencent.qcloud.tim.uikit.TUIKit;
 import com.tencent.qcloud.tim.uikit.base.IUIKitCallBack;
@@ -530,17 +532,37 @@ public class InputLayout extends InputLayoutUI implements View.OnClickListener,
             }
         } else if (view.getId() == R.id.send_btn) {
             if (mSendEnable) {
-                if (mMessageHandler != null) {
-                    if(mChatLayout.getChatInfo().getType() == V2TIMConversation.V2TIM_GROUP && !atUserInfoMap.isEmpty()) {
-                        //发送时通过获取输入框匹配上@的昵称list,去从map中获取ID list。
-                        List<String> atUserList = updateAtUserList(mTextInput.getMentionList(true));
-                        if (atUserList == null || atUserList.isEmpty()) {
-                            mMessageHandler.sendMessage(MessageInfoUtil.buildTextMessage(mTextInput.getText().toString().trim()));
+                if (UserInfo.INSTANCE.getUserInfo()!=null){
+                    if (UserInfo.INSTANCE.getUserInfo().getPrivate_msg_status()==1){
+                        Toast.makeText(AppContext.getContext(), AppContext.getContext().getResources().getString(R.string.you_are_been_forbid), Toast.LENGTH_SHORT).show();
+                    }else {
+                        if (mMessageHandler != null) {
+                            if(mChatLayout.getChatInfo().getType() == V2TIMConversation.V2TIM_GROUP && !atUserInfoMap.isEmpty()) {
+                                //发送时通过获取输入框匹配上@的昵称list,去从map中获取ID list。
+                                List<String> atUserList = updateAtUserList(mTextInput.getMentionList(true));
+                                if (atUserList == null || atUserList.isEmpty()) {
+                                    mMessageHandler.sendMessage(MessageInfoUtil.buildTextMessage(mTextInput.getText().toString().trim()));
+                                }else {
+                                    mMessageHandler.sendMessage(MessageInfoUtil.buildTextAtMessage(atUserList, mTextInput.getText().toString().trim()));
+                                }
+                            }else {
+                                mMessageHandler.sendMessage(MessageInfoUtil.buildTextMessage(mTextInput.getText().toString().trim()));
+                            }
+                        }
+                    }
+                }else {
+                    if (mMessageHandler != null) {
+                        if(mChatLayout.getChatInfo().getType() == V2TIMConversation.V2TIM_GROUP && !atUserInfoMap.isEmpty()) {
+                            //发送时通过获取输入框匹配上@的昵称list,去从map中获取ID list。
+                            List<String> atUserList = updateAtUserList(mTextInput.getMentionList(true));
+                            if (atUserList == null || atUserList.isEmpty()) {
+                                mMessageHandler.sendMessage(MessageInfoUtil.buildTextMessage(mTextInput.getText().toString().trim()));
+                            }else {
+                                mMessageHandler.sendMessage(MessageInfoUtil.buildTextAtMessage(atUserList, mTextInput.getText().toString().trim()));
+                            }
                         }else {
-                            mMessageHandler.sendMessage(MessageInfoUtil.buildTextAtMessage(atUserList, mTextInput.getText().toString().trim()));
+                            mMessageHandler.sendMessage(MessageInfoUtil.buildTextMessage(mTextInput.getText().toString().trim()));
                         }
-                    }else {
-                        mMessageHandler.sendMessage(MessageInfoUtil.buildTextMessage(mTextInput.getText().toString().trim()));
                     }
                 }
                 mTextInput.setText("");

+ 2 - 0
user/src/main/AndroidManifest.xml

@@ -21,6 +21,8 @@
             android:screenOrientation="portrait"/>
         <activity android:name=".CustomServiceActivity"
             android:screenOrientation="portrait"/>
+        <activity android:name=".roommanager.RoomManagerActivity"
+            android:screenOrientation="portrait"/>
     </application>
 
 </manifest>

+ 84 - 0
user/src/main/java/com/swago/user/roommanager/RoomManagerActivity.kt

@@ -0,0 +1,84 @@
+package com.swago.user.roommanager
+
+import android.graphics.Rect
+import android.view.View
+import androidx.activity.viewModels
+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.swago.baseswago.UserVm
+import com.swago.baseswago.activity.BaseListActivity
+import com.swago.baseswago.constant.ARouteConstant
+import com.swago.baseswago.cusview.SwagoRecyclerView
+import com.swago.baseswago.databinding.LayoutListBinding
+import com.swago.baseswago.dialog.ChoiceDialogFragment
+import com.swago.baseswago.model.ListBean
+import com.swago.baseswago.util.AppContext
+import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.SwagoLoading
+import com.swago.user.R
+
+@Route(path = ARouteConstant.User.roomManager)
+class RoomManagerActivity : BaseListActivity<LayoutListBinding, ListBean>() {
+
+    private val userVm by viewModels<UserVm>()
+
+    override val smartRecyclerView: SwagoRecyclerView<ListBean> by lazy {
+        binding.swagoRv as SwagoRecyclerView<ListBean>
+    }
+    override val adapter: BaseQuickAdapter<ListBean, *> by lazy {
+        RoomManagerAdapter()
+    }
+    override val layoutManager: RecyclerView.LayoutManager by lazy {
+        LinearLayoutManager(this)
+    }
+    override val loadData: (page: Int) -> Unit = {
+        userVm.getRoomManager(it+1)
+    }
+
+    override fun initViewData() {
+        smartRecyclerView.recyclerView?.addItemDecoration(ListItemDecoration())
+        binding.toolbar.tvTitle.text =
+            AppContext.getContext().resources.getString(R.string.room_manager)
+        setBackView(binding.toolbar.ivBack)
+
+        adapter.setOnItemChildClickListener { _, _, position ->
+            if (adapter.data.size>position){
+                ChoiceDialogFragment.newInstance(AppContext.getContext().getString(R.string.do_delete_room_admin)).apply {
+                    this.sureFun = {
+                        SwagoLoading.showLoadingDialog(this@RoomManagerActivity)
+                        userVm.setRoomAdmin(adapter.data[position].admin_user_id,2)
+                    }
+                }.show(supportFragmentManager,"ChoiceDialogFragment")
+
+            }
+        }
+    }
+
+    override fun initLiveData() {
+        userVm.roomManagerListLiveData.observe(this) {
+            if (it == null){
+                smartRecyclerView.onFetchDataError()
+            }else{
+                smartRecyclerView.onFetchDataFinish(it,true)
+            }
+        }
+
+        userVm.setRoomAdminLiveData.observe(this){
+            smartRecyclerView.startRefresh()
+        }
+    }
+
+    inner class ListItemDecoration : RecyclerView.ItemDecoration() {
+        override fun getItemOffsets(
+            outRect: Rect,
+            view: View,
+            parent: RecyclerView,
+            state: RecyclerView.State
+        ) {
+            val margin = DpPxUtil.dip2px(20f)
+            outRect.set(0, margin, 0, 0)
+        }
+    }
+}

+ 22 - 0
user/src/main/java/com/swago/user/roommanager/RoomManagerAdapter.kt

@@ -0,0 +1,22 @@
+package com.swago.user.roommanager
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.swago.baseswago.model.ListBean
+import com.swago.loadUrl
+import com.swago.user.R
+import de.hdodenhof.circleimageview.CircleImageView
+
+class RoomManagerAdapter : BaseQuickAdapter<ListBean, BaseViewHolder>(R.layout.item_room_manager, arrayListOf()) {
+
+    override fun convert(helper: BaseViewHolder?, item: ListBean?) {
+        helper?.apply {
+            item?.let {
+                setText(R.id.tvName,it.admin_user_name)
+                setText(R.id.tvCreateTime,it.created_at)
+                itemView.findViewById<CircleImageView>(R.id.ivAvatar).loadUrl(mContext,it.admin_user_head_img_url)
+                addOnClickListener(R.id.tvDelete)
+            }
+        }
+    }
+}

+ 67 - 0
user/src/main/res/layout/item_room_manager.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="72dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+    
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/ivAvatar"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_marginStart="16dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_width="48dp"
+        android:layout_height="48dp"/>
+
+
+    <com.swago.baseswago.cusview.BoldTextView
+        android:id="@+id/tvName"
+        app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+         android:layout_marginStart="10dp"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_marginTop="18dp"
+        android:textSize="16dp"
+        android:textColor="#131B23"
+        tools:text="Swagodfsdfdfasf"
+        android:maxWidth="200dp"
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <com.swago.baseswago.cusview.RegularTextView
+        android:id="@+id/tvCreateTime"
+        app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+        android:layout_marginStart="10dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_marginBottom="18dp"
+        android:textSize="12dp"
+        android:textColor="#828C9D"
+        tools:text="Swagodfsdfdfasfdsfdfsdfsdfdsfds"
+        android:maxWidth="200dp"
+        android:maxLines="1"
+        android:ellipsize="end"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+    <com.swago.baseswago.cusview.MediumTextView
+        android:id="@+id/tvDelete"
+        android:layout_marginEnd="10dp"
+        android:text="@string/delete"
+        android:textSize="14dp"
+        android:textColor="#435568"
+        android:paddingStart="12dp"
+        android:paddingEnd="12dp"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp"
+        android:gravity="center"
+        android:background="@drawable/shape_afb9c3_stroke_50"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>