Browse Source

1.添加直播详情页面UI

王鹏鹏 2 years ago
parent
commit
36af327cdd

+ 1 - 1
.idea/misc.xml

@@ -577,7 +577,7 @@
         <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/drawable/selector_live_tab_left.xml" value="0.1715" />
         <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/layout/activity_live_broadcast.xml" value="0.329232995658466" />
         <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/layout/activity_live_broadcast_list.xml" value="0.23697916666666666" />
-        <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/layout/activity_live_details.xml" value="0.2" />
+        <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/layout/activity_live_details.xml" value="0.6" />
         <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/layout/activity_video_player.xml" value="0.23697916666666666" />
         <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/layout/dialog_game_tasks.xml" value="0.536" />
         <entry key="..\:/workspace/hcp-pads/livebroadcast/src/main/res/layout/item_live_broadcast.xml" value="1.555984555984556" />

+ 4 - 5
livebroadcast/src/main/java/com/yingyang/livebroadcast/activity/list/LiveBroadcastListActivity.kt

@@ -15,7 +15,6 @@ import com.yingyang.livebroadcast.entity.Record
 import com.yingyangfly.baselib.dialog.TipDialogFragment
 import com.yingyangfly.baselib.ext.getEndAnimation
 import com.yingyangfly.baselib.ext.getScaleAnimation
-import com.yingyangfly.baselib.ext.show
 import com.yingyangfly.baselib.ext.toast
 import com.yingyangfly.baselib.mvvm.BaseMVVMActivity
 import com.yingyangfly.baselib.permissions.EsayPermissions
@@ -119,9 +118,9 @@ class LiveBroadcastListActivity :
     /**
      * 预约直播
      */
