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.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bigkoo.svprogresshud.SVProgressHUD;
import com.facebook.drawee.view.SimpleDraweeView;
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.CommonPhoneLiveVideoModelLogic;
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.CommonPhoneLiveVideoPresenterImp;
import com.team.zhuoke.presenter.common.interfaces.CommonPhoneLiveVideoContract;
import com.team.zhuoke.ui.loadplay.LoadingView;
import butterknife.BindView;
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;
/**
* 作者:gaoyin
* 电话:18810474975
* 邮箱:18810474975@163.com
* 版本号:1.0
* 类描述: 手机直播播放页
* 备注消息:
* 修改时间:2017/2/10 上午11:16
**/
public class PhoneLiveVideoActivity extends BaseActivity<CommonPhoneLiveVideoModelLogic, CommonPhoneLiveVideoPresenterImp> implements CommonPhoneLiveVideoContract.View, MediaPlayer.OnInfoListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnErrorListener {
@BindView(R.id.vm_videoview)
VideoView vmVideoview;
@BindView(R.id.im_logo)
ImageView imLogo;
@BindView(R.id.lv_playloading)
LoadingView lvPlayloading;
@BindView(R.id.fl_loading)
FrameLayout flLoading;
@BindView(R.id.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.tv_loading_buffer)
TextView tvLoadingBuffer;
@BindView(R.id.danmakuView)
DanmakuView danmakuView;
@BindView(R.id.img_loading)
SimpleDraweeView imgLoading;
private HomeRecommendHotCate.RoomListEntity mRoomEntity;
private OldLiveVideoInfo videoInfo;
private String Room_id;
private SVProgressHUD svProgressHUD;
private String imgUrl;
/**
* 弹幕
*/
private DanmuProcess mDanmuProcess;
/**
* 音量 亮度
*
* @return
*/
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;
/**
* 声音
*/
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 Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
/**
* 隐藏top ,bottom
*/
case HIDE_CONTROL_BAR:
break;
/**
* 隐藏center控件
*/
case SHOW_CENTER_CONTROL:
if (controlCenter != null) {
controlCenter.setVisibility(View.GONE);
}
break;
}
}
};
@Override
protected int getLayoutId() {
// requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
Vitamio.isInitialized(this);
return R.layout.activity_phonelive_video;
}
@Override
protected void onInitView(Bundle bundle) {
Room_id = getIntent().getExtras().getString("Room_id");
imgUrl = getIntent().getExtras().getString("Img_Path");
if (imgUrl != null) {
imgLoading.setImageURI(Uri.parse(imgUrl));
}
// 保持 屏幕常亮
vmVideoview.setKeepScreenOn(true);
mPresenter.getPresenterPhoneLiveVideoInfo(Room_id);
svProgressHUD = new SVProgressHUD(this);
//获取屏幕宽度
Pair<Integer, Integer> screenPair = ScreenResolution.getResolution(this);
mScreenWidth = screenPair.first;
// 初始化声音和亮度
initVolumeWithLight();
vmVideoview.setVideoLayout(VideoView.VIDEO_LAYOUT_STRETCH, 0);
initDanMu(Room_id);
}
private void initDanMu(String room_id) {
mDanmuProcess = new DanmuProcess(this, danmakuView, Integer.valueOf(room_id));
mDanmuProcess.start();
}
/**
* 初始化声音和亮度
*/
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 onEvent() {
// 添加手势监听
addTouchListener();
// 视频播放监听
vmVideoview.setOnInfoListener(this);
vmVideoview.setOnBufferingUpdateListener(this);
vmVideoview.setOnErrorListener(this);
}
/**
* 触摸事件进行监听
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mGestureDetector != null)
mGestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
@Override
protected BaseView getView() {
return this;
}
@Override
public void getViewPhoneLiveVideoInfo(OldLiveVideoInfo mLiveVideoInfo) {
runOnUiThread(new Runnable() {
@Override
public void run() {
videoInfo = mLiveVideoInfo;
getViewInfo(mLiveVideoInfo);
}
});
}
private void getViewInfo(OldLiveVideoInfo mLiveVideoInfo) {
if (mLiveVideoInfo.getData() != null) {
String url = mLiveVideoInfo.getData().getLive_url();
Uri uri = Uri.parse(url);
if (vmVideoview != null) {
vmVideoview.setVideoURI(uri);
vmVideoview.setBufferSize(1024 * 1024 * 20);
/**
* 设置视频质量。参数quality参见MediaPlayer的常量:
* VIDEOQUALITY_LOW(流畅)、VIDEOQUALITY_MEDIUM(普通)、VIDEOQUALITY_HIGH(高质)。
*/
vmVideoview.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);
vmVideoview.requestFocus();
vmVideoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
// optional need Vitamio 4.0
mediaPlayer.setPlaybackSpeed(1.0f);
flLoading.setVisibility(View.GONE);
// vmVideoview.setBackgroundResource(0);
mHandler.sendEmptyMessageDelayed(HIDE_CONTROL_BAR, HIDE_TIME);
}
});
}
}
}
@Override
public void showErrorWithStatus(String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
svProgressHUD.showErrorWithStatus("主播还在赶来的路上~~");
}
});
}
/**
* 添加手势操作
*/
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) {
return true;
}
};
mGestureDetector = new GestureDetector(this, mSimpleOnGestureListener);
}
/**
* 改变声音
*/
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 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.getPresenterPhoneLiveVideoInfo(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();
}
mHandler.removeMessages(HIDE_CONTROL_BAR);
break;
// 完成缓冲
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
flLoading.setVisibility(View.GONE);
if (!vmVideoview.isPlaying())
vmVideoview.start();
mHandler.sendEmptyMessageDelayed(HIDE_CONTROL_BAR, HIDE_TIME);
break;
case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
break;
}
return true;
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_ERROR_UNKNOWN) {
svProgressHUD.showErrorWithStatus("主播还在赶来的路上~~");
}
return false;
}
}