Newer
Older
Endoscope / app / src / main / java / com / casic / endoscope / view / AlbumActivity.kt
package com.casic.endoscope.view

import android.annotation.SuppressLint
import android.content.pm.ActivityInfo
import android.os.Bundle
import android.os.Environment
import android.view.View
import android.widget.ImageView
import androidx.activity.OnBackPressedCallback
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.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.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

class AlbumActivity : KotlinBaseActivity<ActivityAlbumBinding>() {

    private val kTag = "AlbumActivity"
    private val context = this@AlbumActivity

    //子文件夹集合
    private var dirBeans = ArrayList<File>()
    private lateinit var directoryAdapter: MediaDirAdapter

    @SuppressLint("NotifyDataSetChanged")
    override fun initEvent() {
        binding.ascButton.setOnClickListener {
            //按时间排序,降序
            dirBeans.sortByDescending { dir -> dir.name }
            directoryAdapter.notifyDataSetChanged()
        }

        binding.decButton.setOnClickListener {
            //升序
            dirBeans.sortBy { dir -> dir.name }
            directoryAdapter.notifyDataSetChanged()
        }

        //替换onBackPressed
        onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                GSYVideoManager.backFromWindowFull(context)
                //解决退出全屏后会被强制竖屏的问题
                requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                finish()
            }
        })
    }

    override fun initOnCreate(savedInstanceState: Bundle?) {
        val temp = ArrayList<String>()
        val videoDir = File(getExternalFilesDir(Environment.DIRECTORY_MOVIES), "")
        videoDir.list()?.forEach {
            temp.add(it)
        }

        val imageDir = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "")
        imageDir.list()?.forEach {
            temp.add(it)
        }

        //去重
        val directoryNameSet = HashSet<String>(temp)

        //全部转为File类型,方便是用自带的排序函数
        directoryNameSet.forEach {
            dirBeans.add(File(it))
        }

        //按时间排序,降序
        dirBeans.sortByDescending { dir -> dir.name }

        //绑定数据
        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 {
                    videoPlayer.startWindowFullscreen(context, false, true)
                }
                //防止错位设置
                videoPlayer.playTag = System.currentTimeMillis().toString()
                videoPlayer.playPosition = childPos
                //是否根据视频尺寸,自动选择竖屏全屏或者横屏全屏
                videoPlayer.isAutoFullWithSize = true
                //音频焦点冲突时是否释放
                videoPlayer.isReleaseWhenLossAudio = false
                //全屏动画
                videoPlayer.isShowFullAnimation = true
            }
        }
        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()
    }
}