RecommendFragmentPresenter.java 18 KB

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