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() private val originalAlarmList = mutableListOf() 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() } }