honghengqiang vor 2 Jahren
Ursprung
Commit
1b78cf779e
48 geänderte Dateien mit 1639 neuen und 1 gelöschten Zeilen
  1. 12 0
      .idea/misc.xml
  2. 33 0
      baseswago/src/main/java/com/swago/baseswago/agora/AgoraManager.kt
  3. 51 0
      baseswago/src/main/java/com/swago/baseswago/im/GroupMsgParser.kt
  4. 24 0
      baseswago/src/main/java/com/swago/baseswago/im/ImConstant.kt
  5. 11 0
      baseswago/src/main/java/com/swago/baseswago/inter/RoomApi.kt
  6. 15 0
      baseswago/src/main/java/com/swago/baseswago/model/live/pk/ProcessPKModel.kt
  7. 11 0
      baseswago/src/main/java/com/swago/baseswago/model/live/pk/PunishPKModel.kt
  8. 15 0
      baseswago/src/main/java/com/swago/baseswago/model/live/pk/SendPKModel.kt
  9. 17 0
      baseswago/src/main/java/com/swago/baseswago/model/live/pk/StartPKModel.kt
  10. 8 0
      baseswago/src/main/java/com/swago/baseswago/model/live/pk/StopPKModel.kt
  11. 9 0
      baseswago/src/main/res/values-in/strings.xml
  12. 9 0
      baseswago/src/main/res/values-ms/strings.xml
  13. 9 0
      baseswago/src/main/res/values-zh/strings.xml
  14. 9 0
      baseswago/src/main/res/values/strings.xml
  15. BIN
      room/src/main/assets/PK.svga
  16. BIN
      room/src/main/assets/pk_balance.svga
  17. BIN
      room/src/main/assets/pk_fail.svga
  18. BIN
      room/src/main/assets/pk_win.svga
  19. BIN
      room/src/main/assets/progress.svga
  20. 79 1
      room/src/main/java/com/swago/room/anchor/AnchorRoomActivity.kt
  21. 21 0
      room/src/main/java/com/swago/room/pk/IPKListener.kt
  22. 35 0
      room/src/main/java/com/swago/room/pk/PKAcceptDialog.kt
  23. 19 0
      room/src/main/java/com/swago/room/pk/PKAudienceAdapter.kt
  24. 35 0
      room/src/main/java/com/swago/room/pk/PKInviteDialog.kt
  25. 308 0
      room/src/main/java/com/swago/room/pk/PKLayoutView.kt
  26. 12 0
      room/src/main/java/com/swago/room/pk/PKListAdapter.kt
  27. 51 0
      room/src/main/java/com/swago/room/pk/PKSearchLisDialog.kt
  28. 23 0
      room/src/main/java/com/swago/room/pk/PKStateManager.kt
  29. 118 0
      room/src/main/java/com/swago/room/pk/PkVm.kt
  30. 15 0
      room/src/main/res/drawable/pk_progress_style.xml
  31. 7 0
      room/src/main/res/drawable/progress_bar_pk_background.xml
  32. 7 0
      room/src/main/res/drawable/progress_bar_pk_foreground.xml
  33. 6 0
      room/src/main/res/drawable/shape_26fffffff_18.xml
  34. 11 0
      room/src/main/res/layout/activity_anchor_room.xml
  35. 116 0
      room/src/main/res/layout/dialog_pk_accept.xml
  36. 129 0
      room/src/main/res/layout/dialog_pk_invite.xml
  37. 65 0
      room/src/main/res/layout/dialog_pk_search.xml
  38. 9 0
      room/src/main/res/layout/fragment_base_com.xml
  39. 90 0
      room/src/main/res/layout/item_pk_search.xml
  40. 15 0
      room/src/main/res/layout/item_pk_seat.xml
  41. 235 0
      room/src/main/res/layout/layout_pk_view.xml
  42. BIN
      room/src/main/res/mipmap-xxhdpi/icon_coin_pk.webp
  43. BIN
      room/src/main/res/mipmap-xxhdpi/icon_pk_draw.webp
  44. BIN
      room/src/main/res/mipmap-xxhdpi/icon_pk_fail.webp
  45. BIN
      room/src/main/res/mipmap-xxhdpi/icon_pk_pk.webp
  46. BIN
      room/src/main/res/mipmap-xxhdpi/icon_pk_vs.webp
  47. BIN
      room/src/main/res/mipmap-xxhdpi/icon_pk_win.webp
  48. BIN
      room/src/main/res/mipmap-xxhdpi/pk_icon_search.png

+ 12 - 0
.idea/misc.xml

@@ -110,12 +110,17 @@
         <entry key="login/src/main/res/drawable/shape_ffbb56_ff7f8f_ff56b7.xml" value="0.251" />
         <entry key="login/src/main/res/drawable/shape_white_5.xml" value="0.39375" />
         <entry key="login/src/main/res/layout/activity_login.xml" value="0.33" />
+        <entry key="room/src/main/res/drawable/pk_progress_style.xml" value="0.294" />
+        <entry key="room/src/main/res/drawable/progress_bar_pk_background.xml" value="0.294" />
+        <entry key="room/src/main/res/drawable/progress_bar_pk_foreground.xml" value="0.294" />
         <entry key="room/src/main/res/drawable/selector_gift_send.xml" value="0.3851851851851852" />
+        <entry key="room/src/main/res/drawable/shape_26fffffff_18.xml" value="0.294" />
         <entry key="room/src/main/res/drawable/shape_434343_000000_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_4bce98_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_6720d1_180c72_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_6c55ff_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_80000000_20.xml" value="0.3723076923076923" />
+        <entry key="room/src/main/res/drawable/shape_dfffffff_18.xml" value="0.2355" />
         <entry key="room/src/main/res/drawable/shape_e87230_ddb558_all_10.xml" value="0.271" />
         <entry key="room/src/main/res/drawable/shape_f8614b_8c2922_20.xml" value="0.3640625" />
         <entry key="room/src/main/res/drawable/shape_ffff9300_00ff9300_20.xml" value="0.3871794871794872" />
@@ -128,6 +133,10 @@
         <entry key="room/src/main/res/layout/dialog_game_play.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/dialog_gift.xml" value="0.3015625" />
         <entry key="room/src/main/res/layout/dialog_message_list.xml" value="0.3776041666666667" />
+        <entry key="room/src/main/res/layout/dialog_pk_accept.xml" value="0.36730072463768115" />
+        <entry key="room/src/main/res/layout/dialog_pk_invite.xml" value="0.36730072463768115" />
+        <entry key="room/src/main/res/layout/dialog_pk_loading.xml" value="0.36730072463768115" />
+        <entry key="room/src/main/res/layout/dialog_pk_search.xml" value="0.3374094202898551" />
         <entry key="room/src/main/res/layout/dialog_reach_level_service.xml" value="0.2848731884057971" />
         <entry key="room/src/main/res/layout/dialog_red_envelope.xml" value="0.39166666666666666" />
         <entry key="room/src/main/res/layout/dialog_send_msg.xml" value="0.5" />
@@ -145,10 +154,13 @@
         <entry key="room/src/main/res/layout/item_gift.xml" value="0.75" />
         <entry key="room/src/main/res/layout/item_level.xml" value="0.3776041666666667" />
         <entry key="room/src/main/res/layout/item_page_gift.xml" value="0.36302083333333335" />
+        <entry key="room/src/main/res/layout/item_pk_search.xml" value="0.2586050724637681" />
+        <entry key="room/src/main/res/layout/item_pk_seat.xml" value="0.67" />
         <entry key="room/src/main/res/layout/item_rank_list.xml" value="0.3770833333333333" />
         <entry key="room/src/main/res/layout/item_room_user.xml" value="0.3446557971014493" />
         <entry key="room/src/main/res/layout/layout_anchor_footer_view.xml" value="0.35688405797101447" />
         <entry key="room/src/main/res/layout/layout_anchor_header_view.xml" value="0.33" />
