package com.team.zhuoke.view.common.activity;
import android.content.Context;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings;
import android.util.Pair;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bigkoo.svprogresshud.SVProgressHUD;
import com.team.zhuoke.R;
import com.team.zhuoke.base.BaseActivity;
import com.team.zhuoke.base.BaseView;
import com.team.zhuoke.danmu.utils.DanmuProcess;
import com.team.zhuoke.model.logic.common.CommonPcLiveVideoModelLogic;
import com.team.zhuoke.model.logic.common.bean.OldLiveVideoInfo;
import com.team.zhuoke.model.logic.home.bean.HomeRecommendHotCate;
import com.team.zhuoke.presenter.common.impl.CommonPcLiveVideoPresenterImp;
import com.team.zhuoke.presenter.common.interfaces.CommonPcLiveVideoContract;
import com.team.zhuoke.ui.loadplay.LoadingView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;
import io.vov.vitamio.utils.ScreenResolution;
import io.vov.vitamio.widget.VideoView;
import master.flame.danmaku.ui.widget.DanmakuView;
import static com.team.zhuoke.R.id.iv_control_img;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述: PC直播播放页
* 备注消息:
* 修改时间:2017/2/10 上午11:16
**/
public class PcLiveVideoActivity extends BaseActivity<CommonPcLiveVideoModelLogic, CommonPcLiveVideoPresenterImp> implements CommonPcLiveVideoContract.View, MediaPlayer.OnInfoListener, MediaPlayer.OnBufferingUpdateListener,
MediaPlayer.OnErrorListener {
@BindView(R.id.vm_videoview)
VideoView vmVideoview;
@BindView(R.id.fl_loading)
FrameLayout flLoading;
@BindView(R.id.danmakuView)
DanmakuView danmakuView;
@BindView(R.id.iv_back)
ImageView ivBack;
@BindView(R.id.tv_live_nickname)
TextView tvLiveNickname;
@BindView(R.id.iv_live_setting)
ImageView ivLiveSetting;
@BindView(R.id.iv_live_gift)
ImageView ivLiveGift;
@BindView(R.id.iv_live_share)
ImageView ivLiveShare;
@BindView(R.id.iv_live_follow)
ImageView ivLiveFollow;
@BindView(R.id.control_top)
RelativeLayout controlTop;
@BindView(R.id.iv_live_play)
ImageView ivLivePlay;
@BindView(R.id.iv_live_refresh)
ImageView ivLiveRefresh;
@BindView(R.id.control_bottom)
RelativeLayout controlBottom;
@BindView(R.id.im_logo)
ImageView imLogo;
@BindView(R.id.lv_playloading)
LoadingView lvPlayloading;
@BindView(iv_control_img)
ImageView ivControlImg;
@BindView(R.id.tv_control_name)
TextView tvControlName;
@BindView(R.id.tv_control)
TextView tvControl;
@BindView(R.id.control_center)
RelativeLayout controlCenter;
@BindView(R.id.im_danmu_control)
ImageView imDanmuControl;
@BindView(R.id.tv_loading_buffer)
TextView tvLoadingBuffer;
private HomeRecommendHotCate.RoomListEntity mRoomEntity;
private OldLiveVideoInfo videoInfo;
private String Room_id;
private int mScreenWidth = 0;//屏幕宽度
private boolean mIsFullScreen = true;//是否为全屏
private int mShowVolume;//声音
private int mShowLightness;//亮度
private int mMaxVolume;//最大声音
private AudioManager mAudioManager;
private GestureDetector mGestureDetector;
private GestureDetector.SimpleOnGestureListener mSimpleOnGestureListener;
private SVProgressHUD svProgressHUD;
/**
* 声音
*/
public final static int ADD_FLAG = 1;
/**
* 亮度
*/
public final static int SUB_FLAG = -1;
public static final int HIDE_CONTROL_BAR = 0x02;//隐藏控制条
public static final int HIDE_TIME = 5000;//隐藏控制条时间
public static final int SHOW_CENTER_CONTROL = 0x03;//显示中间控制
public static final int SHOW_CONTROL_TIME = 1000;
/**
* 弹幕
*/
private DanmuProcess mDanmuProcess;
// 弹幕控制开关 默认打开状态
private boolean mDanmuControlFalg = true;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
/**
* 隐藏top ,bottom
*/
case HIDE_CONTROL_BAR:
hideControlBar();
break;
/**
* 隐藏center控件
*/
case SHOW_CENTER_CONTROL:
if (controlCenter != null) {
controlCenter.setVisibility(View.GONE);
}
break;
}
}
};
@Override
protected int getLayoutId() {
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
Vitamio.isInitialized(this);
return R.layout.activity_pclive_video;
}
/**
* 初始化声音和亮度
*/
private void initVolumeWithLight() {
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mShowVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) * 100 / mMaxVolume;
mShowLightness = getScreenBrightness();
}
/**
* 获得当前屏幕亮度值 0--255
*/
private int getScreenBrightness() {
int screenBrightness = 255;
try {
screenBrightness = Settings.System.getInt(getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS);
} catch (Exception e) {
e.printStackTrace();
}
return screenBrightness;
}
@Override
protected void onInitView(Bundle bundle) {
Room_id = getIntent().getExtras().getString("Room_id");
vmVideoview.setKeepScreenOn(true);
mPresenter.getPresenterPcLiveVideoInfo(Room_id);
svProgressHUD = new SVProgressHUD(this);
//获取屏幕宽度
Pair<Integer, Integer> screenPair = ScreenResolution.getResolution(this);
mScreenWidth = screenPair.first;
initDanMu(Room_id);
initVolumeWithLight();
addTouchListener();
vmVideoview.setVideoLayout(VideoView.VIDEO_LAYOUT_STRETCH, 0);
}
private void initDanMu(String room_id) {
mDanmuProcess = new DanmuProcess(this, danmakuView, Integer.valueOf(room_id));
mDanmuProcess.start();
}
@Override
protected void onEvent() {
vmVideoview.setOnInfoListener(this);
vmVideoview.setOnBufferingUpdateListener(this);
vmVideoview.setOnErrorListener(this);
}
@Override
protected BaseView getView() {
return this;
}
@Override
public void getViewPcLiveVideoInfo(OldLiveVideoInfo mLiveVideoInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
videoInfo = mLiveVideoInfo;
getViewInfo(mLiveVideoInfo);
}
});
}
/**
* 添加手势操作
*/
private void addTouchListener() {
mSimpleOnGestureListener = new GestureDetector.SimpleOnGestureListener() {
//滑动操作
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
if (!mIsFullScreen)//非全屏不进行手势操作
return false;
float x1 = e1.getX();
float absDistanceX = Math.abs(distanceX);// distanceX < 0 从左到右
float absDistanceY = Math.abs(distanceY);// distanceY < 0 从上到下
// Y方向的距离比X方向的大,即 上下 滑动
if (absDistanceX < absDistanceY) {
if (distanceY > 0) {//向上滑动
if (x1 >= mScreenWidth * 0.65) {//右边调节声音
changeVolume(ADD_FLAG);
} else {//调节亮度
changeLightness(ADD_FLAG);
}
} else {//向下滑动
if (x1 >= mScreenWidth * 0.65) {
changeVolume(SUB_FLAG);
} else {
changeLightness(SUB_FLAG);
}
}
} else {
// X方向的距离比Y方向的大,即 左右 滑动
}
return false;
}
//双击事件,有的视频播放器支持双击播放暂停,可从这实现
@Override
public boolean onDoubleTap(MotionEvent e) {
return super.onDoubleTap(e);
}
//单击事件
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if (controlBottom.getVisibility() == View.VISIBLE) {
mHandler.removeMessages(HIDE_CONTROL_BAR);
hideControlBar();
} else {
showControlBar();
mHandler.sendEmptyMessageDelayed(HIDE_CONTROL_BAR, HIDE_TIME);
}
return true;
}
};
mGestureDetector = new GestureDetector(this, mSimpleOnGestureListener);
}
/**
* 触摸事件进行监听
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mGestureDetector != null)
mGestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
/**
* 改变声音
*/
private void changeVolume(int flag) {
mShowVolume += flag;
if (mShowVolume > 100) {
mShowVolume = 100;
} else if (mShowVolume < 0) {
mShowVolume = 0;
}
tvControlName.setText("音量");
ivControlImg.setImageResource(R.drawable.img_volume);
tvControl.setText(mShowVolume + "%");
int tagVolume = mShowVolume * mMaxVolume / 100;
//tagVolume:音量绝对值
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, tagVolume, 0);
mHandler.removeMessages(SHOW_CENTER_CONTROL);
controlCenter.setVisibility(View.VISIBLE);
mHandler.sendEmptyMessageDelayed(SHOW_CENTER_CONTROL, SHOW_CONTROL_TIME);
}
/**
* 改变亮度
*/
private void changeLightness(int flag) {
mShowLightness += flag;
if (mShowLightness > 255) {
mShowLightness = 255;
} else if (mShowLightness <= 0) {
mShowLightness = 0;
}
tvControlName.setText("亮度");
ivControlImg.setImageResource(R.drawable.img_light);
tvControl.setText(mShowLightness * 100 / 255 + "%");
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = mShowLightness / 255f;
getWindow().setAttributes(lp);
mHandler.removeMessages(SHOW_CENTER_CONTROL);
controlCenter.setVisibility(View.VISIBLE);
mHandler.sendEmptyMessageDelayed(SHOW_CENTER_CONTROL, SHOW_CONTROL_TIME);
}
/**
* 获得房间信息
*
* @param mLiveVideoInfo
*/
private void getViewInfo(OldLiveVideoInfo mLiveVideoInfo) {
String url = mLiveVideoInfo.getData().getLive_url();
// String url="http://c.brightcove.com/services/mobile/streaming/index/rendition.m3u8?assetId=5330721253001&pubId=4938530621001&videoId=5330694577001";
Uri uri = Uri.parse(url);
if(tvLiveNickname!=null) {
tvLiveNickname.setText(mLiveVideoInfo.getData().getRoom_name());
}
if(vmVideoview!=null) {
vmVideoview.setVideoURI(uri);
vmVideoview.setBufferSize(1024 * 1024 * 2);
vmVideoview.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);
vmVideoview.requestFocus();
// vmVideoview.setSubShown(true);
vmVideoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
// optional need Vitamio 4.0
mediaPlayer.setPlaybackSpeed(1.0f);
flLoading.setVisibility(View.GONE);
ivLivePlay.setImageResource(R.drawable.img_live_videopause);
mHandler.sendEmptyMessageDelayed(HIDE_CONTROL_BAR, HIDE_TIME);
}
});
}
}
/**
* 隐藏控制条
*/
private void hideControlBar() {
if (controlBottom != null && controlTop != null) {
controlBottom.setVisibility(View.GONE);
controlTop.setVisibility(View.GONE);
}
}
/**
* 显示控制条
*/
private void showControlBar() {
if (controlBottom != null && controlTop != null) {
controlBottom.setVisibility(View.VISIBLE);
controlTop.setVisibility(View.VISIBLE);
}
}
@Override
public void showErrorWithStatus(String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
svProgressHUD.showErrorWithStatus("主播还在赶来的路上~~");
}
});
}
/**
* 正在缓冲
*
* @param mp the MediaPlayer the update pertains to
* @param percent the percentage (0-100) of the buffer that has been filled thus
*/
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
flLoading.setVisibility(View.VISIBLE);
if (vmVideoview.isPlaying())
vmVideoview.pause();
tvLoadingBuffer.setText("直播已缓冲"+percent+"%...");
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onRestart() {
super.onRestart();
mPresenter.getPresenterPcLiveVideoInfo(Room_id);
if (vmVideoview != null) {
vmVideoview.start();
}
if (danmakuView != null && mDanmuProcess != null) {
danmakuView.restart();
mDanmuProcess.start();
}
}
@Override
protected void onPause() {
super.onPause();
if (vmVideoview != null) {
vmVideoview.pause();
}
if (danmakuView != null) {
danmakuView.pause();
}
}
@Override
protected void onDestroy() {
if (vmVideoview != null) {
// 释放资源
vmVideoview.stopPlayback();
}
danmakuView.release();
mDanmuProcess.finish();
danmakuView.clear();
super.onDestroy();
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
if (vmVideoview.isPlaying()) {
vmVideoview.pause();
}
ivLivePlay.setImageResource(R.drawable.img_live_videoplay);
mHandler.removeMessages(HIDE_CONTROL_BAR);
showControlBar();
break;
// 完成缓冲
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
flLoading.setVisibility(View.GONE);
if (!vmVideoview.isPlaying())
vmVideoview.start();
ivLivePlay.setImageResource(R.drawable.img_live_videopause);
mHandler.sendEmptyMessageDelayed(HIDE_CONTROL_BAR, HIDE_TIME);
break;
case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
break;
}
return true;
}
/**
* 播放视频错误
*
* @param mp the MediaPlayer the error pertains to
* @param what the type of error that has occurred:
* @param extra an extra code, specific to the error. Typically implementation
* dependant.
* @return
*/
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) {
svProgressHUD.showErrorWithStatus("主播还在赶来的路上~~");
}
return true;
}
/**
* 返回
*/
@OnClick(R.id.iv_back)
public void ivBack() {
this.finish();
}
/**
* 暂停/播放
*/
@OnClick(R.id.iv_live_play)
public void ivLivePlay() {
if (vmVideoview.isPlaying()) {
vmVideoview.pause();
ivLivePlay.setImageResource(R.drawable.img_live_videoplay);
mHandler.removeMessages(HIDE_CONTROL_BAR);
showControlBar();
} else {
vmVideoview.start();
ivLivePlay.setImageResource(R.drawable.img_live_videopause);
mHandler.sendEmptyMessageDelayed(HIDE_CONTROL_BAR, HIDE_TIME);
}
}
/**
* 控制弹幕 开关
*/
@OnClick(R.id.im_danmu_control)
public void danMuControl() {
if (mDanmuControlFalg) {
/**
* 隐藏弹幕
*
*/
danmakuView.hide();
imDanmuControl.setImageResource(R.drawable.pad_play_closedanmu);
mDanmuControlFalg = false;
} else {
// 开启弹幕
danmakuView.show();
imDanmuControl.setImageResource(R.drawable.pad_play_opendanmu);
mDanmuControlFalg = true;
}
}
/**
* 刷新
*/
@OnClick(R.id.iv_live_refresh)
public void ivLiveRefresh() {
mPresenter.getPresenterPcLiveVideoInfo(Room_id);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: add setContentView(...) invocation
ButterKnife.bind(this);
}
}