MainPresenter.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package com.edufound.reader.presenter;
  2. import android.content.ComponentName;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.ServiceConnection;
  6. import android.os.IBinder;
  7. import android.view.KeyEvent;
  8. import android.view.MotionEvent;
  9. import android.view.View;
  10. import com.chivox.aiengine.EvalResult;
  11. import com.edufound.reader.R;
  12. import com.edufound.reader.adapter.SlideVideoAdapter;
  13. import com.edufound.reader.application.EApplication;
  14. import com.edufound.reader.base.BasePresenter;
  15. import com.edufound.reader.bean.SlideVideoBean;
  16. import com.edufound.reader.contract.MainContract;
  17. import com.edufound.reader.cusview.RvListJzvdStd;
  18. import com.edufound.reader.model.MainModel;
  19. import com.edufound.reader.services.RecordServices;
  20. import com.edufound.reader.util.CToast;
  21. import com.edufound.reader.videoutil.OnViewPagerListener;
  22. import com.edufound.reader.videoutil.ViewPagerLayoutManager;
  23. import com.orhanobut.logger.Logger;
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. import androidx.recyclerview.widget.LinearLayoutManager;
  27. import androidx.recyclerview.widget.OrientationHelper;
  28. import androidx.recyclerview.widget.RecyclerView;
  29. import cn.jzvd.Jzvd;
  30. public class MainPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter {
  31. MainModel mModel;
  32. private ViewPagerLayoutManager mViewPagerLayoutManager;
  33. private int mCurrentPosition = -1;
  34. RecordServices mRecordServices;
  35. /*
  36. * 测试数据
  37. * */
  38. List<SlideVideoBean> mDataList;
  39. SlideVideoAdapter mAdapter;
  40. public MainPresenter() {
  41. mModel = new MainModel();
  42. }
  43. @Override
  44. public void initVideoList(RecyclerView rv) {
  45. /*
  46. * 测试数据
  47. * */
  48. mDataList = new ArrayList<>();
  49. for (int i = 0; i < 5; i++) {
  50. SlideVideoBean bean = new SlideVideoBean();
  51. if (i % 2 == 0) {
  52. bean.videoUrl = "http://reader-wx.ai160.com/vs2m-m3u8/reader/053/05303004/05303004038/05303004038.m3u8";
  53. bean.videoTitle = "m3u8视频";
  54. } else {
  55. bean.videoUrl = "https://reader-wx.ai160.com/reader/resource/video/1610961140479648.mp4";
  56. bean.videoTitle = "https--MP4视频";
  57. }
  58. mDataList.add(bean);
  59. }
  60. rv.setLayoutManager(new LinearLayoutManager(mView.getActivity()));
  61. rv.setNestedScrollingEnabled(false);
  62. mViewPagerLayoutManager = new ViewPagerLayoutManager(mView.getActivity(), OrientationHelper.VERTICAL);
  63. rv.setLayoutManager(mViewPagerLayoutManager);
  64. mAdapter = new SlideVideoAdapter(mView.getActivity(), mDataList);
  65. rv.setAdapter(mAdapter);
  66. mViewPagerLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {
  67. @Override
  68. public void onInitComplete() {
  69. //自动播放第一条
  70. autoPlayVideo(rv);
  71. }
  72. @Override
  73. public void onPageRelease(boolean isNext, int position) {
  74. if (mCurrentPosition == position) {
  75. Jzvd.releaseAllVideos();
  76. }
  77. }
  78. @Override
  79. public void onPageSelected(int position, boolean isBottom) {
  80. // if (mCurrentPosition == position) {
  81. // Logger.e("mCurrentPosition == position..return了");
  82. // return;
  83. // }
  84. autoPlayVideo(rv);
  85. mCurrentPosition = position;
  86. }
  87. });
  88. rv.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
  89. @Override
  90. public void onChildViewAttachedToWindow(View view) {
  91. scrollToNextFunction(rv, false);
  92. }
  93. @Override
  94. public void onChildViewDetachedFromWindow(View view) {
  95. Jzvd jzvd = view.findViewById(R.id.slidevideo_video);
  96. if (jzvd != null && Jzvd.CURRENT_JZVD != null && jzvd.jzDataSource != null &&
  97. jzvd.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.getCurrentUrl())) {
  98. if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) {
  99. Jzvd.releaseAllVideos();
  100. }
  101. }
  102. }
  103. });
  104. }
  105. private void autoPlayVideo(RecyclerView rv) {
  106. if (rv == null || rv.getChildAt(0) == null) {
  107. return;
  108. }
  109. RvListJzvdStd player = rv.getChildAt(0).findViewById(R.id.slidevideo_video);
  110. if (player != null) {
  111. if (player.state == Jzvd.STATE_PLAYING) {
  112. //正在播放
  113. } else {
  114. player.startVideoAfterPreloading();
  115. player.setVideoCallBack(new RvListJzvdStd.VideoCallBack() {
  116. @Override
  117. public void onComplete() {
  118. scrollToNextFunction(rv, true);
  119. }
  120. });
  121. }
  122. }
  123. }
  124. private void scrollToNextFunction(RecyclerView rv, boolean needScroll) {
  125. //获取当前显示的View 的数据
  126. int childCount = rv.getChildCount();
  127. //获取最后一具 Item 对应的View
  128. View childAt = rv.getChildAt(childCount - 1);
  129. //获取当前军舰中显示的最后一个 Item 的位置 Postion
  130. int childLayoutPosition = rv.getChildLayoutPosition(childAt);
  131. //如果不是最后一个就向下滑动
  132. if (childLayoutPosition < rv.getAdapter().getItemCount() - 2) {
  133. if (needScroll) {
  134. rv.smoothScrollToPosition(childLayoutPosition + 1);
  135. }
  136. } else {
  137. // Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show();
  138. // CToast.makeText(mView.getActivity(), "滑动到最后一个啦", 3000).show();
  139. Logger.e("倒数第二个,添加数据");
  140. mAdapter.addMored(mDataList);
  141. }
  142. }
  143. @Override
  144. public void bindRecordServices() {
  145. if (mRecordServices == null) {
  146. Intent intent = new Intent();
  147. intent.setClass(mView.getActivity(), RecordServices.class);
  148. mView.getActivity().bindService(intent, recordServicesConn, Context.BIND_AUTO_CREATE);
  149. }
  150. }
  151. @Override
  152. public void startRecord(String name, String refText) {
  153. mRecordServices.startRecord(mView.getActivity(), name, refText);
  154. }
  155. @Override
  156. public void stopRecord() {
  157. mRecordServices.stopRecord();
  158. }
  159. public void rePlayRecord() {
  160. mRecordServices.replayRecord();
  161. }
  162. @Override
  163. public void activityDestroy() {
  164. mRecordServices.unbindService(recordServicesConn);
  165. if (mRecordServices != null) {
  166. mView.getActivity().unbindService(recordServicesConn);
  167. }
  168. }
  169. @Override
  170. public void activityPause() {
  171. }
  172. @Override
  173. public void activityResume() {
  174. }
  175. private ServiceConnection recordServicesConn = new ServiceConnection() {
  176. @Override
  177. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  178. mRecordServices = ((RecordServices.RecordServicesBind) iBinder).getService();
  179. mRecordServices.setRecordCallBack(new RecordServices.RecordCallBack() {
  180. @Override
  181. public void onRecordStart() {
  182. Logger.e("录音开始");
  183. }
  184. @Override
  185. public void onRecordStop(int type, String tokenId, EvalResult result) {
  186. Logger.e("录音停止");
  187. }
  188. @Override
  189. public void onRecordCancel() {
  190. Logger.e("录音取消");
  191. }
  192. });
  193. }
  194. @Override
  195. public void onServiceDisconnected(ComponentName componentName) {
  196. mRecordServices = null;
  197. }
  198. };
  199. public boolean onKeyDown(int keyCode, KeyEvent event) {
  200. switch (keyCode) {
  201. case KeyEvent.KEYCODE_BACK:
  202. case KeyEvent.KEYCODE_ESCAPE:
  203. EApplication.killAppProcess(mView.getActivity());
  204. return true;
  205. }
  206. return true;
  207. }
  208. }