304 lines
11 KiB
Kotlin
304 lines
11 KiB
Kotlin
package com.example.defenseapplication.liveVideo
|
|
|
|
import android.content.res.Configuration
|
|
import android.graphics.Color
|
|
import android.os.Bundle
|
|
import android.util.Log
|
|
import android.view.View
|
|
import android.view.ViewGroup
|
|
import android.widget.LinearLayout
|
|
import android.widget.Toast
|
|
import androidx.activity.OnBackPressedCallback
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
import androidx.lifecycle.lifecycleScope
|
|
import chuangyuan.ycj.videolibrary.listener.VideoInfoListener
|
|
import chuangyuan.ycj.videolibrary.video.ExoUserPlayer
|
|
import chuangyuan.ycj.videolibrary.video.VideoPlayerManager
|
|
import com.google.android.exoplayer2.ui.PlayerView
|
|
import com.example.defenseapplication.R
|
|
import com.example.defenseapplication.adapter.AlarmLogAdapter
|
|
import com.example.defenseapplication.bean.DeviceAlarmBean
|
|
import com.example.defenseapplication.bean.DeviceAlarmResponse
|
|
import com.example.defenseapplication.databinding.AlarmLogActivityBinding
|
|
import com.example.defenseapplication.utils.RetrofitNetwork
|
|
import com.gyf.immersionbar.ImmersionBar
|
|
import kotlinx.coroutines.launch
|
|
import java.text.SimpleDateFormat
|
|
import java.util.*
|
|
import com.bigkoo.pickerview.builder.TimePickerBuilder
|
|
import com.bigkoo.pickerview.listener.OnTimeSelectListener
|
|
|
|
//告警记录
|
|
class AlarmLogActivity : AppCompatActivity() {
|
|
private lateinit var binding: AlarmLogActivityBinding
|
|
private lateinit var calendar: Calendar
|
|
private var adapter: AlarmLogAdapter? = null
|
|
private val alarmList = mutableListOf<DeviceAlarmBean>()
|
|
private val originalAlarmList = mutableListOf<DeviceAlarmBean>()
|
|
private lateinit var exoPlayerManager: ExoUserPlayer
|
|
private var isMuted = false
|
|
private var isVoiceEnabled = false
|
|
private var isLightOn = false
|
|
private var deviceId: String? = null
|
|
private var isLoading = false
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
binding = AlarmLogActivityBinding.inflate(layoutInflater)
|
|
setContentView(binding.root)
|
|
ImmersionBar.with(this)
|
|
.statusBarDarkFont(true)
|
|
.titleBar(binding.exoPlayContextId)
|
|
.init()
|
|
|
|
deviceId = intent.getStringExtra("device_id")
|
|
calendar = Calendar.getInstance()
|
|
updateDateDisplay()
|
|
initVideoPlayer()
|
|
initRecyclerView()
|
|
fetchAlarmList()
|
|
initListener()
|
|
|
|
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
|
|
override fun handleOnBackPressed() {
|
|
if (exoPlayerManager.onBackPressed()) {
|
|
return
|
|
}
|
|
finish()
|
|
}
|
|
})
|
|
}
|
|
|
|
private fun dpToPx(dp: Int): Int {
|
|
val density = resources.displayMetrics.density
|
|
return (dp * density).toInt()
|
|
}
|
|
|
|
private fun initVideoPlayer() {
|
|
val videoPlayerView = binding.exoPlayContextId
|
|
|
|
exoPlayerManager = VideoPlayerManager.Builder(VideoPlayerManager.TYPE_PLAY_GESTURE, videoPlayerView)
|
|
.setPlayUri("https://media.w3.org/2010/05/sintel/trailer.mp4")
|
|
.setPosition(0)
|
|
.addVideoInfoListener(object : VideoInfoListener {
|
|
override fun onPlayStart(p0: Long) {
|
|
Log.d("AlarmLogActivity", "视频开始播放")
|
|
}
|
|
|
|
override fun onLoadingChanged() {
|
|
// 视频加载状态变化
|
|
}
|
|
|
|
override fun onPlayerError(p0: com.google.android.exoplayer2.ExoPlaybackException?) {
|
|
Toast.makeText(this@AlarmLogActivity, "播放失败", Toast.LENGTH_SHORT).show()
|
|
}
|
|
|
|
override fun onPlayEnd() {
|
|
Log.d("AlarmLogActivity", "播放结束")
|
|
}
|
|
|
|
override fun isPlaying(p0: Boolean) {
|
|
// p0 表示当前是否正在播放
|
|
}
|
|
|
|
fun onRepeatModeChanged(p0: Int) {
|
|
// 循环模式改变时的回调
|
|
}
|
|
})
|
|
.create()
|
|
|
|
exoPlayerManager.startPlayer()
|
|
|
|
setupControllerVisibilityListener()
|
|
}
|
|
|
|
private fun setupControllerVisibilityListener() {
|
|
binding.exoPlayContextId.post {
|
|
val playerView = findPlayerView(binding.exoPlayContextId)
|
|
playerView?.setControllerVisibilityListener { visibility ->
|
|
if (visibility == View.VISIBLE) {
|
|
binding.muteBar.visibility = View.VISIBLE
|
|
binding.functionBar.visibility = View.VISIBLE
|
|
} else {
|
|
binding.muteBar.visibility = View.GONE
|
|
binding.functionBar.visibility = View.GONE
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun findPlayerView(view: View): PlayerView? {
|
|
if (view is PlayerView) {
|
|
return view
|
|
}
|
|
if (view is ViewGroup) {
|
|
for (i in 0 until view.childCount) {
|
|
val child = view.getChildAt(i)
|
|
val found = findPlayerView(child)
|
|
if (found != null) {
|
|
return found
|
|
}
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
private fun initRecyclerView() {
|
|
adapter = AlarmLogAdapter(alarmList)
|
|
binding.alarmListRecyclerView.layoutManager = LinearLayoutManager(this)
|
|
binding.alarmListRecyclerView.adapter = adapter
|
|
}
|
|
|
|
private fun fetchAlarmList() {
|
|
val currentDeviceId = deviceId ?: return
|
|
|
|
Log.d("AlarmLogActivity", "=== 开始请求设备告警日志 ===")
|
|
Log.d("AlarmLogActivity", "请求参数 - deviceId: $currentDeviceId")
|
|
|
|
isLoading = true
|
|
lifecycleScope.launch {
|
|
try {
|
|
Log.d("AlarmLogActivity", "正在发送网络请求...")
|
|
val response = RetrofitNetwork.getNetworkService().getDeviceAlarmList(
|
|
deviceId = currentDeviceId,
|
|
pageNum = "1",
|
|
pageSize = "100"
|
|
)
|
|
|
|
Log.d("AlarmLogActivity", "请求完成")
|
|
Log.d("AlarmLogActivity", "总条数: ${response.total}, 当前页数据条数: ${response.rows.size}")
|
|
|
|
val newData = response.rows
|
|
originalAlarmList.clear()
|
|
originalAlarmList.addAll(newData)
|
|
filterAlarmListByDate(calendar)
|
|
Log.d("AlarmLogActivity", "已获取 ${newData.size} 条数据")
|
|
|
|
} catch (e: Exception) {
|
|
Log.e("AlarmLogActivity", "请求异常: ${e.message}", e)
|
|
} finally {
|
|
isLoading = false
|
|
Log.d("AlarmLogActivity", "请求结束")
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun filterAlarmListByDate(selectedDate: Calendar) {
|
|
val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
|
|
val selectedDateStr = dateFormat.format(selectedDate.time)
|
|
|
|
alarmList.clear()
|
|
originalAlarmList.forEach { item ->
|
|
val itemDateStr = item.createTime.substring(0, 10)
|
|
if (itemDateStr == selectedDateStr) {
|
|
alarmList.add(item)
|
|
}
|
|
}
|
|
adapter?.notifyDataSetChanged()
|
|
Log.d("AlarmLogActivity", "日期筛选完成,筛选后条数: ${alarmList.size}")
|
|
}
|
|
|
|
private fun updateDateDisplay() {
|
|
val month = calendar.get(Calendar.MONTH) + 1
|
|
val day = calendar.get(Calendar.DAY_OF_MONTH)
|
|
binding.tvDate.text = "${month}月${day}日"
|
|
}
|
|
|
|
private fun initListener() {
|
|
binding.expandImg.setOnClickListener {
|
|
showDatePicker()
|
|
}
|
|
|
|
binding.ivMute.setOnClickListener {
|
|
toggleMute()
|
|
}
|
|
|
|
binding.ivDownload.setOnClickListener {
|
|
downloadVideo()
|
|
}
|
|
|
|
binding.ivDelete.setOnClickListener {
|
|
deleteVideo()
|
|
}
|
|
}
|
|
|
|
private fun toggleMute() {
|
|
isMuted = !isMuted
|
|
if (isMuted) {
|
|
binding.ivMute.setImageResource(R.drawable.mute)
|
|
Toast.makeText(this, R.string.sound_off, Toast.LENGTH_SHORT).show()
|
|
} else {
|
|
binding.ivMute.setImageResource(R.drawable.voice)
|
|
Toast.makeText(this, R.string.sound_on, Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
|
|
private fun downloadVideo() {
|
|
Toast.makeText(this, R.string.download, Toast.LENGTH_SHORT).show()
|
|
}
|
|
|
|
private fun deleteVideo() {
|
|
Toast.makeText(this, R.string.delete, Toast.LENGTH_SHORT).show()
|
|
}
|
|
|
|
override fun onResume() {
|
|
super.onResume()
|
|
exoPlayerManager.onResume()
|
|
}
|
|
|
|
override fun onPause() {
|
|
super.onPause()
|
|
exoPlayerManager.onPause()
|
|
}
|
|
|
|
override fun onDestroy() {
|
|
super.onDestroy()
|
|
exoPlayerManager.onDestroy()
|
|
}
|
|
|
|
override fun onConfigurationChanged(newConfig: Configuration) {
|
|
super.onConfigurationChanged(newConfig)
|
|
|
|
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
|
// 进入横屏(全屏)模式
|
|
binding.titleLayout.visibility = View.GONE
|
|
binding.alarmListRecyclerView.visibility = View.GONE
|
|
|
|
val params = binding.exoPlayContextId.layoutParams
|
|
params.width = LinearLayout.LayoutParams.MATCH_PARENT
|
|
params.height = LinearLayout.LayoutParams.MATCH_PARENT
|
|
binding.exoPlayContextId.layoutParams = params
|
|
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
|
// 进入竖屏(非全屏)模式
|
|
binding.titleLayout.visibility = View.VISIBLE
|
|
binding.alarmListRecyclerView.visibility = View.VISIBLE
|
|
|
|
val params = binding.exoPlayContextId.layoutParams
|
|
params.width = LinearLayout.LayoutParams.MATCH_PARENT
|
|
params.height = dpToPx(280)
|
|
binding.exoPlayContextId.layoutParams = params
|
|
}
|
|
|
|
exoPlayerManager.onConfigurationChanged(newConfig)
|
|
}
|
|
|
|
private fun showDatePicker() {
|
|
val timePicker = TimePickerBuilder(this, OnTimeSelectListener { date, _ ->
|
|
calendar.time = date
|
|
updateDateDisplay()
|
|
filterAlarmListByDate(calendar)
|
|
})
|
|
.setType(booleanArrayOf(true, true, true, false, false, false)) // 年月日
|
|
.setTitleText(getString(R.string.select_date))
|
|
.setSubmitColor(Color.parseColor("#09C2BD"))//确定按钮文字颜色
|
|
.setCancelColor(Color.parseColor("#09C2BD"))//取消按钮文字颜色
|
|
.setSubCalSize(18)//确定和取消文字大小
|
|
.setTextColorCenter(Color.parseColor("#09C2BD"))//选中颜色
|
|
.setLineSpacingMultiplier(2.5f)//行间距倍数
|
|
.setItemVisibleCount(5)//可见项数量
|
|
.build()
|
|
timePicker.show()
|
|
}
|
|
}
|