package com.edufound.reader.presenter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import com.chivox.aiengine.EvalResult; import com.edufound.reader.R; import com.edufound.reader.adapter.SlideVideoAdapter; import com.edufound.reader.application.EApplication; import com.edufound.reader.base.BasePresenter; import com.edufound.reader.bean.SlideVideoBean; import com.edufound.reader.contract.MainContract; import com.edufound.reader.cusview.RvListJzvdStd; import com.edufound.reader.model.MainModel; import com.edufound.reader.services.RecordServices; import com.edufound.reader.util.CToast; import com.edufound.reader.videoutil.OnViewPagerListener; import com.edufound.reader.videoutil.ViewPagerLayoutManager; import com.orhanobut.logger.Logger; import java.util.ArrayList; import java.util.List; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import cn.jzvd.Jzvd; public class MainPresenter extends BasePresenter implements MainContract.Presenter { MainModel mModel; private ViewPagerLayoutManager mViewPagerLayoutManager; private int mCurrentPosition = -1; RecordServices mRecordServices; /* * 测试数据 * */ List mDataList; SlideVideoAdapter mAdapter; public MainPresenter() { mModel = new MainModel(); } @Override public void initVideoList(RecyclerView rv) { /* * 测试数据 * */ mDataList = new ArrayList<>(); for (int i = 0; i < 5; i++) { SlideVideoBean bean = new SlideVideoBean(); if (i % 2 == 0) { bean.videoUrl = "http://reader-wx.ai160.com/vs2m-m3u8/reader/053/05303004/05303004038/05303004038.m3u8"; bean.videoTitle = "m3u8视频"; } else { bean.videoUrl = "https://reader-wx.ai160.com/reader/resource/video/1610961140479648.mp4"; bean.videoTitle = "https--MP4视频"; } mDataList.add(bean); } rv.setLayoutManager(new LinearLayoutManager(mView.getActivity())); rv.setNestedScrollingEnabled(false); mViewPagerLayoutManager = new ViewPagerLayoutManager(mView.getActivity(), OrientationHelper.VERTICAL); rv.setLayoutManager(mViewPagerLayoutManager); mAdapter = new SlideVideoAdapter(mView.getActivity(), mDataList); rv.setAdapter(mAdapter); mViewPagerLayoutManager.setOnViewPagerListener(new OnViewPagerListener() { @Override public void onInitComplete() { //自动播放第一条 autoPlayVideo(rv); } @Override public void onPageRelease(boolean isNext, int position) { if (mCurrentPosition == position) { Jzvd.releaseAllVideos(); } } @Override public void onPageSelected(int position, boolean isBottom) { // if (mCurrentPosition == position) { // Logger.e("mCurrentPosition == position..return了"); // return; // } autoPlayVideo(rv); mCurrentPosition = position; } }); rv.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() { @Override public void onChildViewAttachedToWindow(View view) { scrollToNextFunction(rv, false); } @Override public void onChildViewDetachedFromWindow(View view) { Jzvd jzvd = view.findViewById(R.id.slidevideo_video); if (jzvd != null && Jzvd.CURRENT_JZVD != null && jzvd.jzDataSource != null && jzvd.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.getCurrentUrl())) { if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) { Jzvd.releaseAllVideos(); } } } }); } private void autoPlayVideo(RecyclerView rv) { if (rv == null || rv.getChildAt(0) == null) { return; } RvListJzvdStd player = rv.getChildAt(0).findViewById(R.id.slidevideo_video); if (player != null) { if (player.state == Jzvd.STATE_PLAYING) { //正在播放 } else { player.startVideoAfterPreloading(); player.setVideoCallBack(new RvListJzvdStd.VideoCallBack() { @Override public void onComplete() { scrollToNextFunction(rv, true); } }); } } } private void scrollToNextFunction(RecyclerView rv, boolean needScroll) { //获取当前显示的View 的数据 int childCount = rv.getChildCount(); //获取最后一具 Item 对应的View View childAt = rv.getChildAt(childCount - 1); //获取当前军舰中显示的最后一个 Item 的位置 Postion int childLayoutPosition = rv.getChildLayoutPosition(childAt); //如果不是最后一个就向下滑动 if (childLayoutPosition < rv.getAdapter().getItemCount() - 2) { if (needScroll) { rv.smoothScrollToPosition(childLayoutPosition + 1); } } else { // Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show(); // CToast.makeText(mView.getActivity(), "滑动到最后一个啦", 3000).show(); Logger.e("倒数第二个,添加数据"); mAdapter.addMored(mDataList); } } @Override public void bindRecordServices() { if (mRecordServices == null) { Intent intent = new Intent(); intent.setClass(mView.getActivity(), RecordServices.class); mView.getActivity().bindService(intent, recordServicesConn, Context.BIND_AUTO_CREATE); } } @Override public void startRecord(String name, String refText) { mRecordServices.startRecord(mView.getActivity(), name, refText); } @Override public void stopRecord() { mRecordServices.stopRecord(); } public void rePlayRecord() { mRecordServices.replayRecord(); } @Override public void activityDestroy() { mRecordServices.unbindService(recordServicesConn); if (mRecordServices != null) { mView.getActivity().unbindService(recordServicesConn); } } @Override public void activityPause() { } @Override public void activityResume() { } private ServiceConnection recordServicesConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { mRecordServices = ((RecordServices.RecordServicesBind) iBinder).getService(); mRecordServices.setRecordCallBack(new RecordServices.RecordCallBack() { @Override public void onRecordStart() { Logger.e("录音开始"); } @Override public void onRecordStop(int type, String tokenId, EvalResult result) { Logger.e("录音停止"); } @Override public void onRecordCancel() { Logger.e("录音取消"); } }); } @Override public void onServiceDisconnected(ComponentName componentName) { mRecordServices = null; } }; public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_ESCAPE: EApplication.killAppProcess(mView.getActivity()); return true; } return true; } }