package com.dl7.mvp.module.video.player; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; import android.support.v4.app.Fragment; import android.support.v7.widget.Toolbar; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import com.bumptech.glide.Glide; import com.dl7.downloaderlib.model.DownloadStatus; import com.dl7.mvp.R; import com.dl7.mvp.engine.DownloaderWrapper; import com.dl7.mvp.engine.danmaku.DanmakuConverter; import com.dl7.mvp.engine.danmaku.DanmakuLoader; import com.dl7.mvp.engine.danmaku.DanmakuParser; import com.dl7.mvp.injector.components.DaggerVideoPlayerComponent; import com.dl7.mvp.injector.modules.VideoPlayerModule; import com.dl7.mvp.local.table.DanmakuInfo; import com.dl7.mvp.local.table.VideoInfo; import com.dl7.mvp.module.base.BaseActivity; import com.dl7.mvp.utils.CommonConstant; import com.dl7.mvp.utils.DialogHelper; import com.dl7.mvp.utils.SnackbarUtils; import com.dl7.mvp.widget.SimpleButton; import com.dl7.mvp.widget.dialog.ShareBottomDialog; import com.dl7.player.danmaku.OnDanmakuListener; import com.dl7.player.media.IjkPlayerView; import com.dl7.player.utils.SoftInputUtils; import com.orhanobut.logger.Logger; import com.sackcentury.shinebuttonlib.ShineButton; import java.io.InputStream; import butterknife.BindView; import butterknife.OnClick; import static com.dl7.mvp.utils.CommonConstant.VIDEO_DATA_KEY; public class VideoPlayerActivity extends BaseActivity<IVideoPresenter> implements IVideoView { @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.video_player) IjkPlayerView mPlayerView; @BindView(R.id.iv_video_share) ImageView mIvVideoShare; @BindView(R.id.iv_video_collect) ShineButton mIvVideoCollect; @BindView(R.id.iv_video_download) ImageView mIvVideoDownload; @BindView(R.id.ll_operate) LinearLayout mLlOperate; @BindView(R.id.et_content) EditText mEtContent; @BindView(R.id.ll_edit_layout) LinearLayout mLlEditLayout; @BindView(R.id.sb_send) SimpleButton mSbSend; private VideoInfo mVideoData; public static void launch(Context context, VideoInfo data) { Intent intent = new Intent(context, VideoPlayerActivity.class); intent.putExtra(VIDEO_DATA_KEY, data); context.startActivity(intent); ((Activity) context).overridePendingTransition(R.anim.slide_bottom_entry, R.anim.hold); } public static void launchForResult(Fragment fragment, VideoInfo data) { Intent intent = new Intent(fragment.getContext(), VideoPlayerActivity.class); intent.putExtra(VIDEO_DATA_KEY, data); fragment.startActivityForResult(intent, CommonConstant.VIDEO_REQUEST_CODE); fragment.getActivity().overridePendingTransition(R.anim.slide_bottom_entry, R.anim.hold); } @Override protected int attachLayoutRes() { return R.layout.activity_video_player; } @Override protected void initInjector() { mVideoData = getIntent().getParcelableExtra(VIDEO_DATA_KEY); DaggerVideoPlayerComponent.builder() .applicationComponent(getAppComponent()) .videoPlayerModule(new VideoPlayerModule(this, mVideoData)) .build() .inject(this); } @Override protected void initViews() { initToolBar(mToolbar, true, mVideoData.getTitle()); mPlayerView.init() .setTitle(mVideoData.getTitle()) .setVideoSource(null, mVideoData.getMp4_url(), mVideoData.getMp4Hd_url(), null, null) .enableDanmaku() .setDanmakuCustomParser(new DanmakuParser(), DanmakuLoader.instance(), DanmakuConverter.instance()) .setDanmakuListener(new OnDanmakuListener<DanmakuInfo>() { @Override public boolean isValid() { return true; } @Override public void onDataObtain(DanmakuInfo danmakuInfo) { Logger.w(danmakuInfo.toString()); danmakuInfo.setUserName("Long"); danmakuInfo.setVid(mVideoData.getVid()); mPresenter.addDanmaku(danmakuInfo); } }); mIvVideoCollect.init(this); mIvVideoCollect.setShapeResource(R.drawable.ic_video_collect); mIvVideoCollect.setOnCheckStateChangeListener(new ShineButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(View view, boolean checked) { // 这里直接点击就处理,通常是需要和服务器交互返回成功才处理的,但是这个库内部直接受理了点击事件,没法方便地 // 来控制它,需要改代码 mVideoData.setCollect(checked); if (mVideoData.isCollect()) { mPresenter.insert(mVideoData); } else { mPresenter.delete(mVideoData); } } }); Glide.with(this).load(mVideoData.getCover()).fitCenter().into(mPlayerView.mPlayerThumb); mEtContent.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { mPlayerView.editVideo(); } mLlOperate.setVisibility(hasFocus ? View.GONE : View.VISIBLE); } }); } @Override protected void updateViews(boolean isRefresh) { mPresenter.getData(isRefresh); } @Override protected void onResume() { super.onResume(); mPlayerView.onResume(); } @Override protected void onPause() { super.onPause(); mPlayerView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mPlayerView.onDestroy(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mPlayerView.configurationChanged(newConfig); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (mPlayerView.handleVolumeKey(keyCode)) { return true; } return super.onKeyDown(keyCode, event); } @Override public void onBackPressed() { if (mPlayerView.onBackPressed()) { return; } super.onBackPressed(); } @Override public void loadData(VideoInfo data) { mVideoData = data; mIvVideoCollect.setChecked(data.isCollect()); mIvVideoDownload.setSelected(data.getDownloadStatus() != DownloadStatus.NORMAL); } @Override public void loadDanmakuData(InputStream inputStream) { mPlayerView.setDanmakuSource(inputStream); } @OnClick({R.id.iv_video_share, R.id.iv_video_download, R.id.sb_send}) public void onClick(View view) { switch (view.getId()) { case R.id.iv_video_share: new ShareBottomDialog(this).show(); break; case R.id.iv_video_download: if (view.isSelected()) { DialogHelper.checkDialog(this, mVideoData); } else { DialogHelper.downloadDialog(this, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { DownloaderWrapper.start(mVideoData); mIvVideoDownload.setSelected(true); SnackbarUtils.showDownloadSnackbar(VideoPlayerActivity.this, "任务正在下载", true); } }); } break; case R.id.sb_send: mPlayerView.sendDanmaku(mEtContent.getText().toString(), false); mEtContent.setText(""); _closeSoftInput(); break; } } @Override public void finish() { Intent intent = new Intent(); intent.putExtra(CommonConstant.RESULT_KEY, mVideoData.isCollect()); setResult(RESULT_OK, intent); super.finish(); overridePendingTransition(R.anim.hold, R.anim.slide_bottom_exit); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { View view = getCurrentFocus(); if (_isHideSoftInput(view, (int) ev.getX(), (int) ev.getY())) { _closeSoftInput(); return true; } return super.dispatchTouchEvent(ev); } private void _closeSoftInput() { mEtContent.clearFocus(); SoftInputUtils.closeSoftInput(this); mPlayerView.recoverFromEditVideo(); } private boolean _isHideSoftInput(View view, int x, int y) { if (view == null || !(view instanceof EditText) || !mEtContent.isFocused()) { return false; } return x < mLlEditLayout.getLeft() || x > mLlEditLayout.getRight() || y > mLlEditLayout.getBottom() || y < mLlEditLayout.getTop(); } }