RecommendFragmentPresenter.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. package com.edufound.reader.presenter;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.graphics.Outline;
  5. import android.text.TextUtils;
  6. import android.view.View;
  7. import android.view.ViewOutlineProvider;
  8. import android.widget.Toast;
  9. import com.edufound.reader.R;
  10. import com.edufound.reader.adapter.SlideVideoAdapter;
  11. import com.edufound.reader.base.BaseActivity;
  12. import com.edufound.reader.base.BasePresenter;
  13. import com.edufound.reader.bean.FavoritesBean;
  14. import com.edufound.reader.bean.HttpResultBean;
  15. import com.edufound.reader.bean.HttpResultDataListBean;
  16. import com.edufound.reader.bean.UserRecordBean;
  17. import com.edufound.reader.contract.RecommendFragmentContract;
  18. import com.edufound.reader.cusview.CusToast;
  19. import com.edufound.reader.cusview.RvListJzvdStd;
  20. import com.edufound.reader.model.RecommendFragmentModel;
  21. import com.edufound.reader.receiver.BackPageReceiver;
  22. import com.edufound.reader.util.Consts;
  23. import com.edufound.reader.util.EfunboxUtil;
  24. import com.edufound.reader.util.MMKVEncodeKey;
  25. import com.edufound.reader.util.MMKVUtil;
  26. import com.edufound.reader.util.SizeUtils;
  27. import com.edufound.reader.videoutil.OnViewPagerListener;
  28. import com.edufound.reader.videoutil.ViewPagerLayoutManager;
  29. import com.google.gson.reflect.TypeToken;
  30. import com.okhttplib.HttpInfo;
  31. import com.okhttplib.callback.Callback;
  32. import com.orhanobut.logger.Logger;
  33. import java.io.IOException;
  34. import java.util.ArrayList;
  35. import java.util.HashMap;
  36. import java.util.List;
  37. import java.util.Map;
  38. import androidx.recyclerview.widget.LinearLayoutManager;
  39. import androidx.recyclerview.widget.OrientationHelper;
  40. import androidx.recyclerview.widget.RecyclerView;
  41. import cn.jzvd.Jzvd;
  42. import cn.jzvd.JzvdStd;
  43. public class RecommendFragmentPresenter extends BasePresenter<RecommendFragmentContract.View> implements RecommendFragmentContract.Presenter {
  44. Context mContext;
  45. RecommendFragmentModel mModel;
  46. private ViewPagerLayoutManager mViewPagerLayoutManager;
  47. private int mCurrentPosition = 0;
  48. List<UserRecordBean> mDataList;
  49. SlideVideoAdapter mAdapter;
  50. int loadType = 0;
  51. int mTotalSize = 20;
  52. int mPageIndex = 1;
  53. boolean loadOver = false;
  54. public RecommendFragmentPresenter(Context context) {
  55. mModel = new RecommendFragmentModel();
  56. mContext = context;
  57. if (mDataList == null) {
  58. mDataList = new ArrayList<>();
  59. }
  60. }
  61. @Override
  62. public void initVideoList(RecyclerView rv, int type, int startPosition) {
  63. rv.setOutlineProvider(new ViewOutlineProvider() {
  64. @Override
  65. public void getOutline(View view, Outline outline) {
  66. outline.setRoundRect(SizeUtils.dp2px(mContext, 5),
  67. 0,
  68. view.getWidth() - SizeUtils.dp2px(mContext, 5),
  69. view.getHeight(),
  70. SizeUtils.dp2px(mContext, 40));
  71. }
  72. });
  73. rv.setClipToOutline(true);
  74. loadType = type;
  75. if (type == 0) {
  76. //推荐的接口
  77. initVideoDate(rv, startPosition);
  78. getRecommendDataList();
  79. } else if (type == 1) {
  80. //关注的所有人的所有视频
  81. initVideoDate(rv, startPosition);
  82. getMyFollowAllVideo();
  83. } else if (type == 2) {
  84. //上级页面传的json
  85. mDataList = ((BaseActivity) mView.getActivity()).getGson().fromJson(mView.getDataJson(), new TypeToken<List<UserRecordBean>>() {
  86. }.getType());
  87. initVideoDate(rv, startPosition);
  88. mTotalSize = mDataList.size();
  89. mView.getRootView().setVisibility(View.VISIBLE);
  90. mView.showFirstIntoView();
  91. mView.getRootView().post(new Runnable() {
  92. @Override
  93. public void run() {
  94. mAdapter.notifyDataSetChanged();
  95. }
  96. });
  97. }
  98. }
  99. public void initVideoDate(RecyclerView rv, int startPosition) {
  100. rv.setLayoutManager(new LinearLayoutManager(mView.getActivity()));
  101. rv.setNestedScrollingEnabled(false);
  102. mViewPagerLayoutManager = new ViewPagerLayoutManager(mView.getActivity(), OrientationHelper.VERTICAL);
  103. rv.setLayoutManager(mViewPagerLayoutManager);
  104. mAdapter = new SlideVideoAdapter(mView.getActivity(), mDataList);
  105. rv.setAdapter(mAdapter);
  106. mViewPagerLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {
  107. @Override
  108. public void onInitComplete() {
  109. //自动播放第一条
  110. autoPlayVideo(rv);
  111. }
  112. @Override
  113. public void onPageRelease(boolean isNext, int position) {
  114. if (mCurrentPosition == position) {
  115. Jzvd.releaseAllVideos();
  116. }
  117. }
  118. @Override
  119. public void onPageSelected(int position, boolean isBottom) {
  120. // if (mCurrentPosition == position) {
  121. // Logger.e("mCurrentPosition == position..return了");
  122. // return;
  123. // }
  124. ((BaseActivity) mView.getActivity()).removeFirstTipView();
  125. autoPlayVideo(rv);
  126. mCurrentPosition = position;
  127. if (mCurrentPosition == 0) {
  128. Toast.makeText(mContext, "已经是第一个了", Toast.LENGTH_SHORT).show();
  129. } else if (mCurrentPosition == (mTotalSize - 1)) {
  130. Toast.makeText(mContext, "已经是最后一个了", Toast.LENGTH_SHORT).show();
  131. }
  132. // Logger.e("mCurrentPosition:" + mCurrentPosition);
  133. // Logger.e("mDataList:" + mDataList.size());
  134. scrollToNextFunction(rv, false);
  135. }
  136. @Override
  137. public void onChildViewDetachedFromWindow(View view) {
  138. Jzvd jzvd = view.findViewById(R.id.slidevideo_video);
  139. if (jzvd != null && Jzvd.CURRENT_JZVD != null && jzvd.jzDataSource != null &&
  140. jzvd.jzDataSource.containsTheUrl(Jzvd.CURRENT_JZVD.jzDataSource.getCurrentUrl())) {
  141. if (Jzvd.CURRENT_JZVD != null && Jzvd.CURRENT_JZVD.screen != Jzvd.SCREEN_FULLSCREEN) {
  142. Jzvd.releaseAllVideos();
  143. }
  144. }
  145. }
  146. });
  147. if (startPosition > 0) {
  148. rv.scrollToPosition(startPosition);
  149. mCurrentPosition = startPosition;
  150. }
  151. }
  152. @Override
  153. public int getCurPlayVideoIndex() {
  154. return mCurrentPosition;
  155. }
  156. @Override
  157. public Object getCurVideoExampleId() {
  158. if (mDataList != null && mDataList.size() > 0) {
  159. return mDataList.get(mCurrentPosition).getUserRead().getExampleId();
  160. }
  161. return -1;
  162. }
  163. @Override
  164. public void fragmentPause(RecyclerView rv) {
  165. Jzvd.releaseAllVideos();
  166. JzvdStd.goOnPlayOnPause();
  167. }
  168. @Override
  169. public void fragmentResume(RecyclerView rv) {
  170. mView.getRootView().postDelayed(new Runnable() {
  171. @Override
  172. public void run() {
  173. if (rv.getChildCount() > 0) {
  174. RvListJzvdStd player = rv.getChildAt(0).findViewById(R.id.slidevideo_video);
  175. if (player == null) {
  176. Logger.e("竟然是空的");
  177. }
  178. player.startVideoAfterPreloading();
  179. }
  180. }
  181. }, 800);
  182. }
  183. @Override
  184. public void getRecommendDataList() {
  185. if (mDataList != null && mDataList.size() >= mTotalSize) {
  186. loadOver = true;
  187. // Toast.makeText(mContext, "没有更多了", Toast.LENGTH_SHORT).show();
  188. return;
  189. }
  190. if (TextUtils.isEmpty(MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE))) {
  191. //如果是空的,就是没选择过年纪。然后给个默认的一年级
  192. //PRESCHOOL,FIRST_GRADE,SECOND_GRADE,THIRD_GRADE,FOURTH_GRADE
  193. // MMKVUtil.getInstance().encode(MMKVEncodeKey.USER_GRADE, "FIRST_GRADE");
  194. }
  195. String grade = MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE);
  196. if (TextUtils.isEmpty(grade)) {
  197. grade = EfunboxUtil.getEnumByCNGrade("一年级");
  198. }
  199. if (Consts.getmConstsUserBean() == null) {
  200. grade = EfunboxUtil.getEnumByCNGrade("一年级");
  201. }
  202. mModel.getRecommendList(mView.getActivity(), grade, mPageIndex, new Callback() {
  203. @Override
  204. public void onSuccess(HttpInfo info) throws IOException {
  205. HttpResultBean<HttpResultDataListBean<UserRecordBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<UserRecordBean>>>() {
  206. }.getType());
  207. mAdapter.addMored(bean.getData().getList());
  208. // mDataList.addAll(bean.getData().getList());
  209. mTotalSize = Integer.valueOf(bean.getData().getTotalSize());
  210. mView.getRootView().post(new Runnable() {
  211. @Override
  212. public void run() {
  213. mAdapter.notifyDataSetChanged();
  214. mPageIndex++;
  215. mView.getRootView().setVisibility(View.VISIBLE);
  216. mView.showFirstIntoView();
  217. }
  218. });
  219. }
  220. @Override
  221. public void onFailure(HttpInfo info) throws IOException {
  222. CusToast.getInstance(mView.getActivity()).show(info.getRetDetail(), 3000);
  223. }
  224. });
  225. }
  226. @Override
  227. public void doFavorites(UserRecordBean.UserRead userRead) {
  228. Map<String, String> map = new HashMap<>();
  229. map.put("targetCode", userRead.getId());
  230. String json = ((BaseActivity) mView.getActivity()).getGson().toJson(map);
  231. mModel.doFavorites(mView.getActivity(), json, new Callback() {
  232. @Override
  233. public void onSuccess(HttpInfo info) throws IOException {
  234. HttpResultBean<FavoritesBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<FavoritesBean>>() {
  235. }.getType());
  236. Intent intent = new Intent();
  237. if (bean.getData().getStatus().equals("DEL")) {
  238. mDataList.get(mCurrentPosition).setFavorites(false);
  239. mDataList.get(mCurrentPosition).setFavoritesBean(null);
  240. mView.setFavorites(false);
  241. intent.setAction(BackPageReceiver.BACK_HOME_REMOVE_VIDEO_ITEM);
  242. } else if (bean.getData().getStatus().equals("NORMAL")) {
  243. mDataList.get(mCurrentPosition).setFavorites(true);
  244. mDataList.get(mCurrentPosition).setFavoritesBean(null);
  245. mView.setFavorites(true);
  246. intent.setAction(BackPageReceiver.BACK_HOME_ADD_VIDEO_ITEM);
  247. }
  248. intent.putExtra("position", String.valueOf(mCurrentPosition));
  249. mContext.sendBroadcast(intent);
  250. }
  251. @Override
  252. public void onFailure(HttpInfo info) throws IOException {
  253. Logger.e("收藏/取消收藏接口失败:" + info.getRetDetail());
  254. }
  255. });
  256. }
  257. @Override
  258. public void doLike(UserRecordBean.UserRead userRead) {
  259. mModel.doLick(mView.getActivity(), userRead.getId(), new Callback() {
  260. @Override
  261. public void onSuccess(HttpInfo info) throws IOException {
  262. HttpResultBean<String> bean = info.getRetDetail(new TypeToken<HttpResultBean<String>>() {
  263. }.getType());
  264. mView.setLikes(bean.getData());
  265. }
  266. @Override
  267. public void onFailure(HttpInfo info) throws IOException {
  268. Logger.e("failure---info.getRetDetail:" + info.getRetDetail());
  269. }
  270. });
  271. }
  272. @Override
  273. public void activityDestory() {
  274. mDataList = null;
  275. mAdapter = null;
  276. Jzvd.releaseAllVideos();
  277. Jzvd.backPress();
  278. }
  279. @Override
  280. public void getRecordInfoById(String id) {
  281. if (mView == null) {
  282. return;
  283. }
  284. mModel.getRecordInfoById(mView.getActivity(), id, new Callback() {
  285. @Override
  286. public void onSuccess(HttpInfo info) throws IOException {
  287. HttpResultBean<UserRecordBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserRecordBean>>() {
  288. }.getType());
  289. Logger.e("mCurrentPosition:" + mCurrentPosition);
  290. mDataList.set(mCurrentPosition, bean.getData());
  291. mView.getRootView().post(new Runnable() {
  292. @Override
  293. public void run() {
  294. mAdapter.notifyDataSetChanged();
  295. }
  296. });
  297. }
  298. @Override
  299. public void onFailure(HttpInfo info) throws IOException {
  300. Logger.e("获取单独的失敗了:" + info.getRetDetail());
  301. }
  302. });
  303. }
  304. @Override
  305. public void getMyFollowAllVideo() {
  306. if (mDataList != null && mDataList.size() >= mTotalSize) {
  307. loadOver = true;
  308. // Toast.makeText(mContext, "没有更多了", Toast.LENGTH_SHORT).show();
  309. return;
  310. }
  311. mModel.getMyFollowAllVideo(mView.getActivity(), mPageIndex, new Callback() {
  312. @Override
  313. public void onSuccess(HttpInfo info) throws IOException {
  314. HttpResultBean<HttpResultDataListBean<UserRecordBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<UserRecordBean>>>() {
  315. }.getType());
  316. mAdapter.addMored(bean.getData().getList());
  317. // mDataList.addAll(bean.getData().getList());
  318. mTotalSize = Integer.valueOf(bean.getData().getTotalSize());
  319. mView.getRootView().post(new Runnable() {
  320. @Override
  321. public void run() {
  322. mAdapter.notifyDataSetChanged();
  323. mPageIndex++;
  324. mView.getRootView().setVisibility(View.VISIBLE);
  325. mView.showFirstIntoView();
  326. }
  327. });
  328. }
  329. @Override
  330. public void onFailure(HttpInfo info) throws IOException {
  331. }
  332. });
  333. }
  334. private void autoPlayVideo(RecyclerView rv) {
  335. if (rv == null || rv.getChildAt(0) == null) {
  336. return;
  337. }
  338. //获取当前显示的View 的数据
  339. int childCount = rv.getChildCount();
  340. //获取最后一具 Item 对应的View
  341. View childAt = rv.getChildAt(childCount - 1);
  342. //获取当前军舰中显示的最后一个 Item 的位置 Postion
  343. int childLayoutPosition = rv.getChildLayoutPosition(childAt);
  344. mView.setTopStatus(mDataList.get(childLayoutPosition));
  345. RvListJzvdStd player = rv.getChildAt(0).findViewById(R.id.slidevideo_video);
  346. if (player != null) {
  347. if (player.state == Jzvd.STATE_PLAYING) {
  348. //正在播放
  349. } else {
  350. player.startVideoAfterPreloading();
  351. player.setVideoCallBack(new RvListJzvdStd.VideoCallBack() {
  352. @Override
  353. public void onComplete() {
  354. if (mCurrentPosition >= mTotalSize - 1) {
  355. Toast.makeText(mView.getActivity(), "全部播放完成", Toast.LENGTH_SHORT).show();
  356. // mView.getActivity().finish();
  357. return;
  358. }
  359. scrollToNextFunction(rv, true);
  360. }
  361. @Override
  362. public void onError(int what, int extra) {
  363. }
  364. @Override
  365. public void onInfo(int what, int extra) {
  366. }
  367. });
  368. }
  369. }
  370. }
  371. public void scrollToNextFunction(RecyclerView rv, boolean needScroll) {
  372. //获取当前显示的View 的数据
  373. int childCount = rv.getChildCount();
  374. //获取最后一具 Item 对应的View
  375. View childAt = rv.getChildAt(childCount - 1);
  376. //获取当前军舰中显示的最后一个 Item 的位置 Postion
  377. int childLayoutPosition = rv.getChildLayoutPosition(childAt);
  378. //如果不是最后一个就向下滑动
  379. if (childLayoutPosition < rv.getAdapter().getItemCount() - 1) {
  380. if (needScroll) {
  381. rv.smoothScrollToPosition(childLayoutPosition + 1);
  382. }
  383. } else {
  384. // Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show();
  385. // CToast.makeText(mView.getActivity(), "滑动到最后一个啦", 3000).show();
  386. Logger.e("loadOver:" + loadOver);
  387. if (loadOver) {
  388. return;
  389. }
  390. switch (loadType) {
  391. case 0:
  392. getRecommendDataList();
  393. break;
  394. case 1:
  395. getMyFollowAllVideo();
  396. break;
  397. case 2:
  398. break;
  399. }
  400. }
  401. }
  402. public void scrollToUpFunction(RecyclerView rv) {
  403. //获取当前显示的View 的数据
  404. Logger.e("mCurrentPosition:" + mCurrentPosition);
  405. if (mCurrentPosition > 0) {
  406. rv.smoothScrollToPosition(mCurrentPosition - 1);
  407. mCurrentPosition = mCurrentPosition - 1;
  408. } else if (mCurrentPosition == 0) {
  409. Toast.makeText(mContext, "已经是第一个了", Toast.LENGTH_SHORT).show();
  410. }
  411. }
  412. }