RvListJzvdStd.java 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204
  1. package com.edufound.reader.cusview;
  2. import android.app.AlertDialog;
  3. import android.app.Dialog;
  4. import android.content.BroadcastReceiver;
  5. import android.content.Context;
  6. import android.content.DialogInterface;
  7. import android.content.Intent;
  8. import android.content.IntentFilter;
  9. import android.graphics.Color;
  10. import android.media.AudioManager;
  11. import android.net.ConnectivityManager;
  12. import android.util.AttributeSet;
  13. import android.util.Log;
  14. import android.view.GestureDetector;
  15. import android.view.Gravity;
  16. import android.view.LayoutInflater;
  17. import android.view.MotionEvent;
  18. import android.view.View;
  19. import android.view.ViewGroup;
  20. import android.view.Window;
  21. import android.view.WindowManager;
  22. import android.widget.ImageView;
  23. import android.widget.LinearLayout;
  24. import android.widget.PopupWindow;
  25. import android.widget.ProgressBar;
  26. import android.widget.SeekBar;
  27. import android.widget.TextView;
  28. import android.widget.Toast;
  29. import com.edufound.reader.R;
  30. import com.edufound.reader.bean.ChannelCodeEnum;
  31. import com.edufound.reader.bean.HttpResultBean;
  32. import com.edufound.reader.bean.PlayLogBean;
  33. import com.edufound.reader.botsdk.BotRegisterListener;
  34. import com.edufound.reader.util.Consts;
  35. import com.edufound.reader.util.OkHttpClient;
  36. import com.edufound.reader.util.SizeUtils;
  37. import com.google.gson.reflect.TypeToken;
  38. import com.okhttplib.HttpInfo;
  39. import com.okhttplib.callback.Callback;
  40. import com.orhanobut.logger.Logger;
  41. import java.io.IOException;
  42. import java.text.SimpleDateFormat;
  43. import java.util.ArrayDeque;
  44. import java.util.Date;
  45. import java.util.Timer;
  46. import java.util.TimerTask;
  47. import cn.jzvd.JZDataSource;
  48. import cn.jzvd.JZUtils;
  49. import cn.jzvd.Jzvd;
  50. public class RvListJzvdStd extends Jzvd {
  51. public static long LAST_GET_BATTERYLEVEL_TIME = 0;
  52. public static int LAST_GET_BATTERYLEVEL_PERCENT = 70;
  53. protected static Timer DISMISS_CONTROL_VIEW_TIMER;
  54. public ImageView backButton;
  55. public ProgressBar bottomProgressBar, loadingProgressBar;
  56. public TextView titleTextView;
  57. public ImageView posterImageView;
  58. public ImageView tinyBackImageView;
  59. public LinearLayout batteryTimeLayout;
  60. public ImageView batteryLevel;
  61. public TextView videoCurrentTime;
  62. public TextView replayTextView;
  63. public TextView clarity;
  64. public PopupWindow clarityPopWindow;
  65. public TextView mRetryBtn;
  66. public LinearLayout mRetryLayout;
  67. public BroadcastReceiver battertReceiver = new BroadcastReceiver() {
  68. public void onReceive(Context context, Intent intent) {
  69. String action = intent.getAction();
  70. if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
  71. int level = intent.getIntExtra("level", 0);
  72. int scale = intent.getIntExtra("scale", 100);
  73. int percent = level * 100 / scale;
  74. LAST_GET_BATTERYLEVEL_PERCENT = percent;
  75. setBatteryLevel();
  76. try {
  77. jzvdContext.unregisterReceiver(battertReceiver);
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. }
  83. };
  84. protected Dialog mVolumeDialog;
  85. protected ProgressBar mDialogVolumeProgressBar;
  86. protected TextView mDialogVolumeTextView;
  87. protected ImageView mDialogVolumeImageView;
  88. protected Dialog mBrightnessDialog;
  89. protected ProgressBar mDialogBrightnessProgressBar;
  90. protected TextView mDialogBrightnessTextView;
  91. protected boolean mIsWifi;
  92. protected LinearLayout mLoadingLayout;
  93. public BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
  94. @Override
  95. public void onReceive(Context context, Intent intent) {
  96. if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
  97. boolean isWifi = JZUtils.isWifiConnected(context);
  98. if (mIsWifi == isWifi) return;
  99. mIsWifi = isWifi;
  100. if (!mIsWifi && !WIFI_TIP_DIALOG_SHOWED && state == STATE_PLAYING) {
  101. startButton.performClick();
  102. showWifiDialog();
  103. }
  104. }
  105. }
  106. };
  107. protected ArrayDeque<Runnable> delayTask = new ArrayDeque<>();
  108. public VideoCallBack mCallBack;
  109. private boolean hideAllUI = false;
  110. public boolean canPause = true;
  111. private String playLogId = "";
  112. public RvListJzvdStd(Context context) {
  113. super(context);
  114. }
  115. public RvListJzvdStd(Context context, AttributeSet attrs) {
  116. super(context, attrs);
  117. }
  118. @Override
  119. public void init(Context context) {
  120. super.init(context);
  121. batteryTimeLayout = findViewById(R.id.battery_time_layout);
  122. bottomProgressBar = findViewById(R.id.bottom_progress);
  123. titleTextView = findViewById(R.id.title);
  124. backButton = findViewById(R.id.back);
  125. posterImageView = findViewById(R.id.poster);
  126. loadingProgressBar = findViewById(R.id.loading);
  127. mLoadingLayout = findViewById(R.id.loading_layout);
  128. tinyBackImageView = findViewById(R.id.back_tiny);
  129. batteryLevel = findViewById(R.id.battery_level);
  130. videoCurrentTime = findViewById(R.id.video_current_time);
  131. replayTextView = findViewById(R.id.replay_text);
  132. clarity = findViewById(R.id.clarity);
  133. mRetryBtn = findViewById(R.id.retry_btn);
  134. mRetryLayout = findViewById(R.id.retry_layout);
  135. if (batteryTimeLayout == null) {
  136. batteryTimeLayout = new LinearLayout(context);
  137. }
  138. if (bottomProgressBar == null) {
  139. bottomProgressBar = new ProgressBar(context);
  140. }
  141. if (titleTextView == null) {
  142. titleTextView = new TextView(context);
  143. }
  144. if (backButton == null) {
  145. backButton = new ImageView(context);
  146. }
  147. if (posterImageView == null) {
  148. posterImageView = new ImageView(context);
  149. }
  150. if (loadingProgressBar == null) {
  151. loadingProgressBar = new ProgressBar(context);
  152. }
  153. if (tinyBackImageView == null) {
  154. tinyBackImageView = new ImageView(context);
  155. }
  156. if (batteryLevel == null) {
  157. batteryLevel = new ImageView(context);
  158. }
  159. if (videoCurrentTime == null) {
  160. videoCurrentTime = new TextView(context);
  161. }
  162. if (replayTextView == null) {
  163. replayTextView = new TextView(context);
  164. }
  165. if (clarity == null) {
  166. clarity = new TextView(context);
  167. }
  168. if (mRetryBtn == null) {
  169. mRetryBtn = new TextView(context);
  170. }
  171. if (mRetryLayout == null) {
  172. mRetryLayout = new LinearLayout(context);
  173. }
  174. posterImageView.setOnClickListener(this);
  175. backButton.setOnClickListener(this);
  176. tinyBackImageView.setOnClickListener(this);
  177. clarity.setOnClickListener(this);
  178. mRetryBtn.setOnClickListener(this);
  179. }
  180. public void setUp(JZDataSource jzDataSource, int screen, Class mediaInterfaceClass, String readId) {
  181. if ((System.currentTimeMillis() - gobakFullscreenTime) < 200) {
  182. return;
  183. }
  184. if ((System.currentTimeMillis() - gotoFullscreenTime) < 200) {
  185. return;
  186. }
  187. super.setUp(jzDataSource, screen, mediaInterfaceClass);
  188. playLogId = readId;
  189. titleTextView.setText(jzDataSource.title);
  190. setScreen(screen);
  191. }
  192. @Override
  193. public void changeUrl(JZDataSource jzDataSource, long seekToInAdvance) {
  194. super.changeUrl(jzDataSource, seekToInAdvance);
  195. titleTextView.setText(jzDataSource.title);
  196. }
  197. public void setCanPause(boolean canpause) {
  198. this.canPause = canpause;
  199. }
  200. public void changeStartButtonSize(int size) {
  201. ViewGroup.LayoutParams lp = startButton.getLayoutParams();
  202. lp.height = size;
  203. lp.width = size;
  204. lp = loadingProgressBar.getLayoutParams();
  205. lp.height = size;
  206. lp.width = size;
  207. }
  208. @Override
  209. public int getLayoutId() {
  210. return R.layout.cusjzplayer_controller;
  211. }
  212. @Override
  213. public void onStateNormal() {
  214. super.onStateNormal();
  215. changeUiToNormal();
  216. }
  217. @Override
  218. public void onStatePreparing() {
  219. super.onStatePreparing();
  220. changeUiToPreparing();
  221. }
  222. public void onStatePreparingPlaying() {
  223. super.onStatePreparingPlaying();
  224. changeUIToPreparingPlaying();
  225. }
  226. public void onStatePreparingChangeUrl() {
  227. super.onStatePreparingChangeUrl();
  228. changeUIToPreparingChangeUrl();
  229. }
  230. @Override
  231. public void onStatePlaying() {
  232. super.onStatePlaying();
  233. changeUiToPlayingClear();
  234. }
  235. @Override
  236. public void onStatePause() {
  237. super.onStatePause();
  238. changeUiToPauseShow();
  239. cancelDismissControlViewTimer();
  240. }
  241. @Override
  242. public void onStateError() {
  243. super.onStateError();
  244. changeUiToError();
  245. }
  246. @Override
  247. public void onStateAutoComplete() {
  248. super.onStateAutoComplete();
  249. changeUiToComplete();
  250. cancelDismissControlViewTimer();
  251. // bottomProgressBar.setProgress(100);
  252. }
  253. @Override
  254. public void startVideo() {
  255. super.startVideo();
  256. registerWifiListener(getApplicationContext());
  257. }
  258. public void pauseVideo() {
  259. startButton.performClick();
  260. }
  261. public void startVideoPauseEnd() {
  262. startButton.performClick();
  263. }
  264. public JZDataSource getjzDataSource() {
  265. return jzDataSource;
  266. }
  267. /**
  268. * 双击
  269. */
  270. protected GestureDetector gestureDetector = new GestureDetector(getContext().getApplicationContext(), new GestureDetector.SimpleOnGestureListener() {
  271. @Override
  272. public boolean onDoubleTap(MotionEvent e) {
  273. if (state == STATE_PLAYING || state == STATE_PAUSE) {
  274. Log.d(TAG, "doublClick [" + this.hashCode() + "] ");
  275. startButton.performClick();
  276. }
  277. return super.onDoubleTap(e);
  278. }
  279. @Override
  280. public boolean onSingleTapConfirmed(MotionEvent e) {
  281. // if (!mChangePosition && !mChangeVolume) {
  282. // onClickUiToggle();
  283. // }
  284. return super.onSingleTapConfirmed(e);
  285. }
  286. @Override
  287. public void onLongPress(MotionEvent e) {
  288. super.onLongPress(e);
  289. }
  290. });
  291. @Override
  292. public boolean onTouch(View v, MotionEvent event) {
  293. if (event.getAction() == MotionEvent.ACTION_UP) {
  294. if (!canPause) {
  295. return true;
  296. }
  297. int id = v.getId();
  298. if (id == R.id.surface_container) {
  299. switch (event.getAction()) {
  300. case MotionEvent.ACTION_DOWN:
  301. // startButton.performClick();
  302. break;
  303. case MotionEvent.ACTION_MOVE:
  304. break;
  305. case MotionEvent.ACTION_UP:
  306. if (canPause) {
  307. startButton.performClick();
  308. }
  309. // startDismissControlViewTimer();
  310. // if (mChangePosition) {
  311. // long duration = getDuration();
  312. // int progress = (int) (mSeekTimePosition * 100 / (duration == 0 ? 1 : duration));
  313. // bottomProgressBar.setProgress(progress);
  314. // }
  315. break;
  316. }
  317. // gestureDetector.onTouchEvent(event);
  318. } else if (id == R.id.bottom_seek_progress) {
  319. switch (event.getAction()) {
  320. case MotionEvent.ACTION_DOWN:
  321. // cancelDismissControlViewTimer();
  322. break;
  323. case MotionEvent.ACTION_UP:
  324. // startDismissControlViewTimer();
  325. break;
  326. }
  327. }
  328. return super.onTouch(v, event);
  329. }
  330. return true;
  331. }
  332. @Override
  333. public void onClick(View v) {
  334. super.onClick(v);
  335. int i = v.getId();
  336. if (i == R.id.poster) {
  337. // clickPoster();
  338. } else if (i == R.id.surface_container) {
  339. // clickSurfaceContainer();
  340. // if (clarityPopWindow != null) {
  341. // clarityPopWindow.dismiss();
  342. // }
  343. } else if (i == R.id.back) {
  344. // clickBack();
  345. } else if (i == R.id.back_tiny) {
  346. // clickBackTiny();
  347. } else if (i == R.id.clarity) {
  348. // clickClarity();
  349. } else if (i == R.id.retry_btn) {
  350. // clickRetryBtn();
  351. }
  352. }
  353. protected void clickRetryBtn() {
  354. if (jzDataSource.urlsMap.isEmpty() || jzDataSource.getCurrentUrl() == null) {
  355. Toast.makeText(jzvdContext, getResources().getString(R.string.no_url), Toast.LENGTH_SHORT).show();
  356. return;
  357. }
  358. if (!jzDataSource.getCurrentUrl().toString().startsWith("file") && !
  359. jzDataSource.getCurrentUrl().toString().startsWith("/") &&
  360. !JZUtils.isWifiConnected(jzvdContext) && !WIFI_TIP_DIALOG_SHOWED) {
  361. showWifiDialog();
  362. return;
  363. }
  364. seekToInAdvance = mCurrentPosition;
  365. startVideo();
  366. }
  367. protected void clickClarity() {
  368. onCLickUiToggleToClear();
  369. LayoutInflater inflater = (LayoutInflater) jzvdContext
  370. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  371. final LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.jz_layout_clarity, null);
  372. OnClickListener mQualityListener = v1 -> {
  373. int index = (int) v1.getTag();
  374. // this.seekToInAdvance = getCurrentPositionWhenPlaying();
  375. jzDataSource.currentUrlIndex = index;
  376. // onStatePreparingChangeUrl();
  377. changeUrl(jzDataSource, getCurrentPositionWhenPlaying());
  378. clarity.setText(jzDataSource.getCurrentKey().toString());
  379. for (int j = 0; j < layout.getChildCount(); j++) {//设置点击之后的颜色
  380. if (j == jzDataSource.currentUrlIndex) {
  381. ((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor("#fff85959"));
  382. } else {
  383. ((TextView) layout.getChildAt(j)).setTextColor(Color.parseColor("#ffffff"));
  384. }
  385. }
  386. if (clarityPopWindow != null) {
  387. clarityPopWindow.dismiss();
  388. }
  389. };
  390. for (int j = 0; j < jzDataSource.urlsMap.size(); j++) {
  391. String key = jzDataSource.getKeyFromDataSource(j);
  392. TextView clarityItem = (TextView) View.inflate(jzvdContext, R.layout.jz_layout_clarity_item, null);
  393. clarityItem.setText(key);
  394. clarityItem.setTag(j);
  395. layout.addView(clarityItem, j);
  396. clarityItem.setOnClickListener(mQualityListener);
  397. if (j == jzDataSource.currentUrlIndex) {
  398. clarityItem.setTextColor(Color.parseColor("#fff85959"));
  399. }
  400. }
  401. clarityPopWindow = new PopupWindow(layout, JZUtils.dip2px(jzvdContext, 240), LayoutParams.MATCH_PARENT, true);
  402. clarityPopWindow.setContentView(layout);
  403. clarityPopWindow.setAnimationStyle(R.style.pop_animation);
  404. clarityPopWindow.showAtLocation(textureViewContainer, Gravity.END, 0, 0);
  405. // int offsetX = clarity.getMeasuredWidth() / 3;
  406. // int offsetY = clarity.getMeasuredHeight() / 3;
  407. // clarityPopWindow.update(clarity, -offsetX, -offsetY, Math.round(layout.getMeasuredWidth() * 2), layout.getMeasuredHeight());
  408. }
  409. protected void clickBackTiny() {
  410. clearFloatScreen();
  411. }
  412. protected void clickBack() {
  413. backPress();
  414. }
  415. protected void clickSurfaceContainer() {
  416. startDismissControlViewTimer();
  417. }
  418. protected void clickPoster() {
  419. if (jzDataSource == null || jzDataSource.urlsMap.isEmpty() || jzDataSource.getCurrentUrl() == null) {
  420. Toast.makeText(jzvdContext, getResources().getString(R.string.no_url), Toast.LENGTH_SHORT).show();
  421. return;
  422. }
  423. if (state == STATE_NORMAL) {
  424. if (!jzDataSource.getCurrentUrl().toString().startsWith("file") &&
  425. !jzDataSource.getCurrentUrl().toString().startsWith("/") &&
  426. !JZUtils.isWifiConnected(jzvdContext) && !WIFI_TIP_DIALOG_SHOWED) {
  427. showWifiDialog();
  428. return;
  429. }
  430. startVideo();
  431. } else if (state == STATE_AUTO_COMPLETE) {
  432. // onClickUiToggle();
  433. }
  434. }
  435. @Override
  436. public void setScreenNormal() {
  437. super.setScreenNormal();
  438. fullscreenButton.setImageResource(R.drawable.jz_enlarge);
  439. backButton.setVisibility(View.GONE);
  440. tinyBackImageView.setVisibility(View.INVISIBLE);
  441. changeStartButtonSize(SizeUtils.dp2px(getContext(), 80));
  442. batteryTimeLayout.setVisibility(View.GONE);
  443. clarity.setVisibility(View.GONE);
  444. }
  445. @Override
  446. public void setScreenFullscreen() {
  447. super.setScreenFullscreen();
  448. //进入全屏之后要保证原来的播放状态和ui状态不变,改变个别的ui
  449. fullscreenButton.setImageResource(R.drawable.jz_shrink);
  450. // backButton.setVisibility(View.VISIBLE);
  451. tinyBackImageView.setVisibility(View.INVISIBLE);
  452. batteryTimeLayout.setVisibility(View.VISIBLE);
  453. if (jzDataSource.urlsMap.size() == 1) {
  454. clarity.setVisibility(GONE);
  455. } else {
  456. clarity.setText(jzDataSource.getCurrentKey().toString());
  457. clarity.setVisibility(View.VISIBLE);
  458. }
  459. changeStartButtonSize(SizeUtils.dp2px(getContext(), 80));
  460. setSystemTimeAndBattery();
  461. }
  462. @Override
  463. public void setScreenTiny() {
  464. super.setScreenTiny();
  465. tinyBackImageView.setVisibility(View.VISIBLE);
  466. setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
  467. View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
  468. batteryTimeLayout.setVisibility(View.GONE);
  469. clarity.setVisibility(View.GONE);
  470. }
  471. @Override
  472. public void showWifiDialog() {
  473. super.showWifiDialog();
  474. AlertDialog.Builder builder = new AlertDialog.Builder(jzvdContext);
  475. builder.setMessage(getResources().getString(R.string.tips_not_wifi));
  476. builder.setPositiveButton(getResources().getString(R.string.tips_not_wifi_confirm), (dialog, which) -> {
  477. dialog.dismiss();
  478. WIFI_TIP_DIALOG_SHOWED = true;
  479. if (state == STATE_PAUSE) {
  480. startButton.performClick();
  481. } else {
  482. startVideo();
  483. }
  484. });
  485. builder.setNegativeButton(getResources().getString(R.string.tips_not_wifi_cancel), (dialog, which) -> {
  486. dialog.dismiss();
  487. releaseAllVideos();
  488. clearFloatScreen();
  489. });
  490. builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
  491. @Override
  492. public void onCancel(DialogInterface dialog) {
  493. dialog.dismiss();
  494. releaseAllVideos();
  495. clearFloatScreen();
  496. }
  497. });
  498. builder.create().show();
  499. }
  500. @Override
  501. public void onStartTrackingTouch(SeekBar seekBar) {
  502. // super.onStartTrackingTouch(seekBar);
  503. // cancelDismissControlViewTimer();
  504. }
  505. @Override
  506. public void onStopTrackingTouch(SeekBar seekBar) {
  507. // super.onStopTrackingTouch(seekBar);
  508. // startDismissControlViewTimer();
  509. }
  510. public void onClickUiToggle() {//这是事件
  511. if (bottomContainer.getVisibility() != View.VISIBLE) {
  512. setSystemTimeAndBattery();
  513. clarity.setText(jzDataSource.getCurrentKey().toString());
  514. }
  515. if (state == STATE_PREPARING) {
  516. changeUiToPreparing();
  517. if (bottomContainer.getVisibility() == View.VISIBLE) {
  518. } else {
  519. setSystemTimeAndBattery();
  520. }
  521. } else if (state == STATE_PLAYING) {
  522. if (bottomContainer.getVisibility() == View.VISIBLE) {
  523. changeUiToPlayingClear();
  524. } else {
  525. changeUiToPlayingShow();
  526. }
  527. } else if (state == STATE_PAUSE) {
  528. if (bottomContainer.getVisibility() == View.VISIBLE) {
  529. changeUiToPauseClear();
  530. } else {
  531. changeUiToPauseShow();
  532. }
  533. }
  534. }
  535. public void setSystemTimeAndBattery() {
  536. SimpleDateFormat dateFormater = new SimpleDateFormat("HH:mm");
  537. Date date = new Date();
  538. videoCurrentTime.setText(dateFormater.format(date));
  539. if ((System.currentTimeMillis() - LAST_GET_BATTERYLEVEL_TIME) > 30000) {
  540. LAST_GET_BATTERYLEVEL_TIME = System.currentTimeMillis();
  541. jzvdContext.registerReceiver(
  542. battertReceiver,
  543. new IntentFilter(Intent.ACTION_BATTERY_CHANGED)
  544. );
  545. } else {
  546. setBatteryLevel();
  547. }
  548. }
  549. public void setBatteryLevel() {
  550. int percent = LAST_GET_BATTERYLEVEL_PERCENT;
  551. if (percent < 15) {
  552. batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_10);
  553. } else if (percent >= 15 && percent < 40) {
  554. batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_30);
  555. } else if (percent >= 40 && percent < 60) {
  556. batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_50);
  557. } else if (percent >= 60 && percent < 80) {
  558. batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_70);
  559. } else if (percent >= 80 && percent < 95) {
  560. batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_90);
  561. } else if (percent >= 95 && percent <= 100) {
  562. batteryLevel.setBackgroundResource(R.drawable.jz_battery_level_100);
  563. }
  564. }
  565. //** 和onClickUiToggle重复,要干掉
  566. public void onCLickUiToggleToClear() {
  567. if (state == STATE_PREPARING) {
  568. if (bottomContainer.getVisibility() == View.VISIBLE) {
  569. changeUiToPreparing();
  570. } else {
  571. }
  572. } else if (state == STATE_PLAYING) {
  573. if (bottomContainer.getVisibility() == View.VISIBLE) {
  574. changeUiToPlayingClear();
  575. } else {
  576. }
  577. } else if (state == STATE_PAUSE) {
  578. if (bottomContainer.getVisibility() == View.VISIBLE) {
  579. changeUiToPauseClear();
  580. } else {
  581. }
  582. } else if (state == STATE_AUTO_COMPLETE) {
  583. if (bottomContainer.getVisibility() == View.VISIBLE) {
  584. changeUiToComplete();
  585. } else {
  586. }
  587. }
  588. }
  589. @Override
  590. public void onProgress(int progress, long position, long duration) {
  591. super.onProgress(progress, position, duration);
  592. bottomProgressBar.setProgress(progress);
  593. }
  594. @Override
  595. public void setBufferProgress(int bufferProgress) {
  596. super.setBufferProgress(bufferProgress);
  597. bottomProgressBar.setSecondaryProgress(bufferProgress);
  598. }
  599. @Override
  600. public void resetProgressAndTime() {
  601. super.resetProgressAndTime();
  602. bottomProgressBar.setProgress(0);
  603. bottomProgressBar.setSecondaryProgress(0);
  604. }
  605. public void changeUiToNormal() {
  606. switch (screen) {
  607. case SCREEN_NORMAL:
  608. case SCREEN_FULLSCREEN:
  609. setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
  610. View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
  611. updateStartImage();
  612. break;
  613. case SCREEN_TINY:
  614. break;
  615. }
  616. }
  617. public void changeUiToPreparing() {
  618. switch (screen) {
  619. case SCREEN_NORMAL:
  620. case SCREEN_FULLSCREEN:
  621. setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
  622. View.VISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
  623. updateStartImage();
  624. break;
  625. case SCREEN_TINY:
  626. break;
  627. }
  628. }
  629. public void changeUIToPreparingPlaying() {
  630. switch (screen) {
  631. case SCREEN_NORMAL:
  632. case SCREEN_FULLSCREEN:
  633. setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.INVISIBLE,
  634. View.VISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
  635. updateStartImage();
  636. break;
  637. case SCREEN_TINY:
  638. break;
  639. }
  640. }
  641. public void changeUIToPreparingChangeUrl() {
  642. switch (screen) {
  643. case SCREEN_NORMAL:
  644. case SCREEN_FULLSCREEN:
  645. setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
  646. View.VISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
  647. updateStartImage();
  648. break;
  649. case SCREEN_TINY:
  650. break;
  651. }
  652. }
  653. public void changeUiToPlayingShow() {
  654. switch (screen) {
  655. case SCREEN_NORMAL:
  656. case SCREEN_FULLSCREEN:
  657. setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,
  658. View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
  659. updateStartImage();
  660. break;
  661. case SCREEN_TINY:
  662. break;
  663. }
  664. }
  665. public void changeUiToPlayingClear() {
  666. switch (screen) {
  667. case SCREEN_NORMAL:
  668. case SCREEN_FULLSCREEN:
  669. setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
  670. View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);
  671. break;
  672. case SCREEN_TINY:
  673. break;
  674. }
  675. }
  676. public void changeUiToPauseShow() {
  677. switch (screen) {
  678. case SCREEN_NORMAL:
  679. case SCREEN_FULLSCREEN:
  680. setAllControlsVisiblity(View.VISIBLE, View.VISIBLE, View.VISIBLE,
  681. View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.INVISIBLE);
  682. updateStartImage();
  683. break;
  684. case SCREEN_TINY:
  685. break;
  686. }
  687. }
  688. public void changeUiToPauseClear() {
  689. switch (screen) {
  690. case SCREEN_NORMAL:
  691. case SCREEN_FULLSCREEN:
  692. setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.INVISIBLE,
  693. View.INVISIBLE, View.INVISIBLE, View.VISIBLE, View.INVISIBLE);
  694. break;
  695. case SCREEN_TINY:
  696. break;
  697. }
  698. }
  699. public void changeUiToComplete() {
  700. switch (screen) {
  701. case SCREEN_NORMAL:
  702. case SCREEN_FULLSCREEN:
  703. setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
  704. View.INVISIBLE, View.VISIBLE, View.INVISIBLE, View.INVISIBLE);
  705. updateStartImage();
  706. break;
  707. case SCREEN_TINY:
  708. break;
  709. }
  710. }
  711. public void changeUiToError() {
  712. switch (screen) {
  713. case SCREEN_NORMAL:
  714. setAllControlsVisiblity(View.INVISIBLE, View.INVISIBLE, View.VISIBLE,
  715. View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);
  716. updateStartImage();
  717. break;
  718. case SCREEN_FULLSCREEN:
  719. setAllControlsVisiblity(View.VISIBLE, View.INVISIBLE, View.VISIBLE,
  720. View.INVISIBLE, View.INVISIBLE, View.INVISIBLE, View.VISIBLE);
  721. updateStartImage();
  722. break;
  723. case SCREEN_TINY:
  724. break;
  725. }
  726. }
  727. public void setAllControlsVisiblity(int topCon, int bottomCon, int startBtn, int loadingPro,
  728. int posterImg, int bottomPro, int retryLayout) {
  729. if (hideAllUI) {
  730. topContainer.setVisibility(View.GONE);
  731. bottomContainer.setVisibility(View.GONE);
  732. bottomContainer.setVisibility(View.GONE);
  733. startButton.setVisibility(View.GONE);
  734. loadingProgressBar.setVisibility(View.GONE);
  735. mLoadingLayout.setVisibility(View.GONE);
  736. posterImageView.setVisibility(View.VISIBLE);
  737. bottomProgressBar.setVisibility(View.GONE);
  738. bottomProgressBar.setVisibility(View.GONE);
  739. mRetryLayout.setVisibility(View.GONE);
  740. return;
  741. }
  742. topContainer.setVisibility(topCon);
  743. bottomContainer.setVisibility(bottomCon);
  744. bottomContainer.setVisibility(View.INVISIBLE);
  745. startButton.setVisibility(startBtn);
  746. loadingProgressBar.setVisibility(loadingPro);
  747. mLoadingLayout.setVisibility(loadingPro);
  748. posterImageView.setVisibility(posterImg);
  749. bottomProgressBar.setVisibility(bottomPro);
  750. bottomProgressBar.setVisibility(View.INVISIBLE);
  751. mRetryLayout.setVisibility(retryLayout);
  752. }
  753. public void updateStartImage() {
  754. if (state == STATE_PLAYING) {
  755. startButton.setVisibility(VISIBLE);
  756. startButton.setImageResource(R.drawable.jz_click_pause_selector);
  757. replayTextView.setVisibility(GONE);
  758. } else if (state == STATE_ERROR) {
  759. startButton.setVisibility(INVISIBLE);
  760. replayTextView.setVisibility(GONE);
  761. } else if (state == STATE_AUTO_COMPLETE) {
  762. startButton.setVisibility(VISIBLE);
  763. startButton.setImageResource(R.drawable.jz_click_replay_selector);
  764. replayTextView.setVisibility(VISIBLE);
  765. } else {
  766. startButton.setImageResource(R.drawable.jz_click_play_selector);
  767. replayTextView.setVisibility(GONE);
  768. }
  769. }
  770. @Override
  771. public void showProgressDialog(float deltaX, String seekTime, long seekTimePosition, String totalTime, long totalTimeDuration) {
  772. // super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration);
  773. // if (mProgressDialog == null) {
  774. // View localView = LayoutInflater.from(jzvdContext).inflate(R.layout.jz_dialog_progress, null);
  775. // mDialogProgressBar = localView.findViewById(R.id.duration_progressbar);
  776. // mDialogSeekTime = localView.findViewById(R.id.tv_current);
  777. // mDialogTotalTime = localView.findViewById(R.id.tv_duration);
  778. // mDialogIcon = localView.findViewById(R.id.duration_image_tip);
  779. // mProgressDialog = createDialogWithView(localView);
  780. // }
  781. // if (!mProgressDialog.isShowing()) {
  782. // mProgressDialog.show();
  783. // }
  784. //
  785. // mDialogSeekTime.setText(seekTime);
  786. // mDialogTotalTime.setText(" / " + totalTime);
  787. // mDialogProgressBar.setProgress(totalTimeDuration <= 0 ? 0 : (int) (seekTimePosition * 100 / totalTimeDuration));
  788. // if (deltaX > 0) {
  789. // mDialogIcon.setBackgroundResource(R.drawable.jz_forward_icon);
  790. // } else {
  791. // mDialogIcon.setBackgroundResource(R.drawable.jz_backward_icon);
  792. // }
  793. // onCLickUiToggleToClear();
  794. }
  795. @Override
  796. public void dismissProgressDialog() {
  797. // super.dismissProgressDialog();
  798. // if (mProgressDialog != null) {
  799. // mProgressDialog.dismiss();
  800. // }
  801. }
  802. @Override
  803. public void showVolumeDialog(float deltaY, int volumePercent) {
  804. super.showVolumeDialog(deltaY, volumePercent);
  805. if (mVolumeDialog == null) {
  806. View localView = LayoutInflater.from(jzvdContext).inflate(R.layout.jz_dialog_volume, null);
  807. mDialogVolumeImageView = localView.findViewById(R.id.volume_image_tip);
  808. mDialogVolumeTextView = localView.findViewById(R.id.tv_volume);
  809. mDialogVolumeProgressBar = localView.findViewById(R.id.volume_progressbar);
  810. mVolumeDialog = createDialogWithView(localView);
  811. }
  812. if (!mVolumeDialog.isShowing()) {
  813. mVolumeDialog.show();
  814. }
  815. if (volumePercent <= 0) {
  816. mDialogVolumeImageView.setBackgroundResource(R.drawable.jz_close_volume);
  817. } else {
  818. mDialogVolumeImageView.setBackgroundResource(R.drawable.jz_add_volume);
  819. }
  820. if (volumePercent > 100) {
  821. volumePercent = 100;
  822. } else if (volumePercent < 0) {
  823. volumePercent = 0;
  824. }
  825. mDialogVolumeTextView.setText(volumePercent + "%");
  826. mDialogVolumeProgressBar.setProgress(volumePercent);
  827. onCLickUiToggleToClear();
  828. }
  829. @Override
  830. public void dismissVolumeDialog() {
  831. super.dismissVolumeDialog();
  832. if (mVolumeDialog != null) {
  833. mVolumeDialog.dismiss();
  834. }
  835. }
  836. @Override
  837. public void showBrightnessDialog(int brightnessPercent) {
  838. super.showBrightnessDialog(brightnessPercent);
  839. if (mBrightnessDialog == null) {
  840. View localView = LayoutInflater.from(jzvdContext).inflate(R.layout.jz_dialog_brightness, null);
  841. mDialogBrightnessTextView = localView.findViewById(R.id.tv_brightness);
  842. mDialogBrightnessProgressBar = localView.findViewById(R.id.brightness_progressbar);
  843. mBrightnessDialog = createDialogWithView(localView);
  844. }
  845. if (!mBrightnessDialog.isShowing()) {
  846. mBrightnessDialog.show();
  847. }
  848. if (brightnessPercent > 100) {
  849. brightnessPercent = 100;
  850. } else if (brightnessPercent < 0) {
  851. brightnessPercent = 0;
  852. }
  853. mDialogBrightnessTextView.setText(brightnessPercent + "%");
  854. mDialogBrightnessProgressBar.setProgress(brightnessPercent);
  855. onCLickUiToggleToClear();
  856. }
  857. @Override
  858. public void dismissBrightnessDialog() {
  859. super.dismissBrightnessDialog();
  860. if (mBrightnessDialog != null) {
  861. mBrightnessDialog.dismiss();
  862. }
  863. }
  864. public Dialog createDialogWithView(View localView) {
  865. Dialog dialog = new Dialog(jzvdContext, R.style.jz_style_dialog_progress);
  866. dialog.setContentView(localView);
  867. Window window = dialog.getWindow();
  868. window.addFlags(Window.FEATURE_ACTION_BAR);
  869. window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
  870. window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
  871. window.setLayout(-2, -2);
  872. WindowManager.LayoutParams localLayoutParams = window.getAttributes();
  873. localLayoutParams.gravity = Gravity.CENTER;
  874. window.setAttributes(localLayoutParams);
  875. return dialog;
  876. }
  877. public void startDismissControlViewTimer() {
  878. // cancelDismissControlViewTimer();
  879. // DISMISS_CONTROL_VIEW_TIMER = new Timer();
  880. // mDismissControlViewTimerTask = new DismissControlViewTimerTask();
  881. // DISMISS_CONTROL_VIEW_TIMER.schedule(mDismissControlViewTimerTask, 2500);
  882. }
  883. public void cancelDismissControlViewTimer() {
  884. // if (DISMISS_CONTROL_VIEW_TIMER != null) {
  885. // DISMISS_CONTROL_VIEW_TIMER.cancel();
  886. // }
  887. // if (mDismissControlViewTimerTask != null) {
  888. // mDismissControlViewTimerTask.cancel();
  889. // }
  890. }
  891. public void setVideoCallBack(VideoCallBack callBack) {
  892. this.mCallBack = callBack;
  893. }
  894. @Override
  895. public void onError(int what, int extra) {
  896. super.onError(what, extra);
  897. if (this.mCallBack != null) {
  898. this.mCallBack.onError(what, extra);
  899. }
  900. }
  901. @Override
  902. public void onInfo(int what, int extra) {
  903. super.onInfo(what, extra);
  904. switch (what) {
  905. case STATE_PREPARING_PLAYING:
  906. if (playLogId != null && !playLogId.equals("")) {
  907. postPlayLog(playLogId);
  908. } else {
  909. Logger.e("playLogId==null");
  910. }
  911. break;
  912. }
  913. if (this.mCallBack != null) {
  914. this.mCallBack.onInfo(what, extra);
  915. }
  916. }
  917. @Override
  918. public void onCompletion() {
  919. if (screen == SCREEN_FULLSCREEN) {
  920. onStateAutoComplete();
  921. } else {
  922. Runtime.getRuntime().gc();
  923. Log.i(TAG, "onAutoCompletion " + " [" + this.hashCode() + "] ");
  924. Logger.e("screen!=SCREEN_FULLSCREEN");
  925. cancelProgressTimer();
  926. dismissBrightnessDialog();
  927. dismissProgressDialog();
  928. dismissVolumeDialog();
  929. onStateAutoComplete();
  930. mediaInterface.release();
  931. JZUtils.scanForActivity(getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  932. }
  933. if (mCallBack != null) {
  934. resView();
  935. mCallBack.onComplete();
  936. }
  937. // CToast.makeText(jzvdContext, "onCompletion", 3000).show();
  938. }
  939. @Override
  940. public void onPrepared() {
  941. super.onPrepared();
  942. if (mCallBack != null) {
  943. mCallBack.onPrepared();
  944. }
  945. }
  946. void resView() {
  947. mediaInterface.release();
  948. // backButton = null;
  949. // bottomProgressBar = null;
  950. // loadingProgressBar = null;
  951. // titleTextView = null;
  952. // posterImageView = null;
  953. // tinyBackImageView = null;
  954. // batteryTimeLayout = null;
  955. // batteryLevel = null;
  956. // videoCurrentTime = null;
  957. // replayTextView = null;
  958. // clarity = null;
  959. // mRetryBtn = null;
  960. // mRetryLayout = null;
  961. // battertReceiver = null;
  962. // mDialogBrightnessProgressBar = null;
  963. // mDialogBrightnessTextView = null;
  964. // mBrightnessDialog = null;
  965. // mDialogVolumeImageView = null;
  966. // mDialogVolumeTextView = null;
  967. // mDialogVolumeProgressBar = null;
  968. // mVolumeDialog = null;
  969. // wifiReceiver = null;
  970. // Runtime.getRuntime().gc();
  971. // System.gc();
  972. }
  973. public void postPlayLog(String readid) {
  974. OkHttpClient.doPostAsync(new HttpInfo.Builder().setUrl(Consts.getFinalApi() + "/playLog").addParamJson("{\"userReadId\":\"" + readid + "\",\"playStopTime\":\"0\",\"channel\":\"" + Consts.getUMengChannel() + "\"}"), new Callback() {
  975. @Override
  976. public void onSuccess(HttpInfo info) throws IOException {
  977. //播放记录
  978. HttpResultBean<PlayLogBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<PlayLogBean>>() {
  979. }.getType());
  980. //
  981. if (Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
  982. /**
  983. * 免责声明!!!!!!!!!!!!!!!!!!
  984. *判断是否是官方的,官方的就是免费的。不是官方的就是收费的。但是无奈老板让收费的也播放。不知道什么意思。如有问题,请勿追究程序员责任。
  985. *@z
  986. */
  987. if (bean.getData().getType().equals("EXAMPLE")) {
  988. //官方的
  989. // Logger.e("上报官方免费的");
  990. BotRegisterListener.uploadUsage("0", readid, "video", "unpurchased");
  991. } else {
  992. // Logger.e("上报别人的书序收费的");
  993. BotRegisterListener.uploadUsage("1", readid, "video", "unpurchased");
  994. }
  995. }
  996. }
  997. @Override
  998. public void onFailure(HttpInfo info) throws IOException {
  999. }
  1000. });
  1001. }
  1002. @Override
  1003. public void reset() {
  1004. cancelDismissControlViewTimer();
  1005. // unregisterWifiListener(getApplicationContext());
  1006. Log.i(TAG, "reset " + " [" + this.hashCode() + "] ");
  1007. cancelProgressTimer();
  1008. dismissBrightnessDialog();
  1009. dismissProgressDialog();
  1010. dismissVolumeDialog();
  1011. onStateNormal();
  1012. textureViewContainer.removeAllViews();
  1013. AudioManager mAudioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
  1014. mAudioManager.abandonAudioFocus(onAudioFocusChangeListener);
  1015. JZUtils.scanForActivity(getContext()).getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  1016. if (mediaInterface != null) mediaInterface.release();
  1017. }
  1018. public void dissmissControlView() {
  1019. if (state != STATE_NORMAL
  1020. && state != STATE_ERROR
  1021. && state != STATE_AUTO_COMPLETE) {
  1022. post(() -> {
  1023. bottomContainer.setVisibility(View.INVISIBLE);
  1024. topContainer.setVisibility(View.INVISIBLE);
  1025. startButton.setVisibility(View.INVISIBLE);
  1026. if (screen != SCREEN_TINY) {
  1027. bottomProgressBar.setVisibility(View.VISIBLE);
  1028. }
  1029. });
  1030. }
  1031. }
  1032. public void registerWifiListener(Context context) {
  1033. // if (context == null) return;
  1034. // mIsWifi = JZUtils.isWifiConnected(context);
  1035. // IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
  1036. // context.registerReceiver(wifiReceiver, intentFilter);
  1037. }
  1038. public void unregisterWifiListener(Context context) {
  1039. // if (context == null) return;
  1040. // try {
  1041. // context.unregisterReceiver(wifiReceiver);
  1042. // } catch (IllegalArgumentException e) {
  1043. // e.printStackTrace();
  1044. // }
  1045. }
  1046. public void setHideAllUI(boolean hideALl) {
  1047. hideAllUI = hideALl;
  1048. }
  1049. public void seekTo(int seek) {
  1050. if (mediaInterface != null) {
  1051. mediaInterface.seekTo(seek);
  1052. }
  1053. }
  1054. public class DismissControlViewTimerTask extends TimerTask {
  1055. @Override
  1056. public void run() {
  1057. dissmissControlView();
  1058. }
  1059. }
  1060. public interface VideoCallBack {
  1061. void onComplete();
  1062. void onError(int what, int extra);
  1063. void onInfo(int what, int extra);
  1064. void onPrepared();
  1065. }
  1066. public String getVideoTitle() {
  1067. return jzDataSource.title;
  1068. }
  1069. }