package com.casic.endoscope.view import android.annotation.SuppressLint import android.os.Bundle import android.view.View import android.widget.ImageView import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.endoscope.R import com.casic.endoscope.adapter.MediaDirAdapter import com.casic.endoscope.databinding.ActivityAlbumBinding import com.casic.endoscope.utils.FileManager import com.casic.endoscope.utils.ProjectConstant import com.casic.endoscope.widgets.AlertControlDialog import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getStatusBarHeight import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.shuyu.gsyvideoplayer.GSYVideoManager import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File import java.util.Timer import java.util.TimerTask class AlbumActivity : KotlinBaseActivity<ActivityAlbumBinding>() { private val kTag = "AlbumActivity" private val context = this //子文件夹集合 private lateinit var tempSet: HashSet<String> private lateinit var dirBeans: MutableList<String> private lateinit var directoryAdapter: MediaDirAdapter private var timer: Timer? = null @SuppressLint("NotifyDataSetChanged") override fun initEvent() { binding.videoDecodeButton.setOnClickListener { val originVideoCollection = ArrayList<String>() val convertedVideoCollection = ArrayList<String>() val videoDir = File(FileManager.getRootDirectory(), "Video") videoDir.listFiles()?.forEach { dir -> val childDir = File(dir.absolutePath) childDir.listFiles()?.forEach { file -> if (file.name.startsWith("t")) { convertedVideoCollection.add(file.absolutePath) } else { originVideoCollection.add(file.absolutePath) } } } //将已转换的全部去掉t,得到一个临时数组,在和原数组比较,得到差集 val temp = ArrayList<String>() convertedVideoCollection.forEach { temp.add(it.replace("/t", "/")) } //将temp和originVideoCollection求差集 val stringSet = originVideoCollection.subtract(temp.toSet()) if (stringSet.isEmpty()) { "没有需要手动转码的视频".show(context) return@setOnClickListener } AlertControlDialog.Builder() .setContext(context) .setTitle("温馨提示") .setMessage("共有${stringSet.size}个视频需要转码,是否继续?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { binding.progressBarLayout.visibility = View.VISIBLE binding.progressBar.max = stringSet.size stringSet.forEach { ProjectConstant.VIDEO_PATH_STACK.push(it) } timer = Timer() timer?.schedule(object : TimerTask() { override fun run() { runOnUiThread { binding.progressBar.progress = ProjectConstant.decodedViewCount if (ProjectConstant.decodedViewCount == stringSet.size) { binding.progressBarLayout.visibility = View.INVISIBLE timer?.cancel() } //刷新列表 directoryAdapter.notifyDataSetChanged() } } }, 0, 2000) } override fun onCancelClick() { } }).build().show() } binding.ascButton.setOnClickListener { //按时间排序,降序 dirBeans = tempSet.sortedWith { d1, d2 -> d2.compareTo(d1) }.toMutableList() directoryAdapter.setRefreshData(dirBeans) } binding.decButton.setOnClickListener { //升序 dirBeans = tempSet.sortedWith { d1, d2 -> d1.compareTo(d2) }.toMutableList() directoryAdapter.setRefreshData(dirBeans) } } override fun initOnCreate(savedInstanceState: Bundle?) { //初始化已转码得视频数量和状态 ProjectConstant.isUnderDecodingVideo = false ProjectConstant.decodedViewCount = 0 val temp = ArrayList<String>() val videoDir = File(FileManager.getRootDirectory(), "Video") videoDir.list()?.forEach { temp.add(it) } val imageDir = File(FileManager.getRootDirectory(), "Picture") imageDir.list()?.forEach { temp.add(it) } //去重 tempSet = HashSet(temp) //排序,降序 dirBeans = tempSet.sortedWith { d1, d2 -> d2.compareTo(d1) }.toMutableList() //绑定数据 directoryAdapter = object : MediaDirAdapter(this, dirBeans) { override fun bindChildVideoRes(child: ViewHolder, childPos: Int, item: File) { val videoPlayer = child.getView<StandardGSYVideoPlayer>(R.id.videoPlayer) videoPlayer.titleTextView.visibility = View.GONE videoPlayer.backButton.visibility = View.GONE lifecycleScope.launch(Dispatchers.Main) { try { val drawable = withContext(Dispatchers.IO) { Glide.with(context).load(item).submit().get() } val coverImg = ImageView(context) coverImg.setImageDrawable(drawable) videoPlayer.thumbImageView = coverImg } catch (e: Exception) { e.printStackTrace() } } videoPlayer.setUp(item.absolutePath, true, "") videoPlayer.fullscreenButton.setOnClickListener { navigatePageTo<FullScreenVideoActivity>(item.absolutePath) } videoPlayer.playTag = System.currentTimeMillis().toString() videoPlayer.playPosition = childPos videoPlayer.isReleaseWhenLossAudio = false videoPlayer.setIsTouchWiget(false) } } val offset = 10.dp2px(this) binding.recyclerView.addItemDecoration( RecyclerViewItemOffsets(offset, offset, offset, offset) ) binding.recyclerView.adapter = directoryAdapter } override fun initViewBinding(): ActivityAlbumBinding { return ActivityAlbumBinding.inflate(layoutInflater) } override fun observeRequestState() { } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = getStatusBarHeight() binding.rootView.setPadding(0, statusBarHeight, 0, 0) binding.rootView.requestLayout() } override fun onPause() { super.onPause() GSYVideoManager.onPause() } override fun onResume() { super.onResume() GSYVideoManager.onResume() } override fun onDestroy() { super.onDestroy() GSYVideoManager.releaseAllVideos() } @Deprecated("Deprecated in Java") override fun onBackPressed() { if (GSYVideoManager.backFromWindowFull(this)) { return } super.onBackPressed() } }