LearnDetailExoActivity.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package com.dlc.exam.ui.learn;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Looper;
  6. import android.os.Message;
  7. import android.util.Log;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import androidx.annotation.NonNull;
  11. import androidx.annotation.Nullable;
  12. import com.blankj.utilcode.util.LogUtils;
  13. import com.dlc.exam.common.CommonUtils;
  14. import com.dlc.exam.databinding.ActivityLearnDetailExoBinding;
  15. import com.dlc.exam.ui.common.BaseCountDownActivity;
  16. import com.dlc.exam.ui.learn.test.ClassTestActivity;
  17. import com.google.android.exoplayer2.ExoPlayer;
  18. import com.google.android.exoplayer2.MediaItem;
  19. import com.google.android.exoplayer2.PlaybackException;
  20. import com.google.android.exoplayer2.Player;
  21. import com.google.gson.Gson;
  22. import com.rc.httpcore.HttpConfig;
  23. import com.rc.httpcore.client.ApiRepository;
  24. import com.rc.httpcore.vo.request.ExamLearnReq;
  25. import io.reactivex.disposables.Disposable;
  26. public class LearnDetailExoActivity extends BaseCountDownActivity<ActivityLearnDetailExoBinding> implements View.OnClickListener {
  27. private ActivityLearnDetailExoBinding binding;
  28. private ExoPlayer exoPlayer;
  29. private long learnTimeSecond = 0L;
  30. private LearnChapterBean learnChapterBean;
  31. private boolean learnCompleted = false;// 是否已完成学习
  32. @NonNull
  33. @Override
  34. protected ActivityLearnDetailExoBinding createViewBinding() {
  35. return ActivityLearnDetailExoBinding.inflate(LayoutInflater.from(this));
  36. }
  37. @Override
  38. protected void initViews(@Nullable Bundle savedInstanceState) {
  39. super.initViews(savedInstanceState);
  40. binding = getViewBinding();
  41. Intent getIntent = getIntent();
  42. if (null != getIntent && getIntent.hasExtra("Chapter")) {
  43. learnChapterBean = getIntent.getParcelableExtra("Chapter");
  44. boolean relearn = getIntent.getBooleanExtra("relearn", false);
  45. if (null == learnChapterBean) {
  46. finish();
  47. return;
  48. }
  49. binding.back.setOnClickListener(this);
  50. binding.titleText.setText(learnChapterBean.title);
  51. // 是否完成学习
  52. binding.learnCompleted.setVisibility(relearn ? View.GONE : View.VISIBLE);
  53. binding.learnCompleted.setOnClickListener(this);
  54. // 直接播放
  55. initExo();
  56. } else {
  57. finish();
  58. }
  59. }
  60. private Handler cdHandler = new Handler(Looper.getMainLooper()) {
  61. @Override
  62. public void handleMessage(@NonNull Message msg) {
  63. super.handleMessage(msg);
  64. learnTimeSecond++;
  65. binding.learnDuration.setText("已学习时长:" + CommonUtils.INSTANCE.formatLearnTime(learnTimeSecond));
  66. sendEmptyMessageDelayed(1, 1000);
  67. if (learnTimeSecond >= learnChapterBean.duration) {
  68. binding.learnCompleted.setEnabled(true);
  69. }
  70. }
  71. };
  72. /**
  73. * 播放视频
  74. */
  75. private void initExo() {
  76. String url = learnChapterBean.chapterData;
  77. if (!url.startsWith("http")) {
  78. url = HttpConfig.Companion.getAPI_BASE_URL() + url;
  79. }
  80. LogUtils.d("Jayce", url);
  81. // url = "https://media.wxzxzj.com/the_garden_of_words_trailer_english__1080p.m3u8";
  82. exoPlayer = new ExoPlayer.Builder(this).build();
  83. exoPlayer.addListener(new Player.Listener() {
  84. /**
  85. * 播放状态改变
  86. * @param playbackState The new playback {@link Player.State state}.
  87. */
  88. @Override
  89. public void onPlaybackStateChanged(int playbackState) {
  90. Player.Listener.super.onPlaybackStateChanged(playbackState);
  91. // 播放
  92. if (playbackState == Player.STATE_READY && exoPlayer.getPlayWhenReady()) {
  93. // 开始学习
  94. startLearn();
  95. }
  96. }
  97. /**
  98. * 播放出错
  99. * @param error The error.
  100. */
  101. @Override
  102. public void onPlayerError(PlaybackException error) {
  103. Player.Listener.super.onPlayerError(error);
  104. binding.errTV.setText("播放异常:" + error.errorCode + "," + error.getMessage());
  105. Log.e("Jayce", error.errorCode + "," + error.getMessage());
  106. }
  107. });
  108. MediaItem mediaItem = MediaItem.fromUri(url);
  109. exoPlayer.setMediaItem(mediaItem);
  110. binding.styledPlayerView.setUseController(false);
  111. binding.styledPlayerView.setPlayer(exoPlayer);
  112. exoPlayer.prepare();
  113. exoPlayer.play();
  114. }
  115. @Override
  116. protected void onPause() {
  117. super.onPause();
  118. if (exoPlayer != null) {
  119. exoPlayer.pause();
  120. }
  121. }
  122. @Override
  123. protected void onResume() {
  124. super.onResume();
  125. if (exoPlayer != null) {
  126. exoPlayer.play();
  127. }
  128. }
  129. @Override
  130. protected void onDestroy() {
  131. cdHandler.removeMessages(1);
  132. cdHandler.removeCallbacksAndMessages(null);
  133. cdHandler = null;
  134. super.onDestroy();
  135. if (exoPlayer != null) {
  136. exoPlayer.release();
  137. }
  138. }
  139. @Override
  140. public void onClick(View v) {
  141. if (v.getId() == binding.back.getId()) {
  142. onBackPressed();
  143. }
  144. // 完成学习
  145. else if (v.getId() == binding.learnCompleted.getId()) {
  146. learnTimeSecond = 0L;
  147. cdHandler.removeMessages(1);
  148. finishLearn();
  149. }
  150. }
  151. /**
  152. * 完成学习
  153. */
  154. private void finishLearn() {
  155. showLoading("保存中...", false);
  156. ExamLearnReq examLearnReq = new ExamLearnReq();
  157. examLearnReq.chapterId = learnChapterBean.chapterId;
  158. examLearnReq.courseId = learnChapterBean.courseId;
  159. Log.d("Jayce", "完成学习:" + new Gson().toJson(examLearnReq));
  160. Disposable disposable = ApiRepository.INSTANCE.examLearnFinish(examLearnReq).subscribe(learnBonusBean -> {
  161. dismissLoading();
  162. Log.d("Jayce", new Gson().toJson(learnBonusBean));
  163. learnCompleted = true;
  164. new LearnCompletedDialog(LearnDetailExoActivity.this, learnBonusBean, false, learnChapterBean.assessStatus, () -> {
  165. binding.learnCompleted.setEnabled(false);
  166. // 课后考核
  167. if (learnChapterBean.assessStatus) {
  168. Intent intent = new Intent(LearnDetailExoActivity.this, ClassTestActivity.class);
  169. intent.putExtra("chapterId", learnChapterBean.chapterId);
  170. startActivity(intent);
  171. setResult(RESULT_OK);
  172. }
  173. finish();
  174. return null;
  175. }).show();
  176. }, throwable -> {
  177. dismissLoading();
  178. throwable.printStackTrace();
  179. showNetError(throwable);
  180. });
  181. addDisposable(disposable);
  182. }
  183. /**
  184. * 开始学习
  185. */
  186. private void startLearn() {
  187. showLoading("加载中...", false);
  188. ExamLearnReq examLearnReq = new ExamLearnReq();
  189. examLearnReq.chapterId = learnChapterBean.chapterId;
  190. examLearnReq.courseId = learnChapterBean.courseId;
  191. Log.d("Jayce", "开始学习:" + new Gson().toJson(examLearnReq));
  192. Disposable disposable = ApiRepository.INSTANCE.examLearnStart(examLearnReq).subscribe(aBoolean -> {
  193. dismissLoading();
  194. learnTimeSecond = 0L;
  195. cdHandler.sendEmptyMessage(1);
  196. }, throwable -> {
  197. dismissLoading();
  198. throwable.printStackTrace();
  199. showNetError(throwable);
  200. });
  201. addDisposable(disposable);
  202. }
  203. @Override
  204. public void onBackPressed() {
  205. if (learnCompleted) {
  206. setResult(RESULT_OK);
  207. }
  208. super.onBackPressed();
  209. }
  210. }