-    private fun appointmentLive(method: String) {
-        viewModel.reservationLive(method, fail = {
-            it.show()
+    private fun appointmentLive(id: String) {
+        viewModel.reservationLive(id, fail = {
+            "预约直播失败".toast()
         }, success = {
             runOnUiThread {
                 binding.rdbLive.isChecked = true
@@ -279,7 +278,7 @@ class LiveBroadcastListActivity :
     }
 
     /**
-     * 获取腾讯IM密钥
+     * 跳转直播页面
      */
     private fun getUserSign(url: String, id: String, title: String) {
         ARouter.getInstance().build(RouterUrlCommon.liveBroadcast)

+ 2 - 8
livebroadcast/src/main/java/com/yingyang/livebroadcast/adapter/LiveBroadcastAdapter.kt

@@ -58,15 +58,12 @@ class LiveBroadcastAdapter(override val layoutId: Int = R.layout.item_live_broad
                 "4" -> {
                     "直播取消"
                 }
-                "5" -> {
-                    "直播结束"
-                }
                 else -> {
-                    "录播生成"
+                    "直播结束"
                 }
             }
         } else if (TextUtils.equals("直播回放", method)) {
-            binding.tvTime.text = "直播时间:" + item.beginTime
+            binding.tvTime.text = "直播时间:" + item.getBeginTimeInfo()
             binding.tvTitle.text = method
         }
         binding.tvTitle.setOnSingleClickListener {
@@ -102,9 +99,6 @@ class LiveBroadcastAdapter(override val layoutId: Int = R.layout.item_live_broad
                         "4" -> {
                             "您好,本次直播已取消,您可以预约观看其他直播,感谢您的参与!".toast()
                         }
-                        "5" -> {
-                            "您好,本次直播已经结束,您可以选择观看直播回放,也可以预约观看其他直播。感谢您的参与!".toast()
-                        }
                         else -> {
                             "您好,本次直播已经结束,您可以选择观看直播回放,也可以预约观看其他直播。感谢您的参与!".toast()
                         }

+ 193 - 6
livebroadcast/src/main/java/com/yingyang/livebroadcast/details/LiveDetailsActivity.kt

@@ -5,12 +5,20 @@ import android.text.TextUtils
 import android.view.MotionEvent
 import android.view.View
 import com.alibaba.android.arouter.facade.annotation.Route
+import com.alibaba.android.arouter.launcher.ARouter
+import com.hjq.permissions.OnPermissionCallback
+import com.hjq.permissions.XXPermissions
 import com.yingyang.livebroadcast.R
 import com.yingyang.livebroadcast.databinding.ActivityLiveDetailsBinding
 import com.yingyang.livebroadcast.entity.Record
-import com.yingyangfly.baselib.base.BaseActivity
+import com.yingyangfly.baselib.dialog.TipDialogFragment
 import com.yingyangfly.baselib.ext.getEndAnimation
 import com.yingyangfly.baselib.ext.getScaleAnimation
+import com.yingyangfly.baselib.ext.show
+import com.yingyangfly.baselib.ext.toast
+import com.yingyangfly.baselib.mvvm.BaseMVVMActivity
+import com.yingyangfly.baselib.permissions.EsayPermissions
+import com.yingyangfly.baselib.permissions.Permission
 import com.yingyangfly.baselib.router.RouterUrlCommon
 import com.yingyangfly.baselib.utils.GsonUtil
 
@@ -18,24 +26,74 @@ import com.yingyangfly.baselib.utils.GsonUtil
  * 直播详情
  */
 @Route(path = RouterUrlCommon.liveDetails)
-class LiveDetailsActivity : BaseActivity<ActivityLiveDetailsBinding>(),
+class LiveDetailsActivity : BaseMVVMActivity<ActivityLiveDetailsBinding, LiveDetailsViewModel>(),
     View.OnTouchListener {
 
+    private val permissions = mutableListOf(
+        Permission.WRITE_EXTERNAL_STORAGE,
+        Permission.CAMERA,
+        Permission.RECORD_AUDIO,
+        Permission.READ_EXTERNAL_STORAGE
+    )
+
     private var url = ""
+    private var record: Record? = null
 
+    @SuppressLint("SetTextI18n")
     override fun initViews() {
         url = intent.getStringExtra("url") ?: ""
         if (TextUtils.isEmpty(url).not()) {
-            val record = GsonUtil.GsonToBean(url, Record::class.java)
+            record = GsonUtil.GsonToBean(url, Record::class.java)
             if (record != null) {
                 binding.data = record
+                when (record?.liveStatus) {
+                    "1" -> {
+                        binding {
+                            if (TextUtils.equals("1", record?.isReservation)) {
+                                tvStatus.text = "未开始"
+                            } else {
+                                tvStatus.text = "预约直播"
+                            }
+                            tvLiveTime.text = "直播时间:" + record?.getLiveTime()
+                        }
+                    }
+                    "2" -> {
+                        binding {
+                            tvStatus.text = "直播中"
+                            tvLiveTime.text = "直播时间:" + record?.getLiveTime()
+                        }
+                    }
+                    "3" -> {
+                        binding {
+                            tvStatus.text = "直播中断"
+                            tvLiveTime.text = "直播时间:" + record?.getLiveTime()
+                        }
+                    }
+                    "4" -> {
+                        binding {
+                            tvStatus.text = "直播取消"
+                            tvLiveTime.text = "直播时间:" + record?.getLiveTime()
+                        }
+                    }
+                    else -> {
+                        binding.tvLiveTime.text = "直播时间:" + record?.getBeginTimeInfo()
+                        if (TextUtils.isEmpty(record?.liveVideo)) {
+                            binding.tvStatus.text = "直播结束"
+                        } else {
+                            binding.tvStatus.text = "观看回放"
+                        }
+                    }
+                }
             }
         }
     }
 
     @SuppressLint("ClickableViewAccessibility")
     override fun initListener() {
-        binding.layoutHome.setOnTouchListener(this)
+        binding {
+            layoutHome.setOnTouchListener(this@LiveDetailsActivity)
+            tvStatus.setOnTouchListener(this@LiveDetailsActivity)
+        }
     }
 
     override fun initData() {
@@ -46,7 +104,7 @@ class LiveDetailsActivity : BaseActivity<ActivityLiveDetailsBinding>(),
     override fun onTouch(v: View, event: MotionEvent): Boolean {
         when (event.action) {
             MotionEvent.ACTION_DOWN -> {
-                if (v.id == R.id.layoutHome) {
+                if (v.id == R.id.layoutHome || v.id == R.id.tvStatus) {
                     v.startAnimation(getScaleAnimation())
                 }
             }
@@ -54,10 +112,45 @@ class LiveDetailsActivity : BaseActivity<ActivityLiveDetailsBinding>(),
                 v.startAnimation(getEndAnimation())
                 if (v.id == R.id.layoutHome) {
                     finish()
+                } else if (v.id == R.id.tvStatus) {
+                    if (record != null) {
+                        when (record?.liveStatus) {
+                            "1" -> {
+                                binding {
+                                    tvStatus.show(
+                                        TextUtils.equals("1", record?.isReservation).not()
+                                    )
+                                    if (TextUtils.equals("1", record?.isReservation)) {
+                                        "您好,本次直播尚未开始,请耐心等待,感谢您的参与!".toast()
+                                    } else {
+                                        if (TextUtils.isEmpty(record?.id).not()) {
+                                            appointmentLive(record?.id!!)
+                                        }
+                                    }
+                                }
+                            }
+                            "2" -> {
+                                initPermission()
+                            }
+                            "3" -> {
+                                "您好,本次直播已中断,请您刷新列表重试,,感谢您的参与!".toast()
+                            }
+                            "4" -> {
+                                "您好,本次直播已取消,您可以预约观看其他直播,感谢您的参与!".toast()
+                            }
+                            else -> {
+                                if (TextUtils.isEmpty(record?.liveVideo)) {
+                                    "您好,本次直播已经结束,您可以选择观看直播回放,也可以预约观看其他直播。感谢您的参与!".toast()
+                                } else {
+                                    videoPlayer()
+                                }
+                            }
+                        }
+                    }
                 }
             }
             MotionEvent.ACTION_CANCEL -> {
-                if (v.id == R.id.layoutHome) {
+                if (v.id == R.id.layoutHome || v.id == R.id.tvStatus) {
                     v.startAnimation(getEndAnimation())
                 }
             }
@@ -65,4 +158,98 @@ class LiveDetailsActivity : BaseActivity<ActivityLiveDetailsBinding>(),
         return true
     }
 
+    /**
+     * 直播回放
+     */
+    private fun videoPlayer() {
+        if (record != null) {
+            ARouter.getInstance().build(RouterUrlCommon.videoPlayer)
+                .withString("url", record?.liveVideo)
+                .withString("title", record?.liveName)
+                .withTransition(
+                    R.anim.leftin,
+                    R.anim.leftout
+                ).navigation(mContext)
+        }
+    }
+
+    /**
+     * 预约直播
+     */
+    private fun appointmentLive(id: String) {
+        viewModel.reservationLive(id, fail = {
+            "预约直播失败".toast()
+        }, success = {
+            runOnUiThread {
+                if (record != null) {
+                    record?.isReservation = "1"
+                }
+                binding.tvStatus.text = "已预约"
+            }
+        })
+    }
+
+    /**
+     * 获取应用权限
+     */
+    private fun initPermission() {
+        val isHasPermission = XXPermissions.isGranted(this, permissions)
+        if (isHasPermission) {
+            getUserSign()
+        } else {
+            XXPermissions.with(this).permission(permissions).request(object : OnPermissionCallback {
+                override fun onGranted(permissions: List<String>, all: Boolean) {
+                    if (all) { // 全部获取权限成功
+                        getUserSign()
+                    } else { // 部分获取权限成功
+                        // 需要弹框处理
+                        showTipDialog()
+                    }
+                }
+
+                override fun onDenied(permissions: List<String>, never: Boolean) {
+                    if (never) { // 被永久拒绝
+                        // 如果是被永久拒绝就跳转到应用权限系统设置页面
+                        XXPermissions.startPermissionActivity(
+                            this@LiveDetailsActivity,
+                            permissions
+                        )
+                    } else {
+                        // 需要弹框处理
+                        showTipDialog()
+                    }
+                }
+            })
+        }
+    }
+
+    /**
+     * 跳转设置页面
+     */
+    private fun showTipDialog() {
+        TipDialogFragment.TipDialogBuilder()
+            .content("当前应用缺少必要权限,请点击“设置”-“权限”-“权限管理”打开所需权限")
+            .leftBtnText("退出")
+            .rightBtnText("设置")
+            .leftClick({
+            }, dimiss = true)
+            .rightClick({
+                EsayPermissions.gotoPermissionSettings(mContext)
+            }, dimiss = true)
+            .show(supportFragmentManager)
+    }
+
+    /**
+     * 跳转直播页面
+     */
+    private fun getUserSign() {
+        if (record != null && record?.streamInfo != null) {
+            ARouter.getInstance().build(RouterUrlCommon.liveBroadcast)
+                .withString("url", record?.streamInfo?.webrtcPull)
+                .withString("liveId", record?.id)
+                .withString("title", record?.liveName)
+                .withTransition(R.anim.leftin, R.anim.leftout)
+                .navigation(mContext)
+        }
+    }
 }

+ 57 - 0
livebroadcast/src/main/java/com/yingyang/livebroadcast/details/LiveDetailsViewModel.kt

@@ -0,0 +1,57 @@
+package com.yingyang.livebroadcast.details
+
+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
+import com.yingyangfly.baselib.utils.GsonUtil
+
+/**
+ * @author gold
+ * @date 2022/9/13 下午6:37
+ */
+class LiveDetailsViewModel : BaseViewModel() {
+
+    /**
+     * 获取直播列表
+     */
+    fun getLiveList(
+        showLoading: Boolean,
+        method: String,
+        pageStr: Int,
+        fail: ((msg: String) -> Unit)? = null,
+        success: ((success: LiveBroadcastListBean?) -> Unit)? = null,
+    ) = launchFlow(showLoading) {
+        val requestBean = LiveBroadcastListRequestBodyBean().apply {
+            page = pageStr.toString()
+            limit = "10"
+            name = ""
+            type = method
+        }
+        val body = XUtils.createJson(GsonUtil.GsonString(requestBean))
+        LIVEBROADCAST_API.getLiveList(body)
+    }.runUI(
+        success,
+        fail
+    )
+
+    /**
+     * 预约直播
+     */
+    fun reservationLive(
+        method: String,
+        fail: ((msg: String) -> Unit)? = null,
+        success: ((success: Boolean?) -> Unit)? = null,
+    ) = launchFlow(true) {
+        val requestBean = ReservationLiveBean().apply {
+            id = method
+        }
+        val body = XUtils.createJson(GsonUtil.GsonString(requestBean))
+        LIVEBROADCAST_API.reservationLive(body)
+    }.runUI(
+        success,
+        fail
+    )
+}

+ 9 - 13
livebroadcast/src/main/java/com/yingyang/livebroadcast/entity/LiveBroadcastListBean.kt

@@ -39,7 +39,7 @@ data class Record(
         if (TextUtils.isEmpty(beginTime).not() && TextUtils.isEmpty(endTime).not()) {
             simpleDateFormat(beginTime)
             return simpleDateFormat(beginTime).substring(
-                5,
+                0,
                 17
             ) + " - " + endTime.substring(11, 16)
         }
@@ -54,18 +54,6 @@ data class Record(
         return sdf.format(date as Date)
     }
 
-    fun getLivTime(): String {
-        return if (TextUtils.isEmpty(endTime)) {
-            if (TextUtils.isEmpty(beginTime)) {
-                ""
-            } else {
-                beginTime
-            }
-        } else {
-            "$beginTime - $endTime"
-        }
-    }
-
     fun getLiveDesnInfo(): String {
         return if (TextUtils.isEmpty(liveDesn)) {
             ""
@@ -73,6 +61,14 @@ data class Record(
             liveDesn
         }
     }
+
+    fun getBeginTimeInfo(): String {
+        return if (TextUtils.isEmpty(beginTime).not()) {
+            simpleDateFormat(beginTime).substring(0, 17)
+        } else {
+            ""
+        }
+    }
 }
 
 data class StreamInfo(

+ 13 - 1
livebroadcast/src/main/res/layout/activity_live_details.xml

@@ -97,7 +97,6 @@
                     android:layout_height="wrap_content"
                     android:layout_marginStart="@dimen/divider_21px"
                     android:layout_marginTop="@dimen/divider_28px"
-                    android:text='@{"直播标题:"+data.getLivTime()}'
                     android:textColor="@color/color_FF333333"
                     android:textSize="@dimen/divider_24px"
                     app:layout_constraintEnd_toEndOf="parent"
@@ -116,6 +115,19 @@
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toBottomOf="@+id/tvLiveTime" />
 
+                <androidx.appcompat.widget.AppCompatButton
+                    android:id="@+id/tvStatus"
+                    android:layout_width="@dimen/divider_160px"
+                    android:layout_height="@dimen/divider_48px"
+                    android:layout_marginBottom="@dimen/divider_27px"
+                    android:background="@drawable/bg_live_status"
+                    android:gravity="center"
+                    android:textColor="@android:color/white"
+                    android:textSize="@dimen/divider_24px"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent" />
+
             </androidx.constraintlayout.widget.ConstraintLayout>
 
         </com.google.android.material.card.MaterialCardView>