Browse Source

1.添加预约直播接口
2.添加直播回放接口

王鹏鹏 2 years ago
parent
commit
f6dd177056

+ 52 - 9
livebroadcast/src/main/java/com/yingyang/livebroadcast/activity/list/LiveBroadcastListActivity.kt

@@ -2,11 +2,11 @@ package com.yingyang.livebroadcast.activity.list
 
 import androidx.recyclerview.widget.GridLayoutManager
 import com.alibaba.android.arouter.facade.annotation.Route
+import com.alibaba.android.arouter.launcher.ARouter
 import com.yingyang.livebroadcast.R
 import com.yingyang.livebroadcast.adapter.LiveBroadcastAdapter
 import com.yingyang.livebroadcast.databinding.ActivityLiveBroadcastListBinding
 import com.yingyang.livebroadcast.entity.Record
-import com.yingyang.livebroadcast.entity.StreamInfo
 import com.yingyangfly.baselib.dialog.TipDialogFragment
 import com.yingyangfly.baselib.ext.setOnSingleClickListener
 import com.yingyangfly.baselib.ext.toast
@@ -31,6 +31,14 @@ class LiveBroadcastListActivity :
         Permission.READ_EXTERNAL_STORAGE
     )
 
+    /**
+     * 类型 1预约大厅 2直播 3直播回放
+     */
+    private var method = "1"
+
+    /**
+     * 页码 默认1
+     */
     private var page = 1
     private var liveBroadcastList = mutableListOf<Record>()
 
@@ -41,28 +49,63 @@ class LiveBroadcastListActivity :
 
     override fun initViews() {
         binding {
-            rvLiveBroadcast.layoutManager = GridLayoutManager(this@LiveBroadcastListActivity, 2)
+            rvLiveBroadcast.layoutManager = GridLayoutManager(mContext, 2)
             rvLiveBroadcast.adapter = liveBroadcastAdapter
             liveBroadcastAdapter.setData(liveBroadcastList)
-            liveBroadcastAdapter.onLiveBroadcastImageClickListener = { bean ->
-                initPermission(bean)
+            liveBroadcastAdapter.onLiveBroadcastImageClickListener = { url, method, title, id ->
+                when (method) {
+                    "预约直播" -> {
+                        appointmentLive(id)
+                    }
+                    "直播中" -> {
+                        initPermission(url)
+                    }
+                    "直播回放" -> {
+                        ARouter.getInstance().build(RouterUrlCommon.videoPlayer)
+                            .withString("url", url)
+                            .withString("title", title)
+                            .withTransition(
+                                com.yingyangfly.baselib.R.anim.leftin,
+                                com.yingyangfly.baselib.R.anim.leftout
+                            )
+                            .navigation(mContext)
+                    }
+                }
+
             }
             radioLive.setOnCheckedChangeListener { group, checkedId ->
                 when (checkedId) {
                     R.id.rdb_appointment -> {
+                        method = "1"
                         liveBroadcastAdapter.setType("预约直播")
+                        loadData(true)
                     }
                     R.id.rdb_live -> {
+                        method = "2"
                         liveBroadcastAdapter.setType("直播中")
+                        loadData(true)
                     }
                     else -> {
+                        method = "3"
                         liveBroadcastAdapter.setType("直播回放")
+                        loadData(true)
                     }
                 }
             }
         }
     }
 
+    /**
+     * 预约直播
+     */
+    private fun appointmentLive(id: String) {
+        viewModel.reservationLive(id, fail = {
+            it.toast()
+        }, success = {
+
+        })
+    }
+
     override fun initListener() {
         binding {
             layoutHome.setOnSingleClickListener {
@@ -96,7 +139,7 @@ class LiveBroadcastListActivity :
         } else {
             page++
         }
-        viewModel.getLiveList(page, fail = {
+        viewModel.getLiveList(method, page, fail = {
             endRefresh()
             it.toast()
         }, success = {
@@ -124,10 +167,10 @@ class LiveBroadcastListActivity :
     /**
      * 获取应用权限
      */
-    private fun initPermission(bean: StreamInfo) {
+    private fun initPermission(url: String) {
         val isHasPermission = EsayPermissions.isHasPermissions(this, permissions)
         if (isHasPermission) {
-            JumpUtil.jumpActivityWithUrl(RouterUrlCommon.liveBroadcast, bean.webrtcPull, this)
+            JumpUtil.jumpActivityWithUrl(RouterUrlCommon.liveBroadcast, url, this)
         } else {
             EsayPermissions.with(this).permission(permissions).request(object : OnPermission {
                 override fun noPermission(denied: MutableList<String>?, quick: Boolean) {
@@ -138,8 +181,8 @@ class LiveBroadcastListActivity :
                     if (isAll) {
                         JumpUtil.jumpActivityWithUrl(
                             RouterUrlCommon.liveBroadcast,
-                            bean.webrtcPull,
-                            this@LiveBroadcastListActivity
+                            url,
+                            mContext
                         )
                     } else {
                         showTipDialog()

+ 21 - 1
livebroadcast/src/main/java/com/yingyang/livebroadcast/activity/list/LiveBroadcastListViewModel.kt

@@ -2,6 +2,7 @@ package com.yingyang.livebroadcast.activity.list
 
 import com.yingyang.livebroadcast.entity.LiveBroadcastListBean
 import com.yingyang.livebroadcast.entity.LiveBroadcastListRequestBodyBean
+import com.yingyang.livebroadcast.entity.ReservationLiveBean
 import com.yingyang.livebroadcast.net.LIVEBROADCAST_API
 import com.yingyangfly.baselib.mvvm.BaseViewModel
 import com.yingyangfly.baselib.net.XUtils
@@ -17,6 +18,7 @@ class LiveBroadcastListViewModel : BaseViewModel() {
      * 获取直播列表
      */
     fun getLiveList(
+        method: String,
         pageStr: Int,
         fail: ((msg: String) -> Unit)? = null,
         success: ((success: LiveBroadcastListBean) -> Unit)? = null,
@@ -25,7 +27,7 @@ class LiveBroadcastListViewModel : BaseViewModel() {
             page = pageStr.toString()
             limit = "10"
             name = ""
-
+            type = method
         }
         val body = XUtils.createJson(GsonUtil.GsonString(requestBean))
         LIVEBROADCAST_API.getLiveList(body)
@@ -34,4 +36,22 @@ class LiveBroadcastListViewModel : BaseViewModel() {
         fail
     )
 
+    /**
+     * 预约直播
+     */
+    fun reservationLive(
+        method: String,
+        fail: ((msg: String) -> Unit)? = null,
+        success: ((success: Unit) -> Unit)? = null,
+    ) = launchFlow(false) {
+        val requestBean = ReservationLiveBean().apply {
+            id = method
+        }
+        val body = XUtils.createJson(GsonUtil.GsonString(requestBean))
+        LIVEBROADCAST_API.reservationLive(body)
+    }.runUI(
+        success,
+        fail
+    )
+
 }

+ 17 - 7
livebroadcast/src/main/java/com/yingyang/livebroadcast/activity/video/VideoPlayerActivity.kt

@@ -5,6 +5,7 @@ import com.alibaba.android.arouter.facade.annotation.Route
 import com.tencent.rtmp.TXVodPlayer
 import com.yingyang.livebroadcast.databinding.ActivityVideoPlayerBinding
 import com.yingyangfly.baselib.base.BaseActivity
+import com.yingyangfly.baselib.ext.setOnSingleClickListener
 import com.yingyangfly.baselib.router.RouterUrlCommon
 
 
@@ -14,24 +15,33 @@ import com.yingyangfly.baselib.router.RouterUrlCommon
 @Route(path = RouterUrlCommon.videoPlayer)
 class VideoPlayerActivity : BaseActivity<ActivityVideoPlayerBinding>() {
 
-    private var url: String = ""
+    private var title = ""
+    private var url = ""
     private var mVodPlayer: TXVodPlayer? = null
 
     override fun onCreate(savedInstanceState: Bundle?) {
         url = intent.getStringExtra("url") ?: ""
+        title = intent.getStringExtra("title") ?: ""
         super.onCreate(savedInstanceState)
     }
 
     override fun initViews() {
-        //创建 player 对象
-        mVodPlayer = TXVodPlayer(this)
-        //关联 player 对象与视频渲染 view
-        mVodPlayer?.setPlayerView(binding.playTxCloudView)
-        mVodPlayer?.startVodPlay(url)
+        binding {
+            tvTitle.text = title
+            //创建 player 对象
+            mVodPlayer = TXVodPlayer(mContext)
+            //关联 player 对象与视频渲染 view
+            mVodPlayer?.setPlayerView(playTxCloudView)
+            mVodPlayer?.startVodPlay(url)
+        }
     }
 
     override fun initListener() {
-
+        binding {
+            backLayout.setOnSingleClickListener {
+                finish()
+            }
+        }
     }
 
     override fun initData() {

+ 23 - 3
livebroadcast/src/main/java/com/yingyang/livebroadcast/adapter/LiveBroadcastAdapter.kt

@@ -22,14 +22,34 @@ class LiveBroadcastAdapter(override val layoutId: Int = R.layout.item_live_broad
         notifyDataSetChanged()
     }
 
-    var onLiveBroadcastImageClickListener: ((bean: StreamInfo) -> Unit)? = null
+    var onLiveBroadcastImageClickListener: ((url: String, method: String, title: String, id: String) -> Unit)? =
+        null
 
     override fun onBindViewHolder(binding: ItemLiveBroadcastBinding, item: Record, position: Int) {
         binding.data = item
         binding.tvTitle.text = method
         binding.layoutLiveBroadcast.setOnSingleClickListener {
-            if (item.streamInfo != null) {
-                onLiveBroadcastImageClickListener?.invoke(item.streamInfo)
+            when (method) {
+                "预约直播" -> {
+                    onLiveBroadcastImageClickListener?.invoke("", method, item.liveName, item.id)
+                }
+                "直播中" -> {
+                    onLiveBroadcastImageClickListener?.invoke(
+                        item.streamInfo.webrtcPull,
+                        method,
+                        item.liveName,
+                        ""
+                    )
+                }
+                "直播回放" -> {
+                    onLiveBroadcastImageClickListener?.invoke(
+                        item.liveVideo,
+                        method,
+                        item.liveName,
+                        ""
+                    )
+                }
+
             }
         }
     }

+ 1 - 0
livebroadcast/src/main/java/com/yingyang/livebroadcast/entity/LiveBroadcastListBean.kt

@@ -26,6 +26,7 @@ data class Record(
     val liveName: String,//直播名称
     val liveStatus: String,//直播状态 1未开始 2直播中 3已结束 4已取消
     val liveTags: String,//设置标签
+    val liveVideo: String,//录播地址
     val streamInfo: StreamInfo//流信息
 )
 

+ 1 - 0
livebroadcast/src/main/java/com/yingyang/livebroadcast/entity/LiveBroadcastListRequestBodyBean.kt

@@ -7,5 +7,6 @@ class LiveBroadcastListRequestBodyBean {
     var limit: String? = null//条数 默认10
     var name: String? = null//名称
     var page: String? = null//页码 默认1
+    var type: String? = null//类型 1预约大厅 2直播 3直播回放
 
 }

+ 8 - 0
livebroadcast/src/main/java/com/yingyang/livebroadcast/entity/ReservationLiveBean.kt

@@ -0,0 +1,8 @@
+package com.yingyang.livebroadcast.entity
+
+/**
+ * 预约直播bean
+ */
+class ReservationLiveBean {
+    var id: String? = null//直播id
+}

+ 8 - 1
livebroadcast/src/main/java/com/yingyang/livebroadcast/net/LivebroadcastApiService.kt

@@ -11,7 +11,7 @@ import retrofit2.http.Query
 interface LivebroadcastApiService {
 
     /**
-     * 获取首页游戏列表
+     * 获取直播列表
      */
     @POST("live/page")
     suspend fun getLiveList(@Body requestBody: RequestBody): BaseResp<LiveBroadcastListBean>
@@ -28,4 +28,11 @@ interface LivebroadcastApiService {
     @POST("im/user_sign")
     suspend fun getUserSign(@Query("userId") userId: String): BaseResp<String>
 
+    /**
+     * 预约直播列表
+     */
+    @POST("live/reservation")
+    suspend fun reservationLive(@Body requestBody: RequestBody): BaseResp<Unit>
+
+
 }

+ 1 - 1
livebroadcast/src/main/res/layout/activity_live_broadcast_list.xml

@@ -63,7 +63,7 @@
                 android:id="@+id/rdb_live"
                 style="@style/broadcast_radio_button"
                 android:background="@drawable/selector_live_tab_center"
-                android:text="@string/appointment_hall" />
+                android:text="@string/live_streaming" />
 
             <RadioButton
                 android:id="@+id/rdb_playback"

+ 38 - 4
livebroadcast/src/main/res/layout/activity_video_player.xml

@@ -10,7 +10,35 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
-        android:layout_height="match_parent">
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_live_broadcast">
+
+        <LinearLayout
+            android:id="@+id/backLayout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/divider_50px"
+            android:layout_marginTop="@dimen/divider_32px"
+            android:gravity="center"
+            android:orientation="horizontal"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintTop_toTopOf="parent">
+
+            <androidx.appcompat.widget.AppCompatImageView
+                android:layout_width="@dimen/divider_50px"
+                android:layout_height="@dimen/divider_50px"
+                android:background="@mipmap/icon_back" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/divider_18px"
+                android:text="@string/back_pager"
+                android:textColor="@android:color/white"
+                android:textSize="@dimen/divider_38px"
+                android:textStyle="bold" />
+
+        </LinearLayout>
 
         <androidx.appcompat.widget.AppCompatTextView
             android:id="@+id/tvTitle"
@@ -24,14 +52,20 @@
             app:layout_constraintRight_toRightOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
-        <com.tencent.rtmp.ui.TXCloudVideoView
-            android:id="@+id/play_tx_cloud_view"
+        <androidx.cardview.widget.CardView
             android:layout_width="@dimen/divider_1078px"
             android:layout_height="@dimen/divider_606px"
+            app:cardCornerRadius="@dimen/divider_40px"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
+            app:layout_constraintTop_toTopOf="parent">
+
+            <com.tencent.rtmp.ui.TXCloudVideoView
+                android:id="@+id/play_tx_cloud_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
 
+        </androidx.cardview.widget.CardView>
     </androidx.constraintlayout.widget.ConstraintLayout>
 </layout>

+ 1 - 0
livebroadcast/src/main/res/values/strings.xml

@@ -6,6 +6,7 @@
     <string name="appointment_hall" tools:ignore="ResourceName">预约大厅</string>
     <string name="live_playback" tools:ignore="ResourceName">直播回放</string>
     <string name="welcome_to_ask_questions" tools:ignore="ResourceName">欢迎您提问题</string>
+    <string name="live_streaming" tools:ignore="MissingTranslation,ResourceName">直播</string>
 
 
 </resources>