RecordPresenter.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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.Bundle;
  7. import android.os.IBinder;
  8. import android.view.View;
  9. import android.widget.FrameLayout;
  10. import android.widget.Toast;
  11. import com.chivox.aiengine.EvalResult;
  12. import com.edufound.reader.apiserver.UserApiServerImpl;
  13. import com.edufound.reader.base.BasePresenter;
  14. import com.edufound.reader.bean.ChannelCodeEnum;
  15. import com.edufound.reader.bean.HttpResultBean;
  16. import com.edufound.reader.bean.RecordResultBean;
  17. import com.edufound.reader.bean.ThroughType;
  18. import com.edufound.reader.bean.UserEventEnum;
  19. import com.edufound.reader.bean.UserRecordBean;
  20. import com.edufound.reader.botsdk.BotRegisterListener;
  21. import com.edufound.reader.contract.RecordContract;
  22. import com.edufound.reader.cusview.RvListJzvdStd;
  23. import com.edufound.reader.listener.PopupRecordStatusListener;
  24. import com.edufound.reader.model.RecordModel;
  25. import com.edufound.reader.popwindow.PopWindowUtil;
  26. import com.edufound.reader.services.RecordServices;
  27. import com.edufound.reader.util.Consts;
  28. import com.edufound.reader.util.DataCleanManager;
  29. import com.edufound.reader.util.GlideUtils;
  30. import com.edufound.reader.util.ThroughUtil;
  31. import com.edufound.reader.videoutil.JZMediaIjk;
  32. import com.google.gson.reflect.TypeToken;
  33. import com.okhttplib.HttpInfo;
  34. import com.okhttplib.callback.Callback;
  35. import com.orhanobut.logger.Logger;
  36. import org.json.JSONException;
  37. import org.json.JSONObject;
  38. import java.io.IOException;
  39. import cn.jzvd.JZDataSource;
  40. import cn.jzvd.Jzvd;
  41. import cn.jzvd.JzvdStd;
  42. public class RecordPresenter extends BasePresenter<RecordContract.View> implements RecordContract.Presenter {
  43. RecordServices mRecordServices;
  44. RecordModel mModel;
  45. String mReadId = null;
  46. String exampleUrl = "";
  47. String recordUrl = "";
  48. UserRecordBean.UserRead mRecordUserRead;
  49. //READ是用户在读,example是厅官方
  50. String playType = "EXAMPLE";
  51. String backModel = "";
  52. UserApiServerImpl mUserApi;
  53. boolean isRecording = false;
  54. public RecordPresenter() {
  55. this.mModel = new RecordModel();
  56. mUserApi = new UserApiServerImpl();
  57. }
  58. @Override
  59. public void createVideoPlayer() {
  60. mView.showLoading();
  61. mView.getJZVideoView().setVideoCallBack(new RvListJzvdStd.VideoCallBack() {
  62. @Override
  63. public void onComplete() {
  64. onVideoCompletion();
  65. }
  66. @Override
  67. public void onError(int what, int extra) {
  68. onVideoError(what, extra);
  69. }
  70. @Override
  71. public void onInfo(int what, int extra) {
  72. onVideoInfoListener(what, extra);
  73. }
  74. @Override
  75. public void onPrepared() {
  76. }
  77. });
  78. }
  79. @Override
  80. public void getReadInfo(Intent intent) {
  81. if (ThroughUtil.mThroughTypeBean != null && ThroughUtil.mThroughTypeBean.getmThroughType().equals(ThroughType.TYPEA.getTypeCode())) {
  82. mReadId = ThroughUtil.mThroughTypeBean.getExampleId();
  83. backModel = ThroughUtil.mThroughTypeBean.getBackModel();
  84. } else {
  85. Bundle bundle = intent.getBundleExtra("params_bundle");
  86. if (bundle != null) {
  87. mReadId = bundle.getString("exampleId");
  88. }
  89. }
  90. if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
  91. BotRegisterListener.uploadUsage("1", mReadId, "record", "vip");
  92. }
  93. mModel.getReadInfo(mView.getActivity(), mReadId, new Callback() {
  94. @Override
  95. public void onSuccess(HttpInfo info) throws IOException {
  96. HttpResultBean<UserRecordBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserRecordBean>>() {
  97. }.getType());
  98. mRecordUserRead = bean.getData().getUserRead();
  99. exampleUrl = mRecordUserRead.getVideoPath();
  100. recordUrl = mRecordUserRead.getOriginVideo();
  101. GlideUtils.loadImageSizeKipMemoryCache(mView.getActivity(), mRecordUserRead.getCoverImg(), mView.getJZVideoView().posterImageView);
  102. mView.getJZVideoView().setUp(new JZDataSource(exampleUrl), JzvdStd.SCREEN_FULLSCREEN, JZMediaIjk.class, mRecordUserRead.getId());
  103. }
  104. @Override
  105. public void onFailure(HttpInfo info) throws IOException {
  106. Logger.e("获取录音的音频视频失败参数:" + info.getParams());
  107. Logger.e("获取录音的音频视频失败:" + info.getRetDetail());
  108. }
  109. });
  110. }
  111. @Override
  112. public String getExampleUrl() {
  113. return exampleUrl;
  114. }
  115. @Override
  116. public String getRecordUrl() {
  117. return recordUrl;
  118. }
  119. @Override
  120. public void clickExampleUI() {
  121. mUserApi.postUserEvent(mView.getActivity(), UserEventEnum.EVENT_EXAMPLE.getEvent());
  122. playType = "EXAMPLE";
  123. initVideoPlayer(exampleUrl);
  124. // mView.getJZVideoView().posterImageView.setVisibility(View.INVISIBLE);
  125. mView.getJZVideoView().setHideAllUI(false);
  126. mView.getJZVideoView().startVideoAfterPreloading();
  127. }
  128. @Override
  129. public String getBackModel() {
  130. return backModel;
  131. }
  132. @Override
  133. public void initVideoPlayer(String url) {
  134. mView.getJZVideoView().setUp(new JZDataSource(url), JzvdStd.SCREEN_FULLSCREEN, JZMediaIjk.class, mReadId);
  135. }
  136. @Override
  137. public void onVideoCompletion() {
  138. if (playType.equals("READ")) {
  139. mView.refRecordStatus();
  140. }
  141. }
  142. @Override
  143. public void onVideoError(int what, int extra) {
  144. switch (what) {
  145. case -10000:
  146. // mVideoHandler.sendEmptyMessage(DISCONNECT_NETWORK);
  147. // Toast.makeText(mView.getActivity(), "网络出现异常", Toast.LENGTH_SHORT).show();
  148. // CusToast.getInstance(mView.getActivity()).show("网络出现异常",2000);
  149. Toast.makeText(mView.getActivity(), "网络出现异常", Toast.LENGTH_SHORT).show();
  150. mView.getActivity().finish();
  151. break;
  152. default:
  153. mView.getJZVideoView().pauseVideo();
  154. mView.getJZVideoView().reset();
  155. mView.getJZVideoView().onStatePreparingPlaying();
  156. Toast.makeText(mView.getActivity(), "视频异常--what:" + what + "--extra:" + extra, Toast.LENGTH_SHORT).show();
  157. // CusToast.getInstance(mView.getActivity()).show("视频异常--what:" + what + "--extra:" + extra,2000);
  158. mView.getActivity().finish();
  159. break;
  160. }
  161. }
  162. @Override
  163. public void onVideoInfoListener(int what, int extra) {
  164. if (mView == null || mView.getJZVideoView() == null) {
  165. return;
  166. }
  167. switch (what) {
  168. case Jzvd.STATE_PREPARING_PLAYING:
  169. //已经开始播放了
  170. if (playType.equals("READ") && (mRecordServices.getIsRecording() == false)) {
  171. mRecordServices.startRecord(mView.getActivity(), mRecordUserRead.getId(), mRecordUserRead.getLessonText());
  172. mView.getJZVideoView().setCanPause(false);
  173. }
  174. break;
  175. }
  176. }
  177. @Override
  178. public void addVideoController(FrameLayout frame) {
  179. // mVideoController = (FrameLayout) LayoutInflater.from(mView.getActivity()).inflate(R.layout.player_controller, null);
  180. // frame.addView(mVideoController);
  181. // frame.addView(new FullScreenVideoController(mView.getActivity()).getController());
  182. }
  183. @Override
  184. public void startRecord() {
  185. mUserApi.postUserEvent(mView.getActivity(), UserEventEnum.EVENT_READING.getEvent());
  186. mView.getJZVideoView().setHideAllUI(false);
  187. mView.hasShowOtherUI(View.INVISIBLE);
  188. playType = "READ";
  189. initVideoPlayer(recordUrl);
  190. mView.getJZVideoView().startVideo();
  191. }
  192. @Override
  193. public void stopRecord() {
  194. mView.hasShowOtherUI(View.VISIBLE);
  195. mView.getJZVideoView().setHideAllUI(true);
  196. mView.getJZVideoView().reset();
  197. mRecordServices.stopRecord();
  198. // mView.getJZVideoView().setCanPause(true);
  199. // initVideoPlayer(recordUrl);
  200. mView.getJZVideoView().posterImageView.setVisibility(View.VISIBLE);
  201. }
  202. @Override
  203. public void rePlayRecord() {
  204. mRecordServices.replayRecord();
  205. }
  206. @Override
  207. public void activityDestroy() {
  208. if (ThroughUtil.mThroughTypeBean != null && ThroughUtil.mThroughTypeBean.getmThroughType().equals(ThroughType.TYPEA.getTypeCode())) {
  209. ThroughUtil.mThroughTypeBean = null;
  210. }
  211. mView.getJZVideoView().pauseVideo();
  212. mRecordServices.stopRecord();
  213. mRecordServices.desrotyRecord();
  214. // Consts.getmRecordSaveFile()
  215. if (Consts.getmRecordSaveFile() != null && (!Consts.getmRecordSaveFile().equals(""))) {
  216. DataCleanManager.delFileBeforeTime(Consts.getmRecordSaveFile().getAbsolutePath().substring(0, Consts.getmRecordSaveFile().getAbsolutePath().lastIndexOf("/")), 0);
  217. }
  218. // Jzvd.releaseAllVideos();
  219. // Intent intent = new Intent(BackPageReceiver.BACK_HOME_REF_VIDEO_ITEM);
  220. //// intent.putExtra("recordId", );
  221. // mView.getActivity().sendBroadcast(intent);
  222. mView.getJZVideoView().removeAllViews();
  223. recordServicesConn = null;
  224. mRecordServices = null;
  225. System.gc();
  226. }
  227. @Override
  228. public void activityPause() {
  229. }
  230. @Override
  231. public void activityResume() {
  232. }
  233. @Override
  234. public void showRecordStatusWindow(RecordResultBean bean, UserRecordBean.UserRead userread) {
  235. PopWindowUtil.showRecordStatusWindow(mView.getActivity(), mView.getRootView(), bean, userread, new PopupRecordStatusListener() {
  236. @Override
  237. public void clickReRecord() {
  238. // Toast.makeText(mView.getActivity(), "重新录制", Toast.LENGTH_SHORT).show();
  239. PopWindowUtil.hidePopupWindow();
  240. mUserApi.postUserEvent(mView.getActivity(), UserEventEnum.EVENT_RERECORDING.getEvent());
  241. mView.startRecordStatus();
  242. }
  243. @Override
  244. public void clickUploadingErrorBtn() {
  245. // Toast.makeText(mView.getActivity(), "上传失败按钮", Toast.LENGTH_SHORT).show();
  246. }
  247. });
  248. }
  249. @Override
  250. public void bindRecordServices() {
  251. if (mRecordServices == null) {
  252. Intent intent = new Intent();
  253. intent.setClass(mView.getActivity(), RecordServices.class);
  254. mView.getActivity().bindService(intent, recordServicesConn, Context.BIND_AUTO_CREATE);
  255. }
  256. }
  257. private ServiceConnection recordServicesConn = new ServiceConnection() {
  258. @Override
  259. public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
  260. mRecordServices = ((RecordServices.RecordServicesBind) iBinder).getService();
  261. mRecordServices.initChiVox();
  262. mRecordServices.setRecordCallBack(new RecordServices.RecordCallBack() {
  263. @Override
  264. public void onRecordStart() {
  265. Logger.e("录音开始");
  266. }
  267. @Override
  268. public void onRecordResult(String tokenId, EvalResult result) {
  269. Logger.e("录音完成");
  270. try {
  271. JSONObject jsonObject = new JSONObject(result.text()).getJSONObject("result");
  272. //完全评分
  273. int overall = Integer.valueOf(jsonObject.getString("overall"));
  274. //速度
  275. int speed = Integer.valueOf(jsonObject.getJSONObject("fluency").getString("overall"));
  276. //声调
  277. int tone = Integer.valueOf(jsonObject.getString("tone"));
  278. //完整度
  279. int integrity = Integer.valueOf(jsonObject.getString("integrity"));
  280. //正确率
  281. int accuracy = Integer.valueOf(jsonObject.getString("accuracy"));
  282. mView.getJZVideoView().post(new Runnable() {
  283. @Override
  284. public void run() {
  285. showRecordStatusWindow(new RecordResultBean(overall, speed, tone, integrity, accuracy), mRecordUserRead);
  286. }
  287. });
  288. } catch (JSONException e) {
  289. e.printStackTrace();
  290. }
  291. }
  292. @Override
  293. public void onRecordCancel() {
  294. Logger.e("录音取消");
  295. }
  296. @Override
  297. public void onRecordError(String tokenId, EvalResult result) {
  298. //Toast.makeText(mView.getActivity(), "录音失败:" + result.text(), Toast.LENGTH_SHORT).show();
  299. // CusToast.getInstance(mView.getActivity()).show("录音失败", 2000);
  300. Logger.e("----------------录音失败了-------------------------");
  301. Toast.makeText(Consts.getmApplicAtion(), "录音失败", Toast.LENGTH_SHORT).show();
  302. }
  303. @Override
  304. public void onRecordStop() {
  305. Logger.e("录音停止");
  306. }
  307. });
  308. }
  309. @Override
  310. public void onServiceDisconnected(ComponentName componentName) {
  311. if (mView != null) {
  312. mRecordServices.unbindService(recordServicesConn);
  313. mView.getActivity().unbindService(recordServicesConn);
  314. }
  315. mRecordServices = null;
  316. }
  317. };
  318. }