+        <entry key="room/src/main/res/layout/layout_pk_view.xml" value="0.5" />
         <entry key="room/src/main/res/layout/layout_svg_dan_dao_view.xml" value="0.36302083333333335" />
         <entry key="room/src/main/res/layout/layout_user_footer_view.xml" value="0.35688405797101447" />
         <entry key="room/src/main/res/layout/layout_user_header_view.xml" value="0.44811655680338547" />

+ 33 - 0
baseswago/src/main/java/com/swago/baseswago/agora/AgoraManager.kt

@@ -12,6 +12,8 @@ import io.agora.rtc.Constants.*
 import io.agora.rtc.IRtcEngineEventHandler
 import io.agora.rtc.RtcEngine
 import io.agora.rtc.models.ClientRoleOptions
+import io.agora.rtc.video.ChannelMediaInfo
+import io.agora.rtc.video.ChannelMediaRelayConfiguration
 import io.agora.rtc.video.VideoCanvas
 import io.agora.rtc.video.VideoEncoderConfiguration
 import java.lang.Exception
@@ -189,6 +191,37 @@ object AgoraManager {
         )
     }
 
+
+    /**
+     * PK时转发主播流
+     * uid 填入用户在目标频道内的用户名
+     */
+    fun startPK(sourceChannelName: String,destChannelName: String,uid:Int,sourceChannelToken:String?=null,destChannelToken: String?=null){
+        mRtcEngine?.stopChannelMediaRelay()
+        val sourceChannelInfo = ChannelMediaInfo(sourceChannelName,sourceChannelToken,0)
+        val mediaRelayConfiguration = ChannelMediaRelayConfiguration()
+        mediaRelayConfiguration.setSrcChannelInfo(sourceChannelInfo)
+
+        val destChannelInfo = ChannelMediaInfo(destChannelName, destChannelToken,uid)
+        mediaRelayConfiguration.setDestChannelInfo(destChannelName,destChannelInfo)
+        val result = mRtcEngine?.startChannelMediaRelay(mediaRelayConfiguration)
+    }
+
+    /**
+     * 停止PK
+     */
+    fun stopPK(){
+        mRtcEngine?.stopChannelMediaRelay()
+    }
+
+    /**
+     * 移除远端视图
+     */
+    fun removeRemoteVideo(uid: Int,frameLayout: FrameLayout?) {
+        mRtcEngine?.setupRemoteVideo(VideoCanvas(null, VideoCanvas.RENDER_MODE_HIDDEN, uid))
+        frameLayout?.removeAllViews()
+    }
+
     /**
      * 切换摄像头
      */

+ 51 - 0
baseswago/src/main/java/com/swago/baseswago/im/GroupMsgParser.kt

@@ -11,6 +11,11 @@ import com.swago.baseswago.im.ImConstant.force_close_live_room
 import com.swago.baseswago.im.ImConstant.fruit_game
 import com.swago.baseswago.im.ImConstant.game_win_big_prize
 import com.swago.baseswago.im.ImConstant.lucky_gift
+import com.swago.baseswago.im.ImConstant.pk_process
+import com.swago.baseswago.im.ImConstant.pk_punish
+import com.swago.baseswago.im.ImConstant.pk_send
+import com.swago.baseswago.im.ImConstant.pk_start
+import com.swago.baseswago.im.ImConstant.pk_stop
 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
@@ -24,6 +29,7 @@ import com.swago.baseswago.model.live.ForceCloseModel
 import com.swago.baseswago.model.live.ReceiveModel
 import com.swago.baseswago.model.im.GamePrize
 import com.swago.baseswago.model.live.gift.IMGiftModel
+import com.swago.baseswago.model.live.pk.*
 import com.swago.baseswago.util.LogUtil
 import com.tencent.imsdk.v2.V2TIMMessage
 import org.json.JSONObject
@@ -146,6 +152,51 @@ class GroupMsgParser : IGroupNewMsgParser {
                     )
                     parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
                 }
+
+                pk_send -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(SendPKModel::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
+
+                pk_start -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(StartPKModel::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
+
+                pk_process -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(ProcessPKModel::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
+
+                pk_punish -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(PunishPKModel::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
+
+                pk_stop -> {
+                    parameterizedTypeImpl = ParameterizedTypeImpl(
+                        arrayOf<Type>(StopPKModel::class.java),
+                        CusNewMsgBean::class.java,
+                        CusNewMsgBean::class.java
+                    )
+                    parserModel = gson.fromJson(resultString,parameterizedTypeImpl)
+                }
             }
             parserModel?.v2TIMMessage = v2TIMMessage
         }catch (e:Exception){

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

@@ -70,6 +70,30 @@ object ImConstant {
     const val game_win_big_prize = 4
 
 
+    /**
+     * PK发起
+     */
+    const val pk_send = 211
+
+    /**
+     * PK开始
+     */
+    const val pk_start = 212
+
+    /**
+     * PK进度条
+     */
+    const val pk_process = 213
+
+    /**
+     * PK结算
+     */
+    const val pk_punish = 214
+
+    /**
+     * PK结束
+     */
+    const val pk_stop = 215
 
 
 

+ 11 - 0
baseswago/src/main/java/com/swago/baseswago/inter/RoomApi.kt

@@ -169,4 +169,15 @@ interface RoomApi {
     @POST("/v1/rtc/broadcast/user/detail")
     suspend fun getMomentModel(@Field("room_id")room_id:String):MomentModel
 
+
+    /***********************PK*********************************/
+
+//    @POST("/v1/rtc/broadcast/pk/list")
+//    suspend fun getPKLiverList():List<>
+
+
+
+
+    /***********************PK*********************************/
+
 }

+ 15 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/pk/ProcessPKModel.kt

@@ -0,0 +1,15 @@
+package com.swago.baseswago.model.live.pk
+
+data class ProcessPKModel(
+    val roomId:String="",
+    val progressValue:Int=0,
+    val roomAudienceList:List<PKSeat>,
+    val oppositeRoomId:String="",
+    val oppositeProgressValue:Int=0,
+    val oppositeRoomAudienceList:List<PKSeat>,
+)
+
+data class PKSeat(
+    val userId:String = "",
+    val userAvatar:String=""
+)

+ 11 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/pk/PunishPKModel.kt

@@ -0,0 +1,11 @@
+package com.swago.baseswago.model.live.pk
+
+/**
+ * 结算结果
+ */
+data class PunishPKModel(
+    val roomId:String="",
+    val roomResult:Int=0,
+    val oppositeRoomId:String="",
+    val oppositeRoomResult:Int=0,
+)

+ 15 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/pk/SendPKModel.kt

@@ -0,0 +1,15 @@
+package com.swago.baseswago.model.live.pk
+
+/**
+ * 发起PK
+ * actionType  1(发起PK) 2(发送方取消PK) 3(拒绝PK) 4(接受PK) 5(自动拒绝PK)
+ */
+data class SendPKModel (
+    val senderId:String = "",
+    val senderName:String = "",
+    val senderAvatar:String = "",
+    val receiverId:String = "",
+    val receiverName:String = "",
+    val receiverAvatar:String = "",
+    val actionType:Int = 0
+)

+ 17 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/pk/StartPKModel.kt

@@ -0,0 +1,17 @@
+package com.swago.baseswago.model.live.pk
+
+/**
+ * PK开始
+ */
+data class StartPKModel(
+    val roomId:String="",
+    val userId:String = "",
+    val oppositeRoomId:String = "",
+    val oppositeUserId:String = "",
+    val oppositeName:String = "",
+    val oppositeAvatar:String = "",
+    val pkResultTime:Int = 0,
+    val pkEndTime:Int = 0,
+    val sourceToken:String = "",
+    val destToken:String = "",
+)

+ 8 - 0
baseswago/src/main/java/com/swago/baseswago/model/live/pk/StopPKModel.kt

@@ -0,0 +1,8 @@
+package com.swago.baseswago.model.live.pk
+
+/**
+ * PK结束
+ */
+data class StopPKModel(
+    val roomId:String=""
+)

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

@@ -174,5 +174,14 @@
     <string name="got_it">Paham</string>
     <string name="force_closed_by_admin">Ruang siaran Anda telah ditutup oleh administrator</string>
     <string name="game_prize">%s baru saja memenangkan %s koin dalam %s, luar biasa!</string>
+    <string name="select_pk_anchor">Select PK Anchor</string>
+    <string name="please_enter_the_host_id_name">Please enter the host ID / name</string>
+    <string name="invite_pk">Invite PK</string>
+    <string name="initiate_invitation">Initiate invitation</string>
+    <string name="inviting_time">Inviting…(%ss)</string>
+    <string name="close">Close</string>
+    <string name="invites_you_to_pk">%s invites you to PK</string>
+    <string name="accept_swago">Accept</string>
+    <string name="refuse_swago">Refuse</string>
 
 </resources>

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

@@ -172,4 +172,13 @@
     <string name="got_it">Okay!</string>
     <string name="force_closed_by_admin">Ruang langsung anda telah ditutup oleh admin</string>
     <string name="game_prize">%s baru sahaja memenangi %s syiling dalam %s, itu hebat!</string>
+    <string name="select_pk_anchor">Select PK Anchor</string>
+    <string name="please_enter_the_host_id_name">Please enter the host ID / name</string>
+    <string name="invite_pk">Invite PK</string>
+    <string name="initiate_invitation">Initiate invitation</string>
+    <string name="inviting_time">Inviting…(%ss)</string>
+    <string name="close">Close</string>
+    <string name="invites_you_to_pk">%s invites you to PK</string>
+    <string name="accept_swago">Accept</string>
+    <string name="refuse_swago">Refuse</string>
 </resources>

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

@@ -172,5 +172,14 @@
     <string name="got_it">知道了</string>
     <string name="force_closed_by_admin">您的直播间已被管理员关闭</string>
     <string name="game_prize">%s刚刚在%s中赢得了%s金币,真是太厉害了</string>
+    <string name="select_pk_anchor">Select PK Anchor</string>
+    <string name="please_enter_the_host_id_name">Please enter the host ID / name</string>
+    <string name="invite_pk">Invite PK</string>
+    <string name="initiate_invitation">Initiate invitation</string>
+    <string name="inviting_time">Inviting…(%ss)</string>
+    <string name="close">Close</string>
+    <string name="invites_you_to_pk">%s invites you to PK</string>
+    <string name="accept_swago">Accept</string>
+    <string name="refuse_swago">Refuse</string>
 
 </resources>

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

@@ -189,5 +189,14 @@
     <string name="got_it">Got it</string>
     <string name="force_closed_by_admin">Your broadcast room has been closed by an administrator</string>
     <string name="game_prize">%s just won %s coins in %s, that\'s awesome!</string>
+    <string name="select_pk_anchor">Select PK Anchor</string>
+    <string name="please_enter_the_host_id_name">Please enter the host ID / name</string>
+    <string name="invite_pk">Invite PK</string>
+    <string name="initiate_invitation">Initiate invitation</string>
+    <string name="inviting_time">Inviting…(%ss)</string>
+    <string name="close">Close</string>
+    <string name="invites_you_to_pk">%s invites you to PK</string>
+    <string name="accept_swago">Accept</string>
+    <string name="refuse_swago">Refuse</string>
 
 </resources>

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


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


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


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


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


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

@@ -3,8 +3,11 @@ package com.swago.room.anchor
 import android.content.Intent
 import android.os.Bundle
 import android.view.View
+import android.view.ViewGroup
 import android.view.WindowManager
 import androidx.activity.viewModels
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.alibaba.android.arouter.facade.annotation.Route
@@ -17,8 +20,14 @@ import com.swago.baseswago.baseroom.RoleType
 import com.swago.baseswago.baseroom.SwagoRoomManager
 import com.swago.baseswago.baseroom.ui.AbsAnchorActivity
 import com.swago.baseswago.constant.ARouteConstant
+import com.swago.baseswago.model.live.pk.ProcessPKModel
+import com.swago.baseswago.model.live.pk.PunishPKModel
+import com.swago.baseswago.model.live.pk.StartPKModel
+import com.swago.baseswago.model.live.pk.StopPKModel
+import com.swago.baseswago.util.DpPxUtil
 import com.swago.baseswago.util.NoDoubleClickListener
 import com.swago.baseswago.util.UserInfo
+import com.swago.room.R
 import com.swago.room.adapter.GameAdapter
 import com.swago.room.base.NoContentFragment
 import com.swago.room.bean.UserRoomModel
@@ -26,6 +35,8 @@ import com.swago.room.databinding.ActivityAnchorRoomBinding
 import com.swago.room.dialog.AnchorCloseDialog
 import com.swago.room.dialog.CanStartLiveDialog
 import com.swago.room.dialog.ForceCloseRoomDialog
+import com.swago.room.pk.IPKListener
+import com.swago.room.pk.PKStateManager
 import com.swago.room.service.AgoraForegroundService
 import com.swago.room.service.AgoraForegroundService.ACTION_START_FOREGROUND_SERVICE
 import com.swago.room.service.AgoraForegroundService.ACTION_STOP_FOREGROUND_SERVICE
@@ -42,7 +53,7 @@ import java.util.*
  */
 @Route(path = ARouteConstant.Room.anchor)
 class AnchorRoomActivity : AbsAnchorActivity<ActivityAnchorRoomBinding,IRoomInfo>(),
-    ISwagoIRtcEngineEventHandler {
+    ISwagoIRtcEngineEventHandler, IPKListener {
 
     private val roomVm by viewModels<RoomVm>()
     private val roomOtherVm by viewModels<RoomOtherVm>()
@@ -63,6 +74,8 @@ class AnchorRoomActivity : AbsAnchorActivity<ActivityAnchorRoomBinding,IRoomInfo
         roomVm.init()
         msgVm.init()
         roomOtherVm.getGameList()
+        PKStateManager.addPKListener(this)
+        initPeerAnchorLayoutParams()
         window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
         agoraService = Intent(this,AgoraForegroundService::class.java)
         AgoraManager.initializeEngine(this,this)
@@ -194,6 +207,7 @@ class AnchorRoomActivity : AbsAnchorActivity<ActivityAnchorRoomBinding,IRoomInfo
     }
 
     override fun onDestroy() {
+        PKStateManager.removePKListener(this)
         agoraService?.let { stopService(it) }
         super.onDestroy()
     }
@@ -207,4 +221,68 @@ class AnchorRoomActivity : AbsAnchorActivity<ActivityAnchorRoomBinding,IRoomInfo
 
     }
 
+    /**************************PK******************************/
+    private val marginTopValue by lazy {
+        ImmersionBar.getStatusBarHeight(this) + DpPxUtil.dip2px(78f)
+    }
+
+    //对方主播id
+    private var peerAnchorId = 0
+    override fun startPK(startPKModel: StartPKModel,isGetDataFromIM:Boolean) {
+        peerAnchorId = startPKModel.oppositeUserId.toInt()
+        AgoraManager.startPK(startPKModel.roomId,startPKModel.oppositeRoomId,startPKModel.userId.toInt(),startPKModel.sourceToken,startPKModel.destToken)
+        setPKLayoutParams(binding.flLocal,true)
+        AgoraManager.setupRemoteVideo(this@AnchorRoomActivity,peerAnchorId,binding.peerFl)
+    }
+
+    override fun stopPK(stopPKModel: StopPKModel) {
+        AgoraManager.stopPK()
+        setPKLayoutParams(binding.flLocal,false)
+        AgoraManager.removeRemoteVideo(peerAnchorId,binding.peerFl)
+    }
+
+    override fun punishPK(punishPKModel: PunishPKModel,isGetDataFromIM:Boolean) {
+
+    }
+
+    override fun processChangePK(processPKModel: ProcessPKModel) {
+
+    }
+
+
+    //设置视频画面大小
+    private fun setPKLayoutParams(view:View?,isPK:Boolean){
+        if (isPK){
+            val x = DpPxUtil.getScreenWidth() / 2
+            val y = DpPxUtil.getScreenWidth() * 275 / 360
+            val params = ConstraintLayout.LayoutParams(x, y)
+            params.topToTop = R.id.rootAnchorView
+            params.startToStart = R.id.rootAnchorView
+            params.width = x
+            params.height = y
+            params.topMargin = marginTopValue
+            view?.layoutParams = params
+        }else{
+            val params = ConstraintLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT
+            )
+            view?.layoutParams = params
+        }
+    }
+
+    private fun initPeerAnchorLayoutParams() {
+        val x = DpPxUtil.getScreenWidth() / 2
+        val y = DpPxUtil.getScreenWidth() * 275 / 360
+        val params = ConstraintLayout.LayoutParams(x, y)
+        params.topToTop = R.id.rootAnchorView
+        params.endToEnd = R.id.rootAnchorView
+        params.width = x
+        params.height = y
+        params.topMargin = marginTopValue
+        binding.peerFl.layoutParams = params
+    }
+
+    /************************************************************/
+
 }

+ 21 - 0
room/src/main/java/com/swago/room/pk/IPKListener.kt

@@ -0,0 +1,21 @@
+package com.swago.room.pk
+
+import com.swago.baseswago.model.live.pk.ProcessPKModel
+import com.swago.baseswago.model.live.pk.PunishPKModel
+import com.swago.baseswago.model.live.pk.StartPKModel
+import com.swago.baseswago.model.live.pk.StopPKModel
+
+interface IPKListener {
+
+    //开始PK
+    fun startPK(startPKModel: StartPKModel,isGetDataFromIM:Boolean)
+
+    //结束PK
+    fun stopPK(stopPKModel: StopPKModel)
+
+    //PK结算
+    fun punishPK(punishPKModel: PunishPKModel,isGetDataFromIM:Boolean)
+
+    //PK进度条变更
+    fun processChangePK(processPKModel: ProcessPKModel)
+}

+ 35 - 0
room/src/main/java/com/swago/room/pk/PKAcceptDialog.kt

@@ -0,0 +1,35 @@
+package com.swago.room.pk
+
+import android.os.Bundle
+import android.view.Gravity
+import androidx.fragment.app.viewModels
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.room.databinding.DialogPkAcceptBinding
+
+class PKAcceptDialog : BaseXDFragment<DialogPkAcceptBinding>() {
+
+    private val pkVm by viewModels<PkVm>()
+
+    init {
+        setGravity(Gravity.BOTTOM)
+        setCanCancel(false)
+    }
+
+    companion object{
+        fun newInstance(): PKAcceptDialog {
+            val args = Bundle()
+            val fragment = PKAcceptDialog()
+            fragment.arguments = args
+            return fragment
+        }
+    }
+
+    override fun initOther() {
+
+    }
+
+    override fun initLiveData() {
+
+
+    }
+}

+ 19 - 0
room/src/main/java/com/swago/room/pk/PKAudienceAdapter.kt

@@ -0,0 +1,19 @@
+package com.swago.room.pk
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.swago.baseswago.model.live.pk.PKSeat
+import com.swago.loadUrl
+import com.swago.room.R
+import de.hdodenhof.circleimageview.CircleImageView
+
+class PKAudienceAdapter : BaseQuickAdapter<PKSeat,BaseViewHolder>(R.layout.item_pk_seat, arrayListOf()) {
+
+    override fun convert(helper: BaseViewHolder?, item: PKSeat?) {
+        helper?.apply {
+            item?.let {
+                itemView.findViewById<CircleImageView>(R.id.ivAvatar).loadUrl(itemView.context,it.userAvatar)
+            }
+        }
+    }
+}

+ 35 - 0
room/src/main/java/com/swago/room/pk/PKInviteDialog.kt

@@ -0,0 +1,35 @@
+package com.swago.room.pk
+
+import android.os.Bundle
+import android.view.Gravity
+import androidx.fragment.app.viewModels
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.room.databinding.DialogPkInviteBinding
+
+class PKInviteDialog : BaseXDFragment<DialogPkInviteBinding>() {
+
+    private val pkVm by viewModels<PkVm>()
+
+    init {
+        setGravity(Gravity.BOTTOM)
+        setCanCancel(false)
+    }
+
+    companion object{
+        fun newInstance(): PKInviteDialog {
+            val args = Bundle()
+            val fragment = PKInviteDialog()
+            fragment.arguments = args
+            return fragment
+        }
+    }
+
+
+    override fun initOther() {
+
+    }
+
+    override fun initLiveData() {
+
+    }
+}

+ 308 - 0
room/src/main/java/com/swago/room/pk/PKLayoutView.kt

@@ -0,0 +1,308 @@
+package com.swago.room.pk
+
+import android.content.Context
+import android.text.TextUtils
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.opensource.svgaplayer.SVGACallback
+import com.opensource.svgaplayer.SVGADrawable
+import com.opensource.svgaplayer.SVGAParser
+import com.opensource.svgaplayer.SVGAVideoEntity
+import com.swago.baseswago.baseroom.IRoomActiveListener
+import com.swago.baseswago.baseroom.IRoomInfo
+import com.swago.baseswago.baseroom.RoomTimer
+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
+import com.swago.baseswago.model.live.pk.StopPKModel
+import com.swago.baseswago.util.DpPxUtil
+import com.swago.baseswago.util.TimeUtil
+import com.swago.room.R
+import com.swago.room.databinding.LayoutPkViewBinding
+import java.io.File
+
+class PKLayoutView : ConstraintLayout, IRoomActiveListener, IPKListener,
+    RoomTimer.TimeTickListener {
+
+    private var binding:LayoutPkViewBinding? = null
+    private var svgParser:SVGAParser? = null
+    private var mProgress = 50
+    private val selfAdapter by lazy {
+        PKAudienceAdapter()
+    }
+    private val peerAdapter by lazy {
+        PKAudienceAdapter()
+    }
+
+    var pkTime = 0
+
+    var pkResult = 3
+
+    constructor(context: Context) : this(context, null)
+    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
+    constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(
+        context,
+        attrs,
+        defStyle
+    ) {
+        initView(context)
+    }
+
+    private fun initView(context: Context) {
+        binding = LayoutPkViewBinding.inflate(LayoutInflater.from(context), this, true)
+        SwagoRoomManager.addListener(this)
+        PKStateManager.addPKListener(this)
+        RoomTimer.timeTickList.add(this)
+        svgParser = SVGAParser(context)
+        binding?.let {
+            it.rvSelf.layoutManager = LinearLayoutManager(context)
+            it.rvSelf.adapter = selfAdapter
+            it.rvPeer.layoutManager = LinearLayoutManager(context)
+            it.rvPeer.adapter = peerAdapter
+
+            selfAdapter.setOnItemClickListener { _, _, position ->
+
+            }
+            peerAdapter.setOnItemClickListener { _, _, position ->
+
+            }
+        }
+    }
+
+    override fun changeRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun leaveRoom(iRoomInfo: IRoomInfo) {
+        resetSvg()
+        resetData()
+    }
+
+    override fun joinedRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun endRoom(iRoomInfo: IRoomInfo?) {
+    }
+
+    override fun closeRoomed() {
+        resetSvg()
+        RoomTimer.timeTickList.remove(this)
+        SwagoRoomManager.removeListener(this)
+        PKStateManager.removePKListener(this)
+    }
+
+    override fun startPK(startPKModel: StartPKModel,isGetDataFromIM:Boolean) {
+        binding?.apply {
+            visibility = View.VISIBLE
+            pkTime = startPKModel.pkResultTime
+            tvPkTime.text = TimeUtil.convertMinSecond(pkTime.toLong())
+            playProgress("file:///android_asset/progress.svga",2)
+            clPKTime.visibility = View.VISIBLE
+            clPunishTime.visibility = View.GONE
+        }
+
+    }
+
+    override fun stopPK(stopPKModel: StopPKModel) {
+        resetData()
+        visibility = View.GONE
+    }
+
+    override fun punishPK(punishPKModel: PunishPKModel,isGetDataFromIM:Boolean) {
+        binding?.apply {
+            visibility = View.VISIBLE
+            clPKTime.visibility = View.GONE
+            clPunishTime.visibility = View.VISIBLE
+            if (svgProgress.isAnimating){
+                svgProgress.stopAnimation()
+            }
+            // 1赢 2输 3平局
+            pkResult =punishPKModel.roomResult
+            when(punishPKModel.roomResult){
+                1 -> {
+                    playProgress("file:///android_asset/pk_win.svga",1)
+                }
+                2 -> {
+                    playProgress("file:///android_asset/pk_fail.svga",1)
+                }
+                3 -> {
+                    playProgress("file:///android_asset/pk_balance.svga",1)
+                }
+            }
+
+        }
+    }
+
+    override fun processChangePK(processPKModel: ProcessPKModel) {
+        binding?.apply {
+            if (processPKModel.roomAudienceList.isNotEmpty()){
+                selfAdapter.setNewData(processPKModel.roomAudienceList)
+            }
+            if (processPKModel.oppositeRoomAudienceList.isNotEmpty()){
+                peerAdapter.setNewData(processPKModel.oppositeRoomAudienceList)
+            }
+
+            if (tvSelf.text.toString().toInt() < processPKModel.progressValue || tvPeer.text.toString().toInt() < processPKModel.oppositeProgressValue) {
+                tvSelf.text = processPKModel.progressValue.toString()
+                tvPeer.text = processPKModel.oppositeProgressValue.toString()
+            } else {
+                return
+            }
+
+            val selfProgressValue = if (processPKModel.progressValue == 0) {
+                 0.01
+            } else {
+                processPKModel.progressValue
+            }
+
+            val peerProgressValue = if (processPKModel.oppositeProgressValue == 0) {
+                0.01
+            } else {
+                processPKModel.oppositeProgressValue
+            }
+
+            val progress =  (selfProgressValue.toDouble() / (peerProgressValue.toDouble() + selfProgressValue.toDouble()) * 80).toInt()
+            mProgress = when (progress) {
+                0 -> {
+                    10
+                }
+                else -> {
+                    10 + progress
+                }
+            }
+            progressBar.progress = mProgress
+
+
+            val svgProcessLayoutParams = ConstraintLayout.LayoutParams(WRAP_CONTENT,DpPxUtil.dip2px(15f))
+            svgProcessLayoutParams.startToStart = R.id.svgProgress
+            svgProcessLayoutParams.topToTop = R.id.svgProgress
+            svgProcessLayoutParams.marginStart = DpPxUtil.getScreenWidth()/100*mProgress
+            svgProgress.layoutParams = svgProcessLayoutParams
+
+        }
+    }
+
+    override fun onTimeCount(time: Int) {
+        binding?.apply {
+            pkTime--
+            if (PKStateManager.roomState==PKStateManager.PK){
+                tvPkTime.text = TimeUtil.convertMinSecond(pkTime.toLong())
+            }else if(PKStateManager.roomState==PKStateManager.PUNISH){
+                tvPunishTime.text = TimeUtil.convertMinSecond(pkTime.toLong())
+            }
+        }
+    }
+
+
+    private fun resetData(){
+        binding?.apply {
+            mProgress = 50
+            progressBar.progress = 50
+            tvSelf.text = "0"
+            tvPeer.text = "0"
+            ivSelfPKResult.visibility = View.GONE
+            ivPeerPKResult.visibility = View.GONE
+            tvPeerName.text = ""
+            tvPeerId.text = ""
+            tvPunishTime.text = "00:00"
+            tvPkTime.text = "00:00"
+            selfAdapter.data.clear()
+            selfAdapter.notifyDataSetChanged()
+            peerAdapter.data.clear()
+            peerAdapter.notifyDataSetChanged()
+        }
+    }
+
+    private fun resetSvg(){
+        binding?.apply {
+            if (svgProgress.isAnimating){
+                svgProgress.stopAnimation()
+            }
+            if (svgPKResult.isAnimating){
+                svgPKResult.stopAnimation()
+            }
+        }
+    }
+
+
+    /**
+     * type 1 播放PK结果动画  2 播放正在PK进度条动画
+     */
+    private fun playProgress(path:String,type:Int){
+        svgParser?.let {
+            it.decodeFromAssets(path,object:SVGAParser.ParseCompletion{
+                override fun onComplete(videoItem: SVGAVideoEntity) {
+                    binding?.apply {
+                        val drawable = SVGADrawable(videoItem)
+                        when(type){
+                            1 -> {
+                                svgPKResult.setImageDrawable(drawable)
+                                svgPKResult.callback = callback
+                                svgPKResult.visibility = View.VISIBLE
+                                svgPKResult.loops = 1
+                                svgPKResult.startAnimation()
+                            }
+
+                            2 -> {
+                                svgProgress.setImageDrawable(drawable)
+                                svgProgress.callback = callback
+                                svgProgress.visibility = View.VISIBLE
+                                svgProgress.loops = 99999
+                                svgProgress.startAnimation()
+                            }
+                        }
+
+                    }
+
+                }
+
+                override fun onError() {
+                    binding?.apply {
+                        svgProgress.visibility = View.GONE
+                    }
+                }
+            },object:SVGAParser.PlayCallback{
+                override fun onPlay(file: List<File>) {
+                }
+
+            })
+
+        }
+    }
+
+    private var callback = object: SVGACallback {
+
+        override fun onFinished() {
+            binding?.apply {
+                svgProgress.visibility = View.GONE
+                ivSelfPKResult.visibility = View.VISIBLE
+                ivPeerPKResult.visibility = View.VISIBLE
+                when(pkResult){
+                    1 -> {
+                        ivSelfPKResult.setImageResource(R.mipmap.icon_pk_win)
+                        ivPeerPKResult.setImageResource(R.mipmap.icon_pk_fail)
+                    }
+                    2 -> {
+                        ivSelfPKResult.setImageResource(R.mipmap.icon_pk_fail)
+                        ivPeerPKResult.setImageResource(R.mipmap.icon_pk_win)
+                    }
+                    3 -> {
+                        ivSelfPKResult.setImageResource(R.mipmap.icon_pk_draw)
+                        ivPeerPKResult.setImageResource(R.mipmap.icon_pk_draw)
+                    }
+                }
+            }
+        }
+
+        override fun onPause() {}
+
+        override fun onRepeat() {}
+
+        override fun onStep(frame: Int, percentage: Double) {}
+    }
+
+}

+ 12 - 0
room/src/main/java/com/swago/room/pk/PKListAdapter.kt

@@ -0,0 +1,12 @@
+package com.swago.room.pk
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.swago.room.R
+
+class PKListAdapter : BaseQuickAdapter<String,BaseViewHolder>(R.layout.item_pk_search, arrayListOf()) {
+
+    override fun convert(helper: BaseViewHolder?, item: String?) {
+
+    }
+}

+ 51 - 0
room/src/main/java/com/swago/room/pk/PKSearchLisDialog.kt

@@ -0,0 +1,51 @@
+package com.swago.room.pk
+
+import android.view.Gravity
+import androidx.fragment.app.viewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.swago.baseswago.dialog.BaseXDFragment
+import com.swago.baseswago.util.NoDoubleClickListener
+import com.swago.room.databinding.DialogPkSearchBinding
+
+class PKSearchLisDialog : BaseXDFragment<DialogPkSearchBinding>() {
+
+    private val pkVm by viewModels<PkVm>()
+
+    private val adapter by lazy {
+        PKListAdapter()
+    }
+
+    init {
+        setGravity(Gravity.BOTTOM)
+        setCanCancel(true)
+    }
+
+    override fun initOther() {
+        //TODO 默认可PK主播列表
+
+
+        binding.ivSearch.setOnClickListener(object:NoDoubleClickListener(){
+            override fun onClick() {
+                val content = binding.etEdit.text.toString()
+                pkVm.searchAnchor(content)
+            }
+        })
+
+        context?.let {
+            binding.rvPKList.layoutManager = LinearLayoutManager(it)
+            binding.rvPKList.adapter = adapter
+
+            adapter.setOnItemChildClickListener { adapter, view, position ->
+
+            }
+        }
+
+
+
+    }
+
+    override fun initLiveData() {
+
+
+    }
+}

+ 23 - 0
room/src/main/java/com/swago/room/pk/PKStateManager.kt

@@ -0,0 +1,23 @@
+package com.swago.room.pk
+
+object PKStateManager {
+
+    //当前直播间状态  1 主播正在直播或者用户正在观看主播直播   2  主播正在PK或者用户正在观看主播PK  3PK的主播进入惩罚阶段或者用户正在观看惩罚阶段的主播
+    const val LIVING = 1
+    const val PK = 2
+    const val PUNISH = 3
+
+    var roomState = 1
+
+
+    val pkIPKListenerList = ArrayList<IPKListener>()
+
+    fun addPKListener(ipkListener: IPKListener){
+        pkIPKListenerList.add(ipkListener)
+    }
+
+    fun removePKListener(ipkListener: IPKListener){
+        pkIPKListenerList.remove(ipkListener)
+    }
+
+}

+ 118 - 0
room/src/main/java/com/swago/room/pk/PkVm.kt

@@ -0,0 +1,118 @@
+package com.swago.room.pk
+
+import android.app.Application
+import com.swago.baseswago.baseroom.IRoomInfo
+import com.swago.baseswago.baseroom.SwagoRoomManager
+import com.swago.baseswago.baseroom.viewmodel.AbsMsgVm
+import com.swago.baseswago.im.ImConstant
+import com.swago.baseswago.model.im.CusNewMsgBean
+import com.swago.baseswago.model.im.RoomChatMsgBean
+import com.swago.baseswago.model.live.pk.*
+import com.swago.baseswago.util.UserInfo
+
+class PkVm(application: Application) : AbsMsgVm(application) {
+    //接口调用
+
+
+    override fun receiveMsg() {
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<SendPKModel>>(ImConstant.pk_send) {
+            it.data?.let {
+                UserInfo.getUserInfo()?.apply {
+                    if (this.id == it.receiverId){
+                        when(it.actionType){
+
+                        }
+                    }
+                }
+            }
+        }
+
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<StartPKModel>>(ImConstant.pk_start) {
+            it.data?.let {
+                SwagoRoomManager.iRoomInfo?.apply {
+                    if (this.getRoomId() == it.roomId) {
+                        if (PKStateManager.roomState != PKStateManager.PK) {
+                            PKStateManager.roomState = PKStateManager.PK
+                            PKStateManager.pkIPKListenerList.forEach { ipkListener ->
+                                ipkListener.startPK(it, true)
+                            }
+                        }
+                    }
+                }
+            }
+
+        }
+
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<ProcessPKModel>>(ImConstant.pk_process) {
+            it.data?.let {
+                SwagoRoomManager.iRoomInfo?.apply {
+                    if (this.getRoomId() == it.roomId){
+                        PKStateManager.pkIPKListenerList.forEach { ipkListener ->
+                            ipkListener.processChangePK(it)
+                        }
+                    }
+                }
+            }
+        }
+
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<PunishPKModel>>(ImConstant.pk_punish) {
+            it.data?.let {
+                SwagoRoomManager.iRoomInfo?.apply {
+                    if (this.getRoomId() == it.roomId){
+                        if (PKStateManager.roomState !=PKStateManager.PUNISH){
+                            PKStateManager.roomState = PKStateManager.PUNISH
+                            PKStateManager.pkIPKListenerList.forEach { ipkListener ->
+                                ipkListener.punishPK(it,true)
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        imGroupNewMsgListener.handleMsgType<CusNewMsgBean<StopPKModel>>(ImConstant.pk_stop) {
+            it.data?.let {
+                SwagoRoomManager.iRoomInfo?.apply {
+                    if (this.getRoomId() == it.roomId){
+                        if (PKStateManager.roomState !=PKStateManager.LIVING){
+                            PKStateManager.roomState = PKStateManager.LIVING
+                            PKStateManager.pkIPKListenerList.forEach { ipkListener ->
+                                ipkListener.stopPK(it)
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    override fun changeRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun leaveRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun joinedRoom(iRoomInfo: IRoomInfo) {
+    }
+
+    override fun endRoom(iRoomInfo: IRoomInfo?) {
+    }
+
+    override fun closeRoomed() {
+    }
+
+
+    /**
+     * pK搜索对应主播
+     */
+    fun searchAnchor(content: String) {
+
+    }
+
+    /**
+     * 默认主播列表
+     */
+    fun getDefault() {
+
+    }
+}

+ 15 - 0
room/src/main/res/drawable/pk_progress_style.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:id="@android:id/background"
+        android:drawable="@drawable/progress_bar_pk_background"/>
+
+    <item android:id="@android:id/progress">
+        <scale
+            android:drawable="@drawable/progress_bar_pk_foreground"
+            android:scaleWidth="100%" />
+    </item>
+
+</layer-list>
+
+

+ 7 - 0
room/src/main/res/drawable/progress_bar_pk_background.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient
+        android:angle="0"
+        android:startColor="#1371FF"
+        android:endColor="#0127FF"/>
+</shape>

+ 7 - 0
room/src/main/res/drawable/progress_bar_pk_foreground.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <gradient
+        android:angle="0"
+        android:startColor="#FF00BF"
+        android:endColor="#FF0084"/>
+</shape>

+ 6 - 0
room/src/main/res/drawable/shape_26fffffff_18.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+        <stroke android:width="1dp" android:color="#26ffffff" />
+        <solid android:color="#26FFFFFF" />
+        <corners android:topLeftRadius="18dp" android:topRightRadius="18dp" android:bottomLeftRadius="18dp" android:bottomRightRadius="18dp" />
+</shape>

+ 11 - 0
room/src/main/res/layout/activity_anchor_room.xml

@@ -2,14 +2,25 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:id="@+id/rootAnchorView"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
+    <!--自己-->
     <FrameLayout
         android:id="@+id/flLocal"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
 
 
+    <!--对方主播的-->
+    <FrameLayout
+        android:id="@+id/peerFl"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layoutDirection="ltr">
+
+    </FrameLayout>
+
     <androidx.viewpager.widget.ViewPager
         android:id="@+id/viewPager"
         android:layout_width="match_parent"

+ 116 - 0
room/src/main/res/layout/dialog_pk_accept.xml

@@ -0,0 +1,116 @@
+<?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="match_parent"
+    xmlns:tools="http://schemas.android.com/tools"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:background="@drawable/shape_161722_top_20"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvTitle"
+            android:textSize="16dp"
+            android:textColor="#fff"
+            android:text="@string/invites_you_to_pk"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_marginTop="15dp"
+            android:gravity="center"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivSelf"
+            android:layout_marginTop="60dp"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/ivVs"
+            tools:src="@mipmap/default_avatar"
+            android:layout_width="72dp"
+            android:layout_height="72dp"/>
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivVs"
+            android:src="@mipmap/icon_pk_vs"
+            android:layout_marginTop="22dp"
+            app:layout_constraintTop_toTopOf="@+id/ivSelf"
+            app:layout_constraintStart_toEndOf="@+id/ivSelf"
+            app:layout_constraintEnd_toStartOf="@+id/ivPeer"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivPeer"
+            tools:src="@mipmap/default_avatar"
+            app:layout_constraintTop_toTopOf="@+id/ivSelf"
+            app:layout_constraintStart_toEndOf="@+id/ivVs"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_width="72dp"
+            android:layout_height="72dp"/>
+
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvSelfName"
+            android:maxLines="1"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            tools:text="Swago"
+            app:layout_constraintStart_toStartOf="@+id/ivSelf"
+            app:layout_constraintEnd_toEndOf="@+id/ivSelf"
+            app:layout_constraintTop_toBottomOf="@+id/ivSelf"
+            android:maxWidth="100dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvPeerName"
+            android:maxLines="1"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            tools:text="Swago"
+            android:maxWidth="100dp"
+            app:layout_constraintStart_toStartOf="@+id/ivPeer"
+            app:layout_constraintEnd_toEndOf="@+id/ivPeer"
+            app:layout_constraintTop_toBottomOf="@+id/ivPeer"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvAccept"
+            android:textSize="16dp"
+            android:textColor="#fff"
+            android:layout_marginStart="15dp"
+            android:layout_marginEnd="15dp"
+            android:layout_marginTop="32dp"
+            android:text="@string/accept_swago"
+            android:gravity="center"
+            android:background="@drawable/shape_ff56b7_37"
+            app:layout_constraintTop_toBottomOf="@+id/tvSelfName"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"/>
+
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvRefuse"
+            android:textSize="16dp"
+            android:textColor="#fff"
+            android:layout_marginTop="10dp"
+            android:text="@string/refuse_swago"
+            android:gravity="center"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvAccept"
+            android:layout_width="wrap_content"
+            android:layout_height="48dp"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 129 - 0
room/src/main/res/layout/dialog_pk_invite.xml

@@ -0,0 +1,129 @@
+<?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="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:background="@drawable/shape_161722_top_20"
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:textSize="16dp"
+            android:textColor="#fff"
+            android:text="@string/initiate_invitation"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_marginTop="15dp"
+            android:gravity="center"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivSelf"
+            android:layout_marginTop="60dp"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toStartOf="@+id/ivVs"
+            tools:src="@mipmap/default_avatar"
+            android:layout_width="72dp"
+            android:layout_height="72dp"/>
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivVs"
+            android:src="@mipmap/icon_pk_vs"
+            android:layout_marginTop="22dp"
+            app:layout_constraintTop_toTopOf="@+id/ivSelf"
+            app:layout_constraintStart_toEndOf="@+id/ivSelf"
+            app:layout_constraintEnd_toStartOf="@+id/ivPeer"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivPeer"
+            tools:src="@mipmap/default_avatar"
+            app:layout_constraintTop_toTopOf="@+id/ivSelf"
+            app:layout_constraintStart_toEndOf="@+id/ivVs"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_width="72dp"
+            android:layout_height="72dp"/>
+
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvSelfName"
+            android:maxLines="1"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            tools:text="Swago"
+            app:layout_constraintStart_toStartOf="@+id/ivSelf"
+            app:layout_constraintEnd_toEndOf="@+id/ivSelf"
+            app:layout_constraintTop_toBottomOf="@+id/ivSelf"
+            android:maxWidth="100dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvPeerName"
+            android:maxLines="1"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            tools:text="Swago"
+            android:maxWidth="100dp"
+            app:layout_constraintStart_toStartOf="@+id/ivPeer"
+            app:layout_constraintEnd_toEndOf="@+id/ivPeer"
+            app:layout_constraintTop_toBottomOf="@+id/ivPeer"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvInvite"
+            android:textSize="16dp"
+            android:textColor="#fff"
+            android:layout_marginStart="15dp"
+            android:layout_marginEnd="15dp"
+            android:layout_marginTop="32dp"
+            android:text="@string/invite_pk"
+            android:gravity="center"
+            android:background="@drawable/shape_ff56b7_37"
+            app:layout_constraintTop_toBottomOf="@+id/tvSelfName"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"/>
+
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvTimeCount"
+            android:textColor="#fff"
+            android:textSize="16dp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="@+id/tvInvite"
+            android:text="@string/inviting_time"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="@+id/tvInvite"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvCancel"
+            android:textSize="16dp"
+            android:textColor="#fff"
+            android:layout_marginTop="10dp"
+            android:text="@string/cancel"
+            android:gravity="center"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tvInvite"
+            android:layout_width="wrap_content"
+            android:layout_height="48dp"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 65 - 0
room/src/main/res/layout/dialog_pk_search.xml

@@ -0,0 +1,65 @@
+<?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="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        app:layout_constraintTop_toTopOf="parent"
+        android:layout_width="match_parent"
+        android:background="@drawable/shape_161722_top_20"
+        android:layout_height="456dp">
+
+        <com.swago.baseswago.cusview.BoldTextView
+            android:id="@+id/tvTitle"
+            android:textColor="#fff"
+            android:textSize="16dp"
+            android:layout_marginTop="15dp"
+            android:text="@string/select_pk_anchor"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <androidx.appcompat.widget.AppCompatEditText
+            android:id="@+id/etEdit"
+            android:layout_marginStart="12dp"
+            android:layout_marginEnd="12dp"
+            android:paddingEnd="50dp"
+            android:textColor="#fff"
+            android:textColorHint="#80FFFFFF"
+            android:gravity="center|start"
+            android:paddingStart="15dp"
+            android:maxLines="1"
+            android:textSize="12dp"
+            android:hint="@string/please_enter_the_host_id_name"
+            app:layout_constraintTop_toBottomOf="@+id/tvTitle"
+            android:layout_marginTop="22dp"
+            android:background="@drawable/shape_26fffffff_18"
+            android:layout_width="match_parent"
+            android:layout_height="36dp"/>
+
+
+        <ImageView
+            android:id="@+id/ivSearch"
+            android:layout_marginEnd="10dp"
+            app:layout_constraintTop_toTopOf="@+id/etEdit"
+            app:layout_constraintBottom_toBottomOf="@+id/etEdit"
+            app:layout_constraintEnd_toEndOf="@+id/etEdit"
+            android:src="@mipmap/pk_icon_search"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rvPKList"
+            android:layout_marginTop="16dp"
+            app:layout_constraintTop_toBottomOf="@+id/etEdit"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 9 - 0
room/src/main/res/layout/fragment_base_com.xml

@@ -21,6 +21,15 @@
         app:layout_constraintBottom_toBottomOf="parent" />
 
 
+    <com.swago.room.pk.PKLayoutView
+        android:id="@+id/pkLayoutView"
+        android:layout_marginTop="14dp"
+        android:visibility="gone"
+        app:layout_constraintTop_toBottomOf="@+id/headFl"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"/>
+
+
     <com.swago.room.widget.ChatRecyclerView
         android:id="@+id/rv"
         android:layout_marginStart="10dp"

+ 90 - 0
room/src/main/res/layout/item_pk_search.xml

@@ -0,0 +1,90 @@
+<?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:tools="http://schemas.android.com/tools"
+    android:background="#000"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:id="@+id/ivAvatar"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_marginStart="12dp"
+        android:layout_width="48dp"
+        android:layout_height="48dp"/>
+
+    <com.swago.baseswago.cusview.BoldTextView
+        android:id="@+id/tvName"
+        app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+        app:layout_constraintTop_toTopOf="@+id/ivAvatar"
+        android:layout_marginTop="5dp"
+        tools:text="Nickname"
+        android:layout_marginStart="12dp"
+        android:textSize="14dp"
+        android:textColor="#fff"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <com.swago.baseswago.cusview.SwagoLevelView
+        android:id="@+id/tvLevel"
+        app:layout_constraintStart_toEndOf="@+id/tvName"
+        app:layout_constraintTop_toTopOf="@+id/tvName"
+        android:layout_marginTop="2dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+    <ImageView
+        android:id="@+id/ivSex"
+        tools:src="@mipmap/female"
+        app:layout_constraintStart_toEndOf="@+id/tvLevel"
+        app:layout_constraintTop_toTopOf="@+id/tvLevel"
+        app:layout_constraintBottom_toBottomOf="@+id/tvLevel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <com.swago.baseswago.cusview.MediumTextView
+        android:id="@+id/tvID"
+        app:layout_constraintStart_toEndOf="@+id/ivAvatar"
+        app:layout_constraintBottom_toBottomOf="@+id/ivAvatar"
+        android:layout_marginBottom="4dp"
+        tools:text="ID:123456"
+        android:layout_marginStart="12dp"
+        android:textSize="12dp"
+        android:textColor="#99FFFFFF"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+    <com.swago.baseswago.cusview.MediumTextView
+        android:id="@+id/tvFans"
+        app:layout_constraintStart_toEndOf="@+id/tvID"
+        app:layout_constraintBottom_toBottomOf="@+id/ivAvatar"
+        android:layout_marginBottom="4dp"
+        tools:text="Fans:132K"
+        android:layout_marginStart="12dp"
+        android:textSize="12dp"
+        android:textColor="#99FFFFFF"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+    <TextView
+        android:id="@+id/tvPK"
+        android:text="@string/invite_pk"
+        android:textSize="12dp"
+        android:textColor="#fff"
+        android:paddingStart="10dp"
+        android:paddingEnd="10dp"
+        android:paddingTop="4dp"
+        android:paddingBottom="4dp"
+        android:background="@drawable/shape_ff56b7_37"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 15 - 0
room/src/main/res/layout/item_pk_seat.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="28dp"
+    android:layout_height="28dp"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <de.hdodenhof.circleimageview.CircleImageView
+        android:layout_margin="2dp"
+        android:id="@+id/ivAvatar"
+        app:civ_border_width="2dp"
+        app:civ_border_color="#F8DC93"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 235 - 0
room/src/main/res/layout/layout_pk_view.xml

@@ -0,0 +1,235 @@
+<?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="wrap_content"
+    android:background="#000"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <View
+        android:id="@+id/view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintDimensionRatio="h,360:275"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/ivSelfPKResult"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        android:visibility="gone"
+        tools:visibility="visible"
+        app:layout_constraintStart_toStartOf="@+id/view"
+        app:layout_constraintTop_toTopOf="@+id/view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+    <ImageView
+        android:id="@+id/ivPeerPKResult"
+        android:layout_marginStart="8dp"
+        android:layout_marginTop="8dp"
+        android:visibility="gone"
+        tools:visibility="visible"
+        app:layout_constraintEnd_toEndOf="@+id/view"
+        app:layout_constraintTop_toTopOf="@+id/view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <com.opensource.svgaplayer.SVGAImageView
+        app:layout_constraintStart_toStartOf="@+id/view"
+        app:layout_constraintTop_toTopOf="@+id/view"
+        app:layout_constraintEnd_toEndOf="@+id/view"
+        app:layout_constraintBottom_toBottomOf="@+id/view"
+        android:id="@+id/svgPKResult"
+        android:visibility="gone"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/clPeer"
+        app:layout_constraintBottom_toBottomOf="@+id/view"
+        app:layout_constraintEnd_toEndOf="@+id/view"
+        android:layout_marginEnd="8dp"
+        android:background="@drawable/shape_26fffffff_18"
+        android:layout_marginBottom="8dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <de.hdodenhof.circleimageview.CircleImageView
+            android:id="@+id/ivPeerAvatar"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_margin="2dp"
+            tools:src="@mipmap/default_avatar"
+            android:layout_width="26dp"
+            android:layout_height="26dp"/>
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvPeerName"
+            android:textSize="12dp"
+            android:textColor="#fff"
+            tools:text="Swago"
+            android:layout_marginStart="4dp"
+            android:layout_marginEnd="8dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/ivPeerAvatar"
+            app:layout_constraintTop_toTopOf="parent"
+            android:maxWidth="70dp"
+            android:maxLines="1"
+            android:layout_width="wrap_content"
+            android:layout_height="0dp"/>
+
+
+        <com.swago.baseswago.cusview.RegularTextView
+            android:id="@+id/tvPeerId"
+            android:textSize="8dp"
+            android:textColor="#fff"
+            tools:text="Swago"
+            android:layout_marginStart="4dp"
+            android:layout_marginEnd="8dp"
+            android:layout_marginBottom="2dp"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/ivPeerAvatar"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    <ProgressBar
+        android:id="@+id/progressBar"
+        style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="15dp"
+        android:max="100"
+        android:progress="50"
+        android:progressDrawable="@drawable/pk_progress_style"
+       app:layout_constraintTop_toBottomOf="@+id/view"/>
+
+    <com.opensource.svgaplayer.SVGAImageView
+        app:layout_constraintStart_toStartOf="@+id/progressBar"
+        app:layout_constraintTop_toTopOf="@+id/progressBar"
+        android:id="@+id/svgProgress"
+        android:layout_width="wrap_content"
+        android:layout_height="15dp"/>
+
+    <TextView
+        android:id="@+id/tvSelf"
+        tools:text="213"
+        android:textSize="12dp"
+        android:textColor="#fff"
+        android:gravity="center_vertical"
+        app:layout_constraintTop_toTopOf="@+id/progressBar"
+        app:layout_constraintStart_toStartOf="parent"
+        android:drawableStart="@mipmap/icon_coin_pk"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+    <TextView
+        android:id="@+id/tvPeer"
+        tools:text="213"
+        android:textSize="12dp"
+        android:textColor="#fff"
+        android:gravity="center_vertical"
+        app:layout_constraintTop_toTopOf="@+id/progressBar"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:drawableEnd="@mipmap/icon_coin_pk"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rvSelf"
+        app:layout_constraintTop_toBottomOf="@+id/progressBar"
+        android:layout_marginTop="10dp"
+        app:layout_constraintStart_toStartOf="parent"
+        android:layout_width="wrap_content"
+        android:layout_height="28dp"/>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rvPeer"
+        app:layout_constraintTop_toBottomOf="@+id/progressBar"
+        android:layout_marginTop="10dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        android:layout_width="wrap_content"
+        android:layout_height="28dp"/>
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/clPKTime"
+        android:visibility="gone"
+        tools:visibility="visible"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/rvSelf"
+        app:layout_constraintBottom_toBottomOf="@+id/rvSelf"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/ivPk"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:src="@mipmap/icon_pk_pk"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvPkTime"
+            app:layout_constraintStart_toEndOf="@+id/ivPk"
+            app:layout_constraintTop_toTopOf="@+id/ivPk"
+            app:layout_constraintBottom_toBottomOf="@+id/ivPk"
+            android:textColor="#fff"
+            android:textSize="14dp"
+            tools:text="00:10"
+            android:layout_marginStart="2dp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/clPunishTime"
+        android:visibility="gone"
+        tools:visibility="visible"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/rvSelf"
+        app:layout_constraintBottom_toBottomOf="@+id/rvSelf"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvPunishTitle"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toTopOf="@+id/tvPunishTime"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:textSize="10dp"
+            android:textColor="#fff"
+            android:text="Punishment"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <com.swago.baseswago.cusview.MediumTextView
+            android:id="@+id/tvPunishTime"
+            app:layout_constraintTop_toBottomOf="@+id/tvPunishTitle"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            android:textSize="14dp"
+            android:textColor="#fff"
+            tools:text="00:23"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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


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


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


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


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


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


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