Browse Source

关闭房间

DoggyZhang 3 weeks ago
parent
commit
27a321120a

+ 23 - 0
app/src/main/java/com/adealink/weparty/module/room/viewmodel/IRoomFlowViewModel.kt

@@ -0,0 +1,23 @@
+package com.adealink.weparty.module.room.viewmodel
+
+import androidx.lifecycle.LiveData
+import com.adealink.frame.room.data.FlowStateInfo
+import com.adealink.frame.room.data.LeaveRoomReason
+import com.adealink.frame.room.data.RoomState
+
+interface IRoomFlowViewModel {
+
+    val roomStateLD: LiveData<Triple<RoomState, RoomState, FlowStateInfo>>
+
+    /**
+     * 尝试退出当前房间,不关注结果
+     */
+    fun tryLeaveRoom(reason: LeaveRoomReason)
+
+    fun getJoiningRoomId(): String?
+
+    fun getJoinedRoomId(): String?
+
+    fun getJoinRoomState(): RoomState
+
+}

+ 0 - 8
frame/room/src/main/java/com/adealink/frame/room/data/RoomFlowData.kt

@@ -47,14 +47,6 @@ data class JoinRoomReq(
     val roomId: String
 )
 
-/**
- * 退房请求
- */
-data class LeaveRoomReq(
-    val roomId: String,
-    val reason: LeaveRoomReason,
-)
-
 enum class LeaveRoomReason(val reason: String) {
     INITIATIVE("initiative"),
 }

+ 0 - 7
frame/room/src/main/java/com/adealink/frame/room/listener/IRoomStateChangeListener.kt

@@ -1,6 +1,5 @@
 package com.adealink.frame.room.listener
 
-import com.adealink.frame.room.data.ChannelState
 import com.adealink.frame.room.data.FlowStateInfo
 import com.adealink.frame.room.data.RoomState
 
@@ -12,10 +11,4 @@ interface IRoomStateChangeListener {
         flowStateInfo: FlowStateInfo,
     )
 
-    fun notifyChannelStateChanged(
-        fromState: ChannelState,
-        toState: ChannelState,
-        flowStateInfo: FlowStateInfo,
-    )
-
 }

+ 39 - 6
module/room/src/main/java/com/adealink/weparty/room/RoomActivity.kt

@@ -2,9 +2,12 @@ package com.adealink.weparty.room
 
 import android.content.Intent
 import android.view.KeyEvent
+import androidx.activity.viewModels
 import com.adealink.frame.log.Log
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.room.data.LeaveRoomReason
+import com.adealink.frame.room.data.RoomState
+import com.adealink.frame.room.data.TAG_ROOM
 import com.adealink.frame.router.Router
 import com.adealink.frame.router.annotation.RouterUri
 import com.adealink.frame.share.shareManager
@@ -15,6 +18,9 @@ import com.adealink.weparty.room.constant.logRoomTime
 import com.adealink.weparty.room.databinding.ActivityRoomBinding
 import com.adealink.weparty.room.interceptor.EnterRoomUriInterceptor
 import com.adealink.weparty.room.listener.IRoomOpListener
+import com.adealink.weparty.room.sdk.service.roomService
+import com.adealink.weparty.room.viewmodel.RoomFlowViewModel
+import com.adealink.weparty.room.viewmodel.RoomViewModelFactory
 import java.util.LinkedList
 
 @RouterUri(
@@ -40,6 +46,10 @@ class RoomActivity : BaseActivity(), IRoomOpListener {
     //默认聊天房间
     private var roomFragment: BaseRoomFragment? = null
 
+
+    private val flowViewModel by viewModels<RoomFlowViewModel> { RoomViewModelFactory() }
+
+
     // 权限申请队列, RxPermissions 申请权限时, 必须等前面那个完成才能申请下一个, 不然连续调用后面的会无效
     private val requestPermissionPending = LinkedList<(onFinished: () -> Unit) -> Unit>()
     private var requestingPermission = false
@@ -64,12 +74,34 @@ class RoomActivity : BaseActivity(), IRoomOpListener {
     override fun onStart() {
         super.onStart()
         //检查当前房间信息是否丢失
-//        val roomId = roomService.joinController.getJoinedRoomId()
-//        if (roomId == null || roomId == 0L) {
-//            Log.i(TAG_ROOM, "RoomActivity onStart, roomId is 0, finish()")
-//            //当前房间已经销毁,finish
-//            finish()
-//        }
+        val roomId = roomService.joinController.getJoinedRoomId()
+        if (roomId.isNullOrEmpty()) {
+            Log.i(TAG_ROOM, "RoomActivity onStart, roomId is 0, finish()")
+            //当前房间已经销毁,finish
+            finish()
+        }
+    }
+
+    override fun observeViewModel() {
+        super.observeViewModel()
+        flowViewModel.roomStateLD.observe(this) {
+            when (it.second) {
+                RoomState.ROOM_IN -> {
+                    //当"ROOM_IN"时,此时已经房间的信息已经完整
+//                    inflateRoomFragment(roomService.attrController.getRoomType())
+//                    (supportFragmentManager.findFragmentByTag(REJOIN_TIP_DIALOG) as? CommonDialog)?.dismiss()
+                }
+
+                RoomState.ROOM_LEAVE -> {
+                    val flowStateInfo = it.third
+                    if (flowStateInfo.leaveUI) {
+                        finish()
+                    }
+                }
+
+                else -> {}
+            }
+        }
     }
 
     private fun switchToChatRoom() {
@@ -161,6 +193,7 @@ class RoomActivity : BaseActivity(), IRoomOpListener {
     }
 
     private fun handleExitRoom(reason: LeaveRoomReason) {
+        flowViewModel.tryLeaveRoom(reason)
         finish()
     }
 

+ 1 - 1
module/room/src/main/java/com/adealink/weparty/room/chatroom/page/dispatchcenter/DispatchCenterRoomPageFragment.kt

@@ -81,7 +81,7 @@ class DispatchCenterRoomPageFragment :
         fragmentList.add(chatMessageFragment)
         fragmentList.add(bottomOperateFragment)
         binding.exitBtn.setOnClickListener {
-            exitRoom(LeaveRoomReason.INITIATIVE, true)
+            exitRoom(LeaveRoomReason.INITIATIVE, false)
         }
     }
 

+ 6 - 8
module/room/src/main/java/com/adealink/weparty/room/interceptor/EnterRoomUriInterceptor.kt

@@ -129,12 +129,12 @@ class EnterRoomUriInterceptor : UriInterceptor {
         intent.putExtra(EXTRA_ENTER_ROOM_INFO, enterRoomInfo)
 
         //当前已经是进房状态,直接进入房间
-//        val joinedRoomId = roomService.joinController.getJoinedRoomId()
-//        if (joinedRoomId == enterRoomInfo.roomId) {
-//            Log.d(TAG_ROOM_ENTER_ROOM, "EnterRoomUriInterceptor, already joined room, proceed()")
-//            chain.proceed(request)
-//            return
-//        }
+        val joinedRoomId = roomService.joinController.getJoinedRoomId()
+        if (joinedRoomId == enterRoomInfo.roomId) {
+            Log.d(TAG_ROOM_ENTER_ROOM, "EnterRoomUriInterceptor, already joined room, proceed()")
+            chain.proceed(request)
+            return
+        }
 
         //房间媒体冲突处理失败,进房失败
         val conflictRlt = App.instance.mediaManager.conflictHandle(
@@ -152,8 +152,6 @@ class EnterRoomUriInterceptor : UriInterceptor {
             .build()
         progressDialog.show(activity.supportFragmentManager, ProgressDialog.TAG)
 
-        val startTime = SystemClock.elapsedRealtime()
-        // TODO: zhangfei 延后到进房后再进房
         val result = roomService.joinController.joinRoom(
             JoinRoomReq(
                 enterRoomInfo.roomId

+ 0 - 17
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/BaseController.kt

@@ -5,7 +5,6 @@ import androidx.annotation.CallSuper
 import com.adealink.frame.coroutine.dispatcher.Dispatcher.remove
 import com.adealink.frame.coroutine.dispatcher.Dispatcher.submit
 import com.adealink.frame.data.collections.ConcurrentList
-import com.adealink.frame.room.data.ChannelState
 import com.adealink.frame.room.data.FlowStateInfo
 import com.adealink.frame.room.data.RoomState
 import com.adealink.frame.room.listener.IListener
@@ -75,24 +74,8 @@ abstract class BaseController<L : IListener>(
         }
     }
 
-    @CallSuper
-    override fun onChannelStateChanged(fromState: ChannelState, toState: ChannelState, flowStateInfo: FlowStateInfo) {
-        when (toState) {
-            ChannelState.CHANNEL_IN -> {
-                onChannelIn(flowStateInfo)
-            }
-            ChannelState.CHANNEL_LEAVE -> {
-                onChannelLeave(flowStateInfo)
-            }
-        }
-    }
-
     open fun onRoomIn(flowStateInfo: FlowStateInfo) {}
 
-    open fun onChannelIn(flowStateInfo: FlowStateInfo) {}
-
-    open fun onChannelLeave(flowStateInfo: FlowStateInfo) {}
-
     open fun onRoomLeaved(flowStateInfo: FlowStateInfo) {}
 
     fun runOnSerialHandler(runnable: Runnable, delay: Long = 0L) {

+ 0 - 9
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/IController.kt

@@ -1,6 +1,5 @@
 package com.adealink.weparty.room.sdk.controller
 
-import com.adealink.frame.room.data.ChannelState
 import com.adealink.frame.room.data.FlowStateInfo
 import com.adealink.frame.room.data.RoomState
 import com.adealink.frame.room.listener.IListener
@@ -19,12 +18,4 @@ interface IController<L : IListener> {
         flowStateInfo: FlowStateInfo
     ) {
     }
-
-    fun onChannelStateChanged(
-        fromState: ChannelState,
-        toState: ChannelState,
-        flowStateInfo: FlowStateInfo
-    ) {
-    }
-
 }

+ 13 - 3
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/IJoinController.kt

@@ -4,6 +4,7 @@ import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.room.data.JoinRoomReq
 import com.adealink.frame.room.data.LeaveRoomReason
+import com.adealink.frame.room.data.RoomState
 import com.adealink.weparty.room.sdk.listener.IJoinListener
 import io.trtc.tuikit.atomicxcore.api.live.LiveInfo
 
@@ -17,8 +18,18 @@ interface IJoinController<L : IJoinListener> : IController<L> {
      */
     fun getJoinedRoomId(): String?
 
+    /**
+     * 是否进房或在房
+     */
+    fun isRoomJoiningOrJoined(): Boolean
+
     suspend fun joinRoom(req: JoinRoomReq): Rlt<Any>
 
+    /**
+     * 获取进房状态
+     */
+    fun getJoinRoomState(): RoomState
+
     /**
      * 离开直播(下麦+退房)
      */
@@ -30,9 +41,8 @@ interface IJoinController<L : IJoinListener> : IController<L> {
     /**
      * 结束直播(解散房间)
      */
-    suspend fun tryEndRoom(
-        reason: LeaveRoomReason = LeaveRoomReason.INITIATIVE,
-        leaveUI: Boolean = false
+    suspend fun closeRoom(
+        reason: LeaveRoomReason = LeaveRoomReason.INITIATIVE
     )
 
 }

+ 25 - 31
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/impl/JoinController.kt

@@ -5,7 +5,6 @@ import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.log.Log
 import com.adealink.frame.media.data.RtcType
-import com.adealink.frame.room.data.ChannelState
 import com.adealink.frame.room.data.FlowStateInfo
 import com.adealink.frame.room.data.JoinRoomReq
 import com.adealink.frame.room.data.LeaveRoomReason
@@ -34,56 +33,53 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
     BaseController<IJoinListener>(ctx, serialHandler),
     IJoinController<IJoinListener>,
     IRoomStateChangeListener {
-
-
     private var currentRoomState = RoomState.ROOM_LEAVE
-    private var currentChannelState = ChannelState.CHANNEL_LEAVE
 
     override var joiningRoomId: String? = null
     override var joinedRoomInfo: LiveInfo? = null
 
-    override fun notifyRoomStateChanged(
+    override fun onRoomStateChanged(
         fromState: RoomState,
         toState: RoomState,
         flowStateInfo: FlowStateInfo
     ) {
-        Log.i(
-            TAG_ROOM_FLOW,
-            "notifyRoomStateChanged, fromState:$fromState, toState:$toState, flowStateInfo:$flowStateInfo"
-        )
-        ctx.roomService.controllers.forEach {
+        super<BaseController>.onRoomStateChanged(fromState, toState, flowStateInfo)
+        listeners.dispatch {
             it.onRoomStateChanged(fromState, toState, flowStateInfo)
         }
     }
 
-    override fun notifyChannelStateChanged(
-        fromState: ChannelState,
-        toState: ChannelState,
+    override fun notifyRoomStateChanged(
+        fromState: RoomState,
+        toState: RoomState,
         flowStateInfo: FlowStateInfo
     ) {
         Log.i(
             TAG_ROOM_FLOW,
-            "notifyChannelStateChanged, fromState:$fromState, toState:$toState, flowStateInfo:$flowStateInfo"
+            "notifyRoomStateChanged, fromState:$fromState, toState:$toState, flowStateInfo:$flowStateInfo"
         )
         ctx.roomService.controllers.forEach {
-            it.onChannelStateChanged(fromState, toState, flowStateInfo)
+            it.onRoomStateChanged(fromState, toState, flowStateInfo)
         }
     }
 
-
     override fun getJoinedRoomId(): String? {
         return joinedRoomInfo?.liveID
     }
 
+    override fun isRoomJoiningOrJoined(): Boolean {
+        return joiningRoomId != null || joinedRoomInfo != null
+    }
+
     override suspend fun joinRoom(req: JoinRoomReq): Rlt<Any> {
         Log.d(TAG_ROOM_FLOW, "joinRoom: $req")
         return withContext(this.coroutineContext) {
             logRoomTime("joinRoom enter")
-//            val joinedRoomId = getJoinedRoomId()
-//            if (joinedRoomId == req.roomId) {
-//                Log.i(TAG_ROOM_FLOW, "joinRoom, already joined, joinedRoomId:${joinedRoomId}")
-//                return@withContext Rlt.Success(Any())
-//            }
+            val joinedRoomId = getJoinedRoomId()
+            if (joinedRoomId == req.roomId) {
+                Log.i(TAG_ROOM_FLOW, "joinRoom, already joined, joinedRoomId:${joinedRoomId}")
+                return@withContext Rlt.Success(Any())
+            }
 
             if (joiningRoomId == req.roomId) {
                 Log.i(TAG_ROOM_FLOW, "joinRoom, same room joining, joiningRoomId:${req.roomId}")
@@ -119,6 +115,10 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
         }
     }
 
+    override fun getJoinRoomState(): RoomState {
+        return currentRoomState
+    }
+
     private suspend fun suspendJoinRoom(req: JoinRoomReq): Rlt<LiveInfo> {
         return suspendCancellableCoroutine { coroutine ->
             LiveListStore.shared().joinLive(req.roomId, object : LiveInfoCompletionHandler {
@@ -190,19 +190,19 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
         }
     }
 
-    override suspend fun tryEndRoom(reason: LeaveRoomReason, leaveUI: Boolean) {
+    override suspend fun closeRoom(reason: LeaveRoomReason) {
         val joinedRoomId = getJoinedRoomId() ?: return
         withContext(this.coroutineContext) {
-            endLastRoom(joinedRoomId, reason, leaveUI)
+            endLastRoom(joinedRoomId, reason)
         }
     }
 
-    private suspend fun endLastRoom(roomId: String?, reason: LeaveRoomReason, leaveUI: Boolean) {
+    private suspend fun endLastRoom(roomId: String?, reason: LeaveRoomReason) {
         val joinedRoomId = roomId ?: return
         val flowStateInfo = FlowStateInfo().apply {
             this.roomId = joinedRoomId
             this.reason = reason.reason
-            this.leaveUI = leaveUI
+            this.leaveUI = true
         }
         clearJoinedRoomInfo()
         innerEndRoom(joinedRoomId)
@@ -242,10 +242,4 @@ open class JoinController(override val ctx: IRoomContext, serialHandler: Handler
         notifyRoomStateChanged(lastState, toState, flowStateInfo)
     }
 
-
-    companion object {
-        private const val REJOIN_CHANNEL_DELAY = 10_000L
-        private const val REJOINING_INTERVAL_MS = 15 * 1000
-    }
-
 }

+ 5 - 1
module/room/src/main/java/com/adealink/weparty/room/sdk/controller/impl/SeatController.kt

@@ -61,7 +61,11 @@ class SeatController(override val ctx: IRoomContext, serialHandler: Handler) :
             TAG_ROOM_SEAT,
             "onRoomLeaved, ${flowStateInfo.roomId}, reason:${flowStateInfo.reason}"
         )
-        liveSeatStore?.liveSeatState?.seatList
+        if (selfMicSeatInfo != null) {
+            //reset前执行
+            //notifySelfMicSeatChanged(null)
+        }
+        //clearMicSeatSpeaking()
     }
 
     private fun observeSeatList() {

+ 7 - 9
module/room/src/main/java/com/adealink/weparty/room/sdk/listener/IJoinListener.kt

@@ -1,10 +1,8 @@
 package com.adealink.weparty.room.sdk.listener
 
-import com.adealink.frame.room.data.ChannelState
 import com.adealink.frame.room.data.FlowStateInfo
 import com.adealink.frame.room.data.RoomState
 import com.adealink.frame.room.listener.IListener
-import com.adealink.weparty.module.room.data.RoomInfo
 
 interface IJoinListener : IListener {
 
@@ -15,13 +13,13 @@ interface IJoinListener : IListener {
     ) {
     } //Dispatcher.SINGLE_BG上回调
 
-    fun onChannelStateChanged(
-        fromState: ChannelState,
-        toState: ChannelState,
-        flowStateInfo: FlowStateInfo,
-    ) {
-    }
+//    fun onChannelStateChanged(
+//        fromState: ChannelState,
+//        toState: ChannelState,
+//        flowStateInfo: FlowStateInfo,
+//    ) {
+//    }
 
-    fun onJoinedRoomInfoUpdate(roomInfo: RoomInfo) {}
+//    fun onJoinedRoomInfoUpdate(roomInfo: RoomInfo) {}
 
 }

+ 1 - 1
module/room/src/main/java/com/adealink/weparty/room/setting/RoomSettingDialog.kt

@@ -21,7 +21,7 @@ class RoomSettingDialog : BottomDialogFragment(R.layout.dialog_room_setting) {
         }
         binding.btnClose.onClick {
             CoroutineScope(Dispatcher.UI).launch {
-                roomService.joinController.tryEndRoom()
+                roomService.joinController.closeRoom()
             }
         }
     }

+ 62 - 0
module/room/src/main/java/com/adealink/weparty/room/viewmodel/RoomFlowViewModel.kt

@@ -0,0 +1,62 @@
+package com.adealink.weparty.room.viewmodel
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import com.adealink.frame.coroutine.dispatcher.Dispatcher
+import com.adealink.frame.mvvm.viewmodel.BaseViewModel
+import com.adealink.frame.room.data.FlowStateInfo
+import com.adealink.frame.room.data.LeaveRoomReason
+import com.adealink.frame.room.data.RoomState
+import com.adealink.weparty.module.room.viewmodel.IRoomFlowViewModel
+import com.adealink.weparty.room.sdk.listener.IJoinListener
+import com.adealink.weparty.room.sdk.service.roomService
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+class RoomFlowViewModel : BaseViewModel(), IRoomFlowViewModel, IJoinListener {
+
+    private val joinController by lazy { roomService.joinController }
+
+    override val roomStateLD: LiveData<Triple<RoomState, RoomState, FlowStateInfo>> =
+        MutableLiveData() //first: from state, second: to state, third: state info
+
+    init {
+        joinController.addListener(this)
+    }
+
+    override fun tryLeaveRoom(reason: LeaveRoomReason) {
+        CoroutineScope(Dispatcher.UI).launch {
+            joinController.leaveRoom(reason)
+        }
+    }
+
+    override fun getJoiningRoomId(): String? {
+        return joinController.joiningRoomId
+    }
+
+    override fun getJoinedRoomId(): String? {
+        return joinController.getJoinedRoomId()
+    }
+
+    override fun getJoinRoomState(): RoomState {
+        return joinController.getJoinRoomState()
+    }
+
+    override fun onCleared() {
+        super.onCleared()
+        joinController.removeListener(this)
+    }
+
+    override fun onRoomStateChanged(
+        fromState: RoomState,
+        toState: RoomState,
+        flowStateInfo: FlowStateInfo,
+    ) {
+        roomStateLD.send(Triple(fromState, toState, flowStateInfo), false)
+    }
+
+//    override fun onChannelStateChanged(fromState: ChannelState, toState: ChannelState, flowStateInfo: FlowStateInfo) {
+//        channelStateLD.send(Triple(fromState, toState, flowStateInfo), false)
+//    }
+
+}

+ 3 - 0
module/room/src/main/java/com/adealink/weparty/room/viewmodel/RoomViewModelFactory.kt

@@ -12,6 +12,9 @@ class RoomViewModelFactory : ViewModelProvider.NewInstanceFactory() {
     override fun <T : ViewModel> create(modelClass: Class<T>): T {
         return with(modelClass) {
             when {
+                isAssignableFrom(RoomFlowViewModel::class.java) ->
+                    RoomFlowViewModel()
+
                 isAssignableFrom(RoomSeatViewModel::class.java) ->
                     RoomSeatViewModel()