package com.edufound.video.presenter; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_ERROR_IO; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_ERROR_MALFORMED; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_ERROR_SERVER_DIED; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_ERROR_TIMED_OUT; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_ERROR_UNKNOWN; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_ERROR_UNSUPPORTED; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_INFO_BUFFERING_END; import static tv.danmaku.ijk.media.player.IMediaPlayer.MEDIA_INFO_BUFFERING_START; import android.net.Uri; import android.os.Message; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.TextView; import androidx.annotation.NonNull; import com.edufound.base.BasePresenter; import com.edufound.base.util.EfunboxUtil; import com.edufound.base.util.GlideUtils; import com.edufound.base.util.Logger; import com.edufound.video.R; import com.edufound.video.bean.VideoData; import com.edufound.video.listener.MobileVideoOnGestureListener; import com.edufound.video.model.VideoModel; import com.edufound.video.util.VideoConsts; import com.edufound.video.view.VideoActivityView; import com.hjq.toast.Toaster; import tv.danmaku.ijk.media.player.IMediaPlayer; public class VideoPresenter extends BasePresenter { VideoData mVideoData; FrameLayout videoController; ImageView mControllerTopBack; FrameLayout mControllerCenter; LinearLayout mControllerTop; LinearLayout mControllerBottom; ImageView mPosterImage; TextView mTextTitle; TextView mTextTime; SeekBar mSeekBar; ImageView mStatusBtnImg; ImageView mVideoLoading; boolean controllerShow = true; GestureDetector mGestureDetector; MobileVideoOnGestureListener mMobileGesListener; @Override protected void onViewDestroy() { getView().getRootView().removeAllViews(); removeHandler(); videoHandler = null; videoController = null; } public void getVideoData() { mVideoData = getView().getBundle().getParcelable("video_data"); mVideoData.toString(); // mVideoData = new VideoData(); // mVideoData.setVideoName("22222222222222222"); // mVideoData.setVideoImg("https://yfklxt-image.ai160.com/reader/20210630/1625033515503602.jpg"); // mVideoData.setVideoUrl("https://stream7.iqilu.com/10339/upload_transcode/202002/18/20200218114723HDu3hhxqIT.mp4"); setVideoController(); } private void setVideoController() { LayoutInflater layoutInflater = LayoutInflater.from(getView().getBaseActivity()); videoController = (FrameLayout) layoutInflater.inflate(R.layout.video_controller, null); mControllerTop = videoController.findViewById(R.id.video_controller_top); mControllerTopBack = videoController.findViewById(R.id.video_controller_top_back); mControllerCenter = videoController.findViewById(R.id.video_controller_center); mControllerBottom = videoController.findViewById(R.id.video_controller_bottom); mPosterImage = videoController.findViewById(R.id.video_controller_poster); mTextTitle = videoController.findViewById(R.id.video_controller_title); mTextTime = videoController.findViewById(R.id.video_controller_time); mSeekBar = videoController.findViewById(R.id.video_controller_seekbar); mStatusBtnImg = videoController.findViewById(R.id.video_controller_status_image_btn); mVideoLoading = videoController.findViewById(R.id.video_controller_loading); getView().getRootView().addView(videoController); GlideUtils.loadImageSizeKipMemoryCache(getView().getBaseActivity(), mVideoData.getVideoImg(), mPosterImage); mTextTitle.setText(mVideoData.getVideoName()); getView().getVideoView().setVideoURI(Uri.parse(mVideoData.getVideoUrl())); getView().getVideoView().start(); initListener(); } private void initListener() { mControllerTopBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getView().getBaseActivity().finish(); } }); mStatusBtnImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { playAndPause(); } }); mMobileGesListener = new MobileVideoOnGestureListener(getView(), new MobileVideoOnGestureListener.ListenerCallBack() { @Override public boolean onDoubleTap(MotionEvent e) { playAndPause(); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { if (controllerShow) { hideController(); } else { showController(); } return true; } @Override public void changeVolume(int volume) { Toaster.showShort("音量:" + volume); } @Override public void changeBrightness(float brightness) { Toaster.showShort("亮度:" + brightness); } }); mGestureDetector = new GestureDetector(getView().getBaseActivity(), mMobileGesListener); mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { mTextTime.setText(EfunboxUtil.getTime(mSeekBar.getProgress()) + "/" + EfunboxUtil.getTime(mSeekBar.getMax())); } @Override public void onStartTrackingTouch(SeekBar seekBar) { videoHandler.removeMessages(VideoConsts.VIDEO_SET_SEEKBAR_INFO); videoHandler.removeMessages(VideoConsts.VIDEO_CONTROLLER_HIDE); } @Override public void onStopTrackingTouch(SeekBar seekBar) { seekBarChangeOver(); showController(); } }); } //处理TV端按键 public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_ESCAPE: return true; } return false; } public boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_ESCAPE: removeHandler(); getView().getBaseActivity().finish(); return true; } return false; } public void onCompletion(IMediaPlayer iMediaPlayer) { playerCompletion(); } public boolean onError(IMediaPlayer iMediaPlayer, int what, int extra) { switch (what) { case MEDIA_ERROR_UNKNOWN: Logger.e("MEDIA_ERROR_UNKNOWN"); break; case MEDIA_ERROR_SERVER_DIED: Logger.e("MEDIA_ERROR_SERVER_DIED"); break; case MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK: Logger.e("MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK"); break; case MEDIA_ERROR_IO: Logger.e("MEDIA_ERROR_IO"); break; case MEDIA_ERROR_MALFORMED: Logger.e("MEDIA_ERROR_MALFORMED"); break; case MEDIA_ERROR_UNSUPPORTED: Logger.e("MEDIA_ERROR_UNSUPPORTED"); break; case MEDIA_ERROR_TIMED_OUT: Logger.e("MEDIA_ERROR_TIMED_OUT"); break; } return true; } public boolean onInfo(IMediaPlayer iMediaPlayer, int what, int extra) { switch (what) { case MEDIA_INFO_BUFFERING_START: mVideoLoading.setVisibility(View.VISIBLE); break; case MEDIA_INFO_BUFFERING_END: mVideoLoading.postDelayed(new Runnable() { @Override public void run() { mVideoLoading.setVisibility(View.GONE); } }, 500); break; } return false; } public void onSeekComplete(IMediaPlayer iMediaPlayer) { showController(); videoHandler.sendEmptyMessage(VideoConsts.VIDEO_SET_SEEKBAR_INFO); getView().getVideoView().start(); } public void onPrepared(IMediaPlayer iMediaPlayer) { mSeekBar.setMax((int) iMediaPlayer.getDuration()); mTextTime.setText(EfunboxUtil.getTime(mSeekBar.getProgress()) + "/" + EfunboxUtil.getTime(mSeekBar.getMax())); mPosterImage.postDelayed(new Runnable() { @Override public void run() { mPosterImage.setVisibility(View.GONE); } }, 500); videoHandler.sendEmptyMessage(VideoConsts.VIDEO_SET_SEEKBAR_INFO); showController(); } android.os.Handler videoHandler = new android.os.Handler(new android.os.Handler.Callback() { @Override public boolean handleMessage(@NonNull Message message) { switch (message.what) { case VideoConsts.VIDEO_SET_SEEKBAR_INFO: mSeekBar.setMax(getView().getVideoView().getDuration()); mSeekBar.setProgress(getView().getVideoView().getCurrentPosition()); mTextTime.setText(EfunboxUtil.getTime(getView().getVideoView().getCurrentPosition()) + "/" + EfunboxUtil.getTime(mSeekBar.getMax())); videoHandler.sendEmptyMessageDelayed(VideoConsts.VIDEO_SET_SEEKBAR_INFO, 1000); break; case VideoConsts.VIDEO_CONTROLLER_SHOW: showController(); break; case VideoConsts.VIDEO_CONTROLLER_HIDE: hideController(); break; } return false; } }); private void removeHandler() { videoHandler.removeMessages(VideoConsts.VIDEO_SET_SEEKBAR_INFO); videoHandler.removeMessages(VideoConsts.VIDEO_CONTROLLER_SHOW); videoHandler.removeMessages(VideoConsts.VIDEO_CONTROLLER_HIDE); } private void hideController() { controllerShow = false; mControllerTop.setVisibility(View.GONE); mControllerBottom.setVisibility(View.GONE); } private void showController() { controllerShow = true; mControllerTop.setVisibility(View.VISIBLE); mControllerBottom.setVisibility(View.VISIBLE); videoHandler.removeMessages(VideoConsts.VIDEO_CONTROLLER_HIDE); videoHandler.sendEmptyMessageDelayed(VideoConsts.VIDEO_CONTROLLER_HIDE, 5000); } private void playAndPause() { if (getView().getVideoView().isPlaying()) { getView().getVideoView().pause(); mVideoLoading.setVisibility(View.GONE); mStatusBtnImg.setBackgroundResource(R.drawable.player_little_icon_play); } else { getView().getVideoView().start(); mStatusBtnImg.setBackgroundResource(R.drawable.player_little_icon_pause); } showController(); } void seekBarChangeOver() { getView().getVideoView().pause(); if (mSeekBar.getProgress() > mSeekBar.getMax() - 2000) { playerCompletion(); return; } if (mSeekBar.getProgress() <= 0) { getView().getVideoView().seekTo(0); } else { getView().getVideoView().seekTo(mSeekBar.getProgress()); } } private void playerCompletion() { //播放完成之后处理方法 removeHandler(); getView().getBaseActivity().finish(); } public boolean onTouchEvent(MotionEvent event) { mGestureDetector.onTouchEvent(event); return true; } }