package com.edufound.reader.presenter; import android.content.Context; import android.content.Intent; import android.graphics.Outline; import android.text.TextUtils; import android.view.View; import android.view.ViewOutlineProvider; import android.widget.Toast; import com.edufound.reader.R; import com.edufound.reader.adapter.SlideVideoAdapter; import com.edufound.reader.base.BaseActivity; import com.edufound.reader.base.BasePresenter; import com.edufound.reader.bean.FavoritesBean; import com.edufound.reader.bean.HttpResultBean; import com.edufound.reader.bean.HttpResultDataListBean; import com.edufound.reader.bean.UserRecordBean; import com.edufound.reader.contract.RecommendFragmentContract; import com.edufound.reader.cusview.RvListJzvdStd; import com.edufound.reader.model.RecommendFragmentModel; import com.edufound.reader.receiver.BackPageReceiver; import com.edufound.reader.util.Consts; import com.edufound.reader.util.EfunboxUtil; import com.edufound.reader.util.MMKVEncodeKey; import com.edufound.reader.util.MMKVUtil; import com.edufound.reader.util.SizeUtils; import com.edufound.reader.videoutil.OnViewPagerListener; import com.edufound.reader.videoutil.ViewPagerLayoutManager; import com.google.gson.reflect.TypeToken; import com.okhttplib.HttpInfo; import com.okhttplib.callback.Callback; import com.orhanobut.logger.Logger; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.OrientationHelper; import androidx.recyclerview.widget.RecyclerView; import cn.jzvd.Jzvd; import cn.jzvd.JzvdStd; public class RecommendFragmentPresenter extends BasePresenter implements RecommendFragmentContract.Presenter { Context mContext; RecommendFragmentModel mModel; private ViewPagerLayoutManager mViewPagerLayoutManager; private int mCurrentPosition = 0; List mDataList; SlideVideoAdapter mAdapter; int loadType = 0; int mTotalSize = 20; int mPageIndex = 1; boolean loadOver = false; private String intoPage; public RecommendFragmentPresenter(Context context) { mModel = new RecommendFragmentModel(); mContext = context; if (mDataList == null) { mDataList = new ArrayList<>(); } } public void setIntoPage(String name) { intoPage = name; } @Override public void initVideoList(RecyclerView rv, int type, int startPosition) { rv.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) { outline.setRoundRect(SizeUtils.dp2px(mContext, 5), 0, view.getWidth() - SizeUtils.dp2px(mContext, 5), view.getHeight(), SizeUtils.dp2px(mContext, 40)); } }); rv.setClipToOutline(true); loadType = type; if (type == 0) { //推荐的接口 initVideoDate(rv, startPosition); getRecommendDataList(); } else if (type == 1) { //关注的所有人的所有视频 initVideoDate(rv, startPosition); getMyFollowAllVideo(); } else if (type == 2) { //上级页面传的json mDataList = ((BaseActivity) mView.getActivity()).getGson().fromJson(mView.getDataJson(), new TypeToken>() { }.getType()); initVideoDate(rv, startPosition); mTotalSize = mDataList.size(); mView.getRootView().setVisibility(View.VISIBLE); mView.showFirstIntoView(); mView.getRootView().post(new Runnable() { @Override public void run() { mAdapter.notifyDataSetChanged(); } }); } } public void initVideoDate(RecyclerView rv, int startPosition) { 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; if (mCurrentPosition == 0) { Toast.makeText(mContext, "已经是第一个了", Toast.LENGTH_SHORT).show(); } else if (mCurrentPosition == (mTotalSize - 1)) { Toast.makeText(mContext, "已经是最后一个了", Toast.LENGTH_SHORT).show(); } // Logger.e("mCurrentPosition:" + mCurrentPosition); // Logger.e("mDataList:" + mDataList.size()); } }); 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(); } } } }); if (startPosition > 0) { rv.scrollToPosition(startPosition); mCurrentPosition = startPosition; } } @Override public Object getCurPlayVideo() { return mCurrentPosition; } @Override public Object getCurVideoExampleId() { if (mDataList != null && mDataList.size() > 0) { return mDataList.get(mCurrentPosition).getUserRead().getExampleId(); } return -1; } @Override public void fragmentPause(RecyclerView rv) { Jzvd.releaseAllVideos(); JzvdStd.goOnPlayOnPause(); } @Override public void fragmentResume(RecyclerView rv) { mView.getRootView().postDelayed(new Runnable() { @Override public void run() { if (rv.getChildCount() > 0) { RvListJzvdStd player = rv.getChildAt(0).findViewById(R.id.slidevideo_video); if (player == null) { Logger.e("竟然是空的"); } player.startVideoAfterPreloading(); } } }, 800); } @Override public void getRecommendDataList() { if (mDataList != null && mDataList.size() >= mTotalSize) { loadOver = true; // Toast.makeText(mContext, "没有更多了", Toast.LENGTH_SHORT).show(); return; } if (TextUtils.isEmpty(MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE))) { //如果是空的,就是没选择过年纪。然后给个默认的一年级 //PRESCHOOL,FIRST_GRADE,SECOND_GRADE,THIRD_GRADE,FOURTH_GRADE // MMKVUtil.getInstance().encode(MMKVEncodeKey.USER_GRADE, "FIRST_GRADE"); } String grade = MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE); if (TextUtils.isEmpty(grade)) { grade = EfunboxUtil.getEnumByCNGrade("一年级"); } if (Consts.getmConstsUserBean() == null) { grade = EfunboxUtil.getEnumByCNGrade("一年级"); } mModel.getRecommendList(mView.getActivity(), grade, mPageIndex, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { HttpResultBean> bean = info.getRetDetail(new TypeToken>>() { }.getType()); mAdapter.addMored(bean.getData().getList()); // mDataList.addAll(bean.getData().getList()); mTotalSize = Integer.valueOf(bean.getData().getTotalSize()); mView.getRootView().post(new Runnable() { @Override public void run() { mAdapter.notifyDataSetChanged(); mPageIndex++; mView.getRootView().setVisibility(View.VISIBLE); mView.showFirstIntoView(); } }); } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("获取推荐列表失败:" + info.getRetDetail()); Logger.e("info.getUrl():" + info.getUrl()); } }); } @Override public void doFavorites(UserRecordBean.UserRead userRead) { Map map = new HashMap<>(); map.put("targetCode", userRead.getId()); String json = ((BaseActivity) mView.getActivity()).getGson().toJson(map); mModel.doFavorites(mView.getActivity(), json, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); if (bean.getData().getStatus().equals("DEL")) { mDataList.get(mCurrentPosition).setFavorites(false); mDataList.get(mCurrentPosition).setFavoritesBean(null); if (Consts.isIsNeedRemoveBR()) { Intent intent = new Intent(BackPageReceiver.BACK_HOME_REMOVE_VIDEO_ITEM); intent.putExtra("removePosition", String.valueOf(mCurrentPosition)); mContext.sendBroadcast(intent); } mView.setFavorites(false); } else if (bean.getData().getStatus().equals("NORMAL")) { mDataList.get(mCurrentPosition).setFavorites(true); mDataList.get(mCurrentPosition).setFavoritesBean(null); mView.setFavorites(true); if (Consts.isIsNeedRemoveBR()) { Intent intent = new Intent(BackPageReceiver.BACK_HOME_ADD_VIDEO_ITEM); intent.putExtra("addPosition", String.valueOf(mCurrentPosition)); mContext.sendBroadcast(intent); } } } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("收藏/取消收藏接口失败:" + info.getRetDetail()); } }); } @Override public void doLike(UserRecordBean.UserRead userRead) { mModel.doLick(mView.getActivity(), userRead.getId(), new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); mView.setLikes(bean.getData()); } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("failure---info.getRetDetail:" + info.getRetDetail()); } }); } @Override public void activityDestory() { mDataList = null; mAdapter = null; Jzvd.releaseAllVideos(); Jzvd.backPress(); } @Override public void getRecordInfoById(String id) { if (mView == null) { Logger.e("mView==null了"); Logger.e("activityName==" + intoPage); Logger.e("loadtype:" + loadType); return; } mModel.getRecordInfoById(mView.getActivity(), id, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); Logger.e("mCurrentPosition:" + mCurrentPosition); mDataList.set(mCurrentPosition, bean.getData()); mView.getRootView().post(new Runnable() { @Override public void run() { mAdapter.notifyDataSetChanged(); } }); } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("获取单独的失敗了:" + info.getRetDetail()); } }); } @Override public void getMyFollowAllVideo() { if (mDataList != null && mDataList.size() >= mTotalSize) { loadOver = true; // Toast.makeText(mContext, "没有更多了", Toast.LENGTH_SHORT).show(); return; } mModel.getMyFollowAllVideo(mView.getActivity(), mPageIndex, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { HttpResultBean> bean = info.getRetDetail(new TypeToken>>() { }.getType()); mAdapter.addMored(bean.getData().getList()); // mDataList.addAll(bean.getData().getList()); mTotalSize = Integer.valueOf(bean.getData().getTotalSize()); mView.getRootView().post(new Runnable() { @Override public void run() { mAdapter.notifyDataSetChanged(); mPageIndex++; mView.getRootView().setVisibility(View.VISIBLE); mView.showFirstIntoView(); } }); } @Override public void onFailure(HttpInfo info) throws IOException { } }); } private void autoPlayVideo(RecyclerView rv) { if (rv == null || rv.getChildAt(0) == null) { return; } //获取当前显示的View 的数据 int childCount = rv.getChildCount(); //获取最后一具 Item 对应的View View childAt = rv.getChildAt(childCount - 1); //获取当前军舰中显示的最后一个 Item 的位置 Postion int childLayoutPosition = rv.getChildLayoutPosition(childAt); mView.setTopStatus(mDataList.get(childLayoutPosition)); 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() { if (mCurrentPosition >= mTotalSize - 1) { Toast.makeText(mView.getActivity(), "全部播放完成", Toast.LENGTH_SHORT).show(); // mView.getActivity().finish(); return; } scrollToNextFunction(rv, true); } @Override public void onError(int what, int extra) { } @Override public void onInfo(int what, int extra) { } }); } } } public 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() - 1) { if (needScroll) { rv.smoothScrollToPosition(childLayoutPosition + 1); } } else { // Toast.makeText(this, "已滑动到底部了", Toast.LENGTH_LONG).show(); // CToast.makeText(mView.getActivity(), "滑动到最后一个啦", 3000).show(); Logger.e("loadOver:" + loadOver); if (loadOver) { return; } switch (loadType) { case 0: getRecommendDataList(); break; case 1: getMyFollowAllVideo(); break; case 2: break; } } } public void scrollToUpFunction(RecyclerView rv) { //获取当前显示的View 的数据 Logger.e("mCurrentPosition:" + mCurrentPosition); if (mCurrentPosition > 0) { rv.smoothScrollToPosition(mCurrentPosition - 1); mCurrentPosition = mCurrentPosition - 1; } else if (mCurrentPosition == 0) { Toast.makeText(mContext, "已经是第一个了", Toast.LENGTH_SHORT).show(); } } }