package com.sinata.xqmuse.ui.home
|
|
import android.os.Bundle
|
import android.os.Handler
|
import android.os.Looper
|
import android.os.Message
|
import android.util.Log
|
import android.view.WindowManager
|
import android.widget.LinearLayout
|
import android.widget.ProgressBar
|
import cn.sinata.xldutils.gone
|
import cn.sinata.xldutils.visible
|
import com.sinata.xqmuse.R
|
import com.sinata.xqmuse.dialog.TipDialog
|
import com.sinata.xqmuse.network.HttpManager
|
import com.sinata.xqmuse.network.entity.TrainInfo
|
import com.sinata.xqmuse.network.entity.VideoBean
|
import com.sinata.xqmuse.network.request
|
import com.sinata.xqmuse.ui.TransparentStatusBarActivity
|
import com.sinata.xqmuse.ui.course.CourseFinishActivity
|
import com.sinata.xqmuse.utils.cache.PreloadManager
|
import com.sinata.xqmuse.utils.glide.GlideUtil
|
import kotlinx.android.synthetic.main.activity_video_detail.*
|
import org.jetbrains.anko.startActivity
|
import xyz.doikki.videocontroller.component.*
|
import xyz.doikki.videoplayer.player.*
|
|
class VideoDetailActivity : TransparentStatusBarActivity(), BaseVideoView.OnStateChangeListener {
|
override fun setContentView() = R.layout.activity_video_detail
|
|
private val course by lazy { intent.getParcelableExtra<TrainInfo>("course") }
|
|
private val videoList = arrayListOf<VideoBean>()
|
private var current = -1 //当前视频
|
private var seekTo = 0L //上次进度
|
|
private var seconds = 0 //实际学习秒数
|
private var handler:Handler? = null //计时器
|
|
private var studyFinish = false //true:学习完成
|
|
override fun initClick() {
|
iv_play.setOnClickListener {
|
iv_play.isSelected = !iv_play.isSelected
|
if (iv_play.isSelected){
|
mVideoView.pause()
|
handler?.removeMessages(0)
|
} else{
|
if (mVideoView.currentPlayState == VideoView.STATE_PLAYBACK_COMPLETED){
|
current--
|
play()
|
}else{
|
mVideoView.start()
|
handler?.sendEmptyMessageDelayed(0, 1000L)
|
}
|
}
|
}
|
|
iv_next.setOnClickListener {
|
if (current >= videoList.lastIndex)
|
// myToast("已经是最后一个视频")
|
else{
|
current++
|
iv_cover.visible()
|
play()
|
}
|
}
|
|
iv_last.setOnClickListener {
|
if (current == 0)
|
// myToast("已经是第一个视频")
|
else{
|
current--
|
play()
|
}
|
}
|
}
|
|
override fun initView() {
|
titleBar.gone()
|
titleBar1.setTitle("课程详情")
|
mVideoView.setOnStateChangeListener(this@VideoDetailActivity)
|
course?.apply {
|
videoList.addAll(videos)
|
if (videoList.isNotEmpty()){
|
videoList.forEachIndexed { index, videoBean ->
|
val progress = layoutInflater.inflate(
|
R.layout.item_progress,
|
ll_progress,
|
false
|
) as ProgressBar
|
if (videoList.size == 1)
|
progress.progressDrawable = getDrawable(R.drawable.progress_drawable)
|
else if (index == 0)
|
progress.progressDrawable = getDrawable(R.drawable.progress_drawable_left)
|
else if (index == videoList.lastIndex)
|
progress.progressDrawable = getDrawable(R.drawable.progress_drawable_right)
|
else
|
progress.progressDrawable = getDrawable(R.drawable.progress_drawable_mid)
|
val layoutParams = progress.layoutParams as LinearLayout.LayoutParams
|
layoutParams.weight = videoBean.time.toFloat()
|
progress.layoutParams = layoutParams
|
progress.max = videoBean.time
|
ll_progress.addView(progress)
|
}
|
|
current = videoList.map { it.id }.indexOf(beforeVideoId)
|
seekTo = beforeTime
|
play()
|
seconds = realTime
|
tv_train_time.text = "%02d:%02d".format(seconds / 60, seconds % 60)
|
handler = object :Handler(Looper.getMainLooper()){
|
override fun handleMessage(msg: Message) {
|
super.handleMessage(msg)
|
if (msg.what == 0){
|
seconds++
|
tv_train_time.text = "%02d:%02d".format(seconds / 60, seconds % 60)
|
handler?.sendEmptyMessageDelayed(0, 1000L)
|
val videoBean = if (current == videoList.size) videoList[current - 1] else videoList[current]
|
var currentSecond = if (mVideoView.currentPosition % 1000 == 0L) mVideoView.currentPosition / 1000 else mVideoView.currentPosition / 1000 + 1
|
if (currentSecond>videoBean.time)
|
currentSecond = videoBean.time.toLong()
|
tv_time.text = "${formTime(if (current == videoList.size) videoBean.time.toLong() else currentSecond)}/${formTime(videoBean.time.toLong())}"
|
videoList.take(current).forEachIndexed { index, v -> //看过的视频进度全选
|
(ll_progress.getChildAt(index) as ProgressBar).progress = v.time
|
}
|
if (ll_progress.getChildAt(current)!=null){
|
(ll_progress.getChildAt(current) as ProgressBar).progress = currentSecond.toInt() //当前视频的进度
|
Log.e(
|
"mmp",
|
"播放器进度:${mVideoView.currentPosition},转换后秒数:${currentSecond.toInt()}"
|
)
|
}
|
if (current < videoList.lastIndex)
|
videoList.subList(current + 1, videoList.size).forEachIndexed { index, v -> //未看过的视频进度置空
|
(ll_progress.getChildAt(videoList.indexOf(v)) as ProgressBar).progress = 0
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
|
private fun play(){
|
//开始预加载
|
videoList.forEachIndexed { index, videoBean ->
|
PreloadManager.getInstance(this).addPreloadTask(videoBean.courseVideo, index)
|
}
|
|
val video = videoList[current]
|
mVideoView.release()
|
val playUrl = PreloadManager.getInstance(this).getPlayUrl(video.courseVideo)
|
mVideoView.setUrl(playUrl)
|
mVideoView.start()
|
tv_name.text = "%d/%d %s".format(current + 1, videoList.size, video.videoName)
|
tv_time.text = "0''/${formTime(video.time.toLong())}"
|
}
|
|
/**
|
* 秒数转换成分秒格式
|
*/
|
private fun formTime(second: Long):String{
|
if (second>=60){
|
return "%d'%d''".format(second / 60, second % 60)
|
}else
|
return "%d''".format(second)
|
}
|
|
override fun onPlayerStateChanged(playerState: Int) {
|
|
}
|
|
override fun onPlayStateChanged(playState: Int) {
|
when(playState){
|
VideoView.STATE_PREPARED -> {
|
Log.e("Video playState", "视频准备就绪")
|
mVideoView.seekTo(seekTo * 1000)
|
seekTo = 0L //仅第一次进来恢复进度
|
if (handler?.hasMessages(0) == false)
|
handler?.sendEmptyMessageDelayed(0, 1000L)
|
}
|
|
VideoView.STATE_PLAYBACK_COMPLETED -> { //播放结束
|
current++
|
if (current != videoList.size) { //下一个
|
iv_cover.visible()
|
play()
|
} else {
|
//播放结束,学习完成
|
studyFinish = true
|
iv_play.isSelected = true
|
val video = videoList[current - 1]
|
showDialog()
|
HttpManager.completeInfo(video.courseId).request(this) { _, data ->
|
startActivity<CourseFinishActivity>(
|
"data" to data,
|
"time" to seconds,
|
"courseId" to video.courseId
|
)
|
onBackPressed()
|
}
|
}
|
}
|
VideoView.STATE_PLAYING -> {
|
Log.e("Video playState", "视频PLAYING")
|
iv_play.isSelected = false
|
iv_cover.gone()
|
if (current < videoList.lastIndex)
|
GlideUtil.loadFrame(this,videoList[current].courseVideo,iv_cover)
|
}
|
VideoView.STATE_PAUSED -> {
|
iv_play.isSelected = true
|
|
}
|
}
|
}
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
window.setFlags(
|
WindowManager.LayoutParams.FLAG_SECURE,
|
WindowManager.LayoutParams.FLAG_SECURE
|
)
|
super.onCreate(savedInstanceState)
|
}
|
|
override fun onPause() {
|
super.onPause()
|
mVideoView.pause()
|
handler?.removeMessages(0)
|
}
|
|
override fun onResume() {
|
super.onResume()
|
mVideoView.resume()
|
if (handler?.hasMessages(0) == false)
|
handler?.sendEmptyMessageDelayed(0, 1000L)
|
}
|
|
private fun saveProgress(){
|
if (current == videoList.size)
|
return
|
val video = course?.videos?.get(current)
|
HttpManager.exit(
|
video?.courseId ?: "",
|
video?.id ?: "",
|
mVideoView.currentPosition / 1000,
|
seconds
|
).request(this, success = { _, _ ->
|
finish()
|
}){ _, _->
|
|
}
|
}
|
|
override fun onDestroy() {
|
super.onDestroy()
|
if (mVideoView != null) {
|
PreloadManager.getInstance(this).removeAllPreloadTask()
|
mVideoView.release()
|
mVideoView.removeOnStateChangeListener(this)
|
}
|
}
|
|
override fun onBackPressed() {
|
if (studyFinish){
|
handler?.removeMessages(0)
|
handler = null
|
super.onBackPressed()
|
} else{
|
TipDialog.show(
|
supportFragmentManager,
|
"当前课程未完成全部训练,确认退出吗?",
|
object : TipDialog.OnClickCallback {
|
override fun onOk() {
|
handler?.removeMessages(0)
|
handler = null
|
saveProgress()
|
}
|
|
override fun onCancel() {
|
}
|
})
|
}
|
}
|
}
|