package com.jld.vod.view import android.app.Activity import android.app.Service import android.content.* import android.graphics.drawable.Drawable import android.os.Handler import android.os.IBinder import android.os.Looper import android.os.Message import android.view.MotionEvent import android.view.View import android.widget.ImageView import android.widget.RelativeLayout import android.widget.SeekBar import android.widget.TextView import com.bumptech.glide.Glide import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition import com.google.gson.Gson import com.jld.vod.R import com.jld.vod.audio.MusicController import com.jld.vod.audio.MusicControllerImp import com.jld.vod.base.BaseActivity import com.jld.vod.config.AudioFlag import com.jld.vod.config.AudioPlayerConstant import com.jld.vod.config.AudioPlayerConstant.ACITION_AUDIO_PLAYER_PAUSE import com.jld.vod.config.AudioPlayerConstant.ACITION_AUDIO_PLAYER_PLAY import com.jld.vod.config.AudioPlayerConstant.ACITION_AUDIO_PLAYER_PLAY_COMPLETE import com.jld.vod.config.AudioPlayerConstant.ACITION_AUDIO_PLAYER_PREPARE import com.jld.vod.config.AudioPlayerConstant.ACITION_AUDIO_PLAYER_STOP import com.jld.vod.config.AudioPlayerConstant.playerState import com.jld.vod.config.Config import com.jld.vod.model.bean.Audio import com.jld.vod.model.bean.MusicByMidBean import com.jld.vod.model.bean.MusicByMidBeans import com.jld.vod.service.MusicPlayerService import com.jld.vod.ui.animator.RatateImage import com.jld.vod.ui.animator.RatateRobotArm import com.jld.vod.utils.* import com.jld.vod.utils.http.OkHttpUtils import com.jld.vod.viewmodel.MusicPlayViewModel import com.smp.soundtouchandroid.AudioSpeed import com.smp.soundtouchandroid.MediaCallBack import com.smp.soundtouchandroid.OnProgressChangedListener import kotlinx.android.synthetic.main.activity_main.fl_bg import kotlinx.android.synthetic.main.activity_main.iv_back_page import kotlinx.android.synthetic.main.activity_main.iv_brightness import kotlinx.android.synthetic.main.activity_main.iv_fl_power import kotlinx.android.synthetic.main.activity_main.iv_home import kotlinx.android.synthetic.main.activity_main.iv_power import kotlinx.android.synthetic.main.activity_main.iv_volume import kotlinx.android.synthetic.main.activity_main.tv_main_time import kotlinx.android.synthetic.main.activity_main.tv_main_week import kotlinx.android.synthetic.main.activity_musice_play.* import okhttp3.Call import okhttp3.Response import java.io.IOException import java.util.* /** * @author ZhaoFuXin * @Email:18276061387@163.com * @description: * @date :2020/7/7 11:37 */ class MusicPlayActivity : BaseActivity(),View.OnClickListener { private val TAG:String = "MusicPlayActivity" //音频播放类 private var audio: Audio? = null //上一首 private var audio_preImg: ImageView? = null //播放 private var audio_playImg: ImageView? = null //下一首 private var audio_nextImg: ImageView? = null private var speed = AudioSpeed.SPEED_NORMAL private var context: Activity? = null //显示UI private val MSG_SHOW_UI = 1 //准备播放 private val MSG_AUDIO_PREPARE = MSG_SHOW_UI + 1 //自动播放 private val MSG_AUTO_PLAY = MSG_AUDIO_PREPARE + 1 private var albumView: RelativeLayout? = null private var ratateImage: RatateImage? = null private var ratateRobotArm: RatateRobotArm? = null//机械臂 //播放总时间 private var audio_totalTimeTv: TextView? = null //进度条 private var skbProgress: SeekBar? = null //当前播放的进度 private var audio_curren_playTv: TextView? = null private var connect = false private var musicController: MusicController? = null private var musicId:Int = 0; private var discMagneticStripe:ImageView? = null private var receiver: broadCastRecever = broadCastRecever()//更新时间广播 private lateinit var musicPlayViewModel: MusicPlayViewModel private val handler: Handler = object : Handler() { override fun handleMessage(msg: Message) { super.handleMessage(msg) when (msg.what) { MSG_SHOW_UI -> update() MSG_AUTO_PLAY -> autoPlay(needPlay) } } } /** * 播放回调 */ var mediaCallBack: MediaCallBack = object : MediaCallBack { override fun onError() {} override fun onChange(state: Int) { if (state == AudioPlayerConstant.ACITION_AUDIO_PLAYER_PLAY_PRE_AUDIO || state == AudioPlayerConstant.ACITION_AUDIO_PLAYER_PLAY_NEXT_AUDIO) { playerState = 0 if (musicController != null) { setAudio(musicController!!.audio) setCurrentProgress(0) tv_music_name.setText(audio!!.name) tv_music_singer.setText(audio!!.author) // addAudioTitle() } } else { playerState = state } LogUtils.logD(TAG, "onChange=$state") changePlayUI() } override fun onPrepare() { LogUtils.logD(TAG, "onPrepare()") runOnUiThread { showLoading() } } override fun onPrepared(duration: Long) { LogUtils.logD(TAG, "onPrepared()") setInitDate(duration) } override fun onPlay() { LogUtils.logD(TAG, "onPlay()") runOnUiThread { finishLoading() } } override fun onStop() { LogUtils.logD(TAG, "onStop()") } override fun onPause() { LogUtils.logD(TAG, "onPause()") } override fun onComplete() { LogUtils.logD(TAG, "onComplete()") } } override fun getLayoutId(): Int { return R.layout.activity_musice_play } private fun setAudio(audio: Audio) { this.audio = audio } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) LogUtils.logD(TAG, "onNewIntent") if (intent != null) { var audio: Audio? = intent.getSerializableExtra("audio") as Audio val play = intent.getBooleanExtra("play", false) val isHead = intent.getBooleanExtra("isHead", false) if (isHead && audio == null) { if (musicController != null) { audio = musicController!!.audio } } if (audio != null) { if (!isSame(audio)) { setAudio(audio) changeToCurrent(play) } else { judgeState() changePlayUI() if (playerState == ACITION_AUDIO_PLAYER_PAUSE) { if (musicController != null && musicController!!.isPause) { setCurrentProgress(musicController!!.playedDuration) } } } } } } /** * 是否相同 */ private fun isSame(audio: Audio?): Boolean { return if (audio == null) false else this.audio != null && audio.id === this.audio!!.id } /** * 变换到现在 */ private fun changeToCurrent( needPlay:Boolean) { if (needPlay) { play(audio); } else if (musicController != null) { judgeState(); autoPlay(false); changePlayUI(); } } /** * 进度 */ private fun setCurrentProgress(position: Long) { if (skbProgress != null) { skbProgress!!.progress = position.toInt() } if (audio_curren_playTv != null) { audio_curren_playTv!!.setText(getTimeStr(position.toInt())) } } /** * 初始化view */ override fun initView() { super.initView() //上一首 audio_preImg = findViewById(R.id.act_audio_player_button_prebuttonId) audio_preImg!!.setOnClickListener(this) //播放 audio_playImg = findViewById(R.id.act_audio_player_button_playId) audio_playImg!!.setOnClickListener(this) //下一首 audio_nextImg = findViewById(R.id.act_audio_player_button_nextId) audio_nextImg!!.setOnClickListener(this) //旋转图片 albumView = findViewById(R.id.play_album_is) //机械臂 discMagneticStripe = findViewById(R.id.iv_disc_magnetic_stripe) //总时间 audio_totalTimeTv = findViewById(R.id.act_audio_player_total_timeId) //播放进度时间 audio_curren_playTv = findViewById(R.id.act_audio_player_current_play_timeId) //进度条 skbProgress = findViewById(R.id.act_audio_player_audio_progressId) //滑动监听 skbProgress!!.setOnSeekBarChangeListener(SeekBarChangeEvent()) iv_back_page.setOnClickListener { this.onBackPressed() } iv_home.setOnClickListener { go() finish() } //音量调节 iv_volume.setOnClickListener { PopupUtils.popupUtilsVolume(this,iv_volume) } //待机 iv_power.setOnClickListener { fl_bg.visibility = View.VISIBLE Config.isShowAd = false } iv_fl_power.setOnClickListener { fl_bg.visibility = View.INVISIBLE Config.isShowAd = true } //背光设置 iv_brightness.setOnClickListener { PopupUtils.popupUtilsbrightness(this,iv_brightness) } //解决穿透问题 fl_bg.setOnTouchListener(object :View.OnTouchListener { override fun onTouch(v: View?, event: MotionEvent?): Boolean { return true } }); //标题聚焦 tv_music_name.setSelected(true) } /** * 初始化数据 */ override fun initData() { super.initData() val intent = intent context = this val bundle = intent.extras musicId = bundle!!.get("id") as Int val cid = bundle.get("cid") val mid = bundle.get("mid") val lid = bundle.get("lid") //初始化viewmodel // musicPlayViewModel = ViewModelProviders.of(this) // .get(MusicPlayViewModel::class.java) // musicPlayViewModel.findMusicMid() //获取一级列表数据 // val observer = Observer> { it-> // setTest(it) // } // musicPlayViewModel.findMovieMidliveData.observe(this, observer) if (Config.isMusicAll)//是否全部列表 { OkHttpUtils.getInstance().getDataAsyn(Config.ApiBaseUrl+ "/music/findMusicByMid?mid=$mid&lid=$lid",object :OkHttpUtils.MyNetCall{ override fun failed(call: Call?, e: IOException?) { LogUtils.logE("e="+e) } override fun success(call: Call?, response: Response?) { try { val json = response!!.body!!.string() val gson = Gson() val music = gson.fromJson(json, MusicByMidBeans::class.java) setTest(music.data) }catch (e : Exception) { e.printStackTrace() } //LogUtils.logD("response"+music.code) } }) }else{ OkHttpUtils.getInstance().getDataAsyn(Config.ApiBaseUrl+ "/music/findMusicByCid?cid=$cid&mid=$mid&lid=$lid",object :OkHttpUtils.MyNetCall{ override fun failed(call: Call?, e: IOException?) { LogUtils.logE("e="+e) } override fun success(call: Call?, response: Response?) { try { val json = response!!.body!!.string() val gson = Gson() val music = gson.fromJson(json, MusicByMidBeans::class.java) setTest(music.data) }catch (e : Exception) { e.printStackTrace() } //LogUtils.logD("response"+music.code) } }) } } /** * 初始化事件 */ override fun initEvent() { super.initEvent() handler.sendEmptyMessage(MSG_SHOW_UI) ratateImage = RatateImage(this, albumView) ratateRobotArm = RatateRobotArm(this, discMagneticStripe!!) //动态背景图片 val main_bg_img = SharedPrefUtils.getString(this,"main_bg_img") try { if (!main_bg_img.isEmpty()) { val simpleTarget: SimpleTarget = object : SimpleTarget() { override fun onResourceReady(resource: Drawable, transition: Transition?) { rl_music.setBackground(resource) } } Glide.with(this).load(com.jld.vod.config.Config.ApiBaseUrl+"/synchronization/previewImg?imgUrl=" +main_bg_img).into(simpleTarget) } }catch (e: Exception) { e.printStackTrace() } } /** * 更新页面数据 */ private fun update() { //addAudioTitle() changePlayUI() } /** * 自动播放 */ private fun autoPlay(needPlay: Boolean) { LogUtils.logD( "autoPlay:playerState=$playerState") when (playerState) { AudioPlayerConstant.ACITION_AUDIO_PLAYER_PLAY -> if (musicController != null && musicController!!.isPlaying) { setInitDate(musicController!!.duration) } AudioPlayerConstant.ACITION_AUDIO_PLAYER_PAUSE -> if (musicController != null && musicController!!.isPause) { setInitDate(musicController!!.duration) setCurrentProgress(musicController!!.playedDuration) } else -> if (needPlay) { LogUtils.logD("autoPlaysssssssss") play() } } } /** * 初始时间 */ private fun setInitDate(duration: Long) { LogUtils.logD( "duration=$duration") if (musicController == null) return if (skbProgress != null) { skbProgress!!.setMax(duration.toInt()) } if (audio_totalTimeTv != null) { audio_totalTimeTv!!.setText(getTimeStr(duration.toInt())) } } /** * 获取总时长 */ private fun getTimeStr(time: Int): String? { var time = time time = time / 1000000 val min = time / 60 //分 val second = time % 60 var min1 = "" min1 = if (min < 10) { "0$min" } else { min.toString() + "" } var second1 = "" second1 = if (second < 10) { "0$second" } else { second.toString() + "" } return "$min1:$second1" } //音频列表 private val audioList: MutableList