diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java index 9c5c8384a..9ed83bf65 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java @@ -48,6 +48,8 @@ import org.fourthline.cling.support.contentdirectory.DIDLParser; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.util.UUID; + public class CastActivity extends BaseActivity implements CustomKeyDownCast.Listener, TrackDialog.Listener, RenderControl, ServiceConnection, Clock.Callback { private ActivityCastBinding mBinding; @@ -62,6 +64,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List private boolean redirect; private long position; private long duration; + private String tag; private int scale; public static void start(Activity activity) { @@ -141,6 +144,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List PlaybackService.start(mPlayers); setScale(scale = Setting.getScale()); ExoUtil.setSubtitleView(mBinding.exo); + mPlayers.setTag(tag = UUID.randomUUID().toString()); findViewById(R.id.timeBar).setNextFocusUpId(R.id.reset); mBinding.control.speed.setText(mPlayers.getSpeedText()); mBinding.control.decode.setText(mPlayers.getDecodeText()); @@ -295,6 +299,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { + if (!event.getTag().equals(tag)) return; switch (event.getState()) { case PlayerEvent.PREPARE: setDecode(); @@ -340,6 +345,7 @@ public class CastActivity extends BaseActivity implements CustomKeyDownCast.List @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { + if (!event.getTag().equals(tag)) return; if (mPlayers.retried()) onError(event); else onReset(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 331c32087..2e928a7a2 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -68,6 +68,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.UUID; public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, EpgDataPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, TrackDialog.Listener, PassCallback, LiveCallback { @@ -91,6 +92,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private Runnable mR4; private Clock mClock; private boolean redirect; + private String tag; private int count; public static void start(Context context) { @@ -189,6 +191,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick PlaybackService.start(mPlayers); setScale(Setting.getLiveScale()); ExoUtil.setSubtitleView(mBinding.exo); + mPlayers.setTag(tag = UUID.randomUUID().toString()); findViewById(R.id.timeBar).setNextFocusUpId(R.id.player); mBinding.control.invert.setActivated(Setting.isInvert()); mBinding.control.across.setActivated(Setting.isAcross()); @@ -595,7 +598,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void setEpg() { String epg = mChannel.getData().getEpg(); - if (epg.length() > 0) mBinding.widget.name.setMaxEms(12); + if (!epg.isEmpty()) mBinding.widget.name.setMaxEms(12); mEpgDataAdapter.setItems(mChannel.getData().getList(), null); mBinding.widget.play.setText(epg); setWidth(mChannel.getData()); @@ -712,6 +715,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { + if (!event.getTag().equals(tag)) return; switch (event.getState()) { case PlayerEvent.PREPARE: setDecode(); @@ -752,6 +756,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { + if (!event.getTag().equals(tag)) return; if (mPlayers.retried()) onError(event); else fetch(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index f73278f1b..c5db317b1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -98,6 +98,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.regex.Matcher; @@ -137,6 +138,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List private Clock mClock; private View mFocus1; private View mFocus2; + private String tag; public static void push(FragmentActivity activity, String text) { if (FileChooser.isValid(activity, Uri.parse(text))) file(activity, FileChooser.getPathFromUri(activity, Uri.parse(text))); @@ -374,6 +376,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List PlaybackService.start(mPlayers); ExoUtil.setSubtitleView(mBinding.exo); mPlayers.setDanmakuView(mBinding.danmaku); + mPlayers.setTag(tag = UUID.randomUUID().toString()); mBinding.control.decode.setText(mPlayers.getDecodeText()); mBinding.control.danmaku.setVisibility(Setting.isDanmakuLoad() ? View.VISIBLE : View.GONE); mBinding.control.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Setting.getReset()]); @@ -577,7 +580,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List try { mPlayers.start(result, isUseParse(), getSite().isChangeable() ? getSite().getTimeout() : -1); } catch (Exception e) { - ErrorEvent.extract(e.getMessage()); + ErrorEvent.extract(tag, e.getMessage()); e.printStackTrace(); } } @@ -951,7 +954,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List boolean empty = item.getVodFlags().isEmpty(); mBinding.flag.setVisibility(empty ? View.GONE : View.VISIBLE); if (empty) { - ErrorEvent.flag(); + ErrorEvent.flag(tag); } else { setFlagActivated(mHistory.getFlag()); if (mHistory.isRevSort()) reverseEpisode(true); @@ -1049,7 +1052,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { - if (isRedirect()) return; + if (!event.getTag().equals(tag)) return; switch (event.getState()) { case PlayerEvent.PREPARE: setDecode(); @@ -1106,7 +1109,7 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { - if (isRedirect()) return; + if (!event.getTag().equals(tag)) return; if (mPlayers.retried()) onError(event); else onRefresh(); } diff --git a/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java b/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java index e6ee6d18a..944ae4726 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java @@ -7,46 +7,53 @@ import org.greenrobot.eventbus.EventBus; public class ErrorEvent { + private final String tag; private final Type type; private String msg; - public static void url() { - EventBus.getDefault().post(new ErrorEvent(Type.URL)); + public static void url(String tag) { + EventBus.getDefault().post(new ErrorEvent(tag, Type.URL)); } - public static void drm() { - EventBus.getDefault().post(new ErrorEvent(Type.DRM)); + public static void drm(String tag) { + EventBus.getDefault().post(new ErrorEvent(tag, Type.DRM)); } - public static void flag() { - EventBus.getDefault().post(new ErrorEvent(Type.FLAG)); + public static void flag(String tag) { + EventBus.getDefault().post(new ErrorEvent(tag, Type.FLAG)); } - public static void parse() { - EventBus.getDefault().post(new ErrorEvent(Type.PARSE)); + public static void parse(String tag) { + EventBus.getDefault().post(new ErrorEvent(tag, Type.PARSE)); } - public static void timeout() { - EventBus.getDefault().post(new ErrorEvent(Type.TIMEOUT)); + public static void timeout(String tag) { + EventBus.getDefault().post(new ErrorEvent(tag, Type.TIMEOUT)); } - public static void extract(String msg) { - EventBus.getDefault().post(new ErrorEvent(Type.EXTRACT, msg)); + public static void extract(String tag, String msg) { + EventBus.getDefault().post(new ErrorEvent(tag, Type.EXTRACT, msg)); } - public ErrorEvent(Type type) { + public ErrorEvent(String tag, Type type) { this.type = type; + this.tag = tag; } - public ErrorEvent(Type type, String msg) { - this.msg = msg; + public ErrorEvent(String tag, Type type, String msg) { this.type = type; + this.tag = tag; + this.msg = msg; } public Type getType() { return type; } + public String getTag() { + return tag; + } + public String getMsg() { if (type == Type.URL) return ResUtil.getString(R.string.error_play_url); if (type == Type.DRM) return ResUtil.getString(R.string.error_play_drm_scheme); diff --git a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java index 1291019e2..28768369a 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/PlayerEvent.java @@ -8,26 +8,32 @@ public class PlayerEvent { public static final int TRACK = 21; public static final int SIZE = 11; + private final String tag; private final int state; - public static void prepare() { - EventBus.getDefault().post(new PlayerEvent(PREPARE)); + public static void prepare(String tag) { + EventBus.getDefault().post(new PlayerEvent(tag, PREPARE)); } - public static void track() { - EventBus.getDefault().post(new PlayerEvent(TRACK)); + public static void track(String tag) { + EventBus.getDefault().post(new PlayerEvent(tag, TRACK)); } - public static void size() { - EventBus.getDefault().post(new PlayerEvent(SIZE)); + public static void size(String tag) { + EventBus.getDefault().post(new PlayerEvent(tag, SIZE)); } - public static void state(int state) { - EventBus.getDefault().post(new PlayerEvent(state)); + public static void state(String tag, int state) { + EventBus.getDefault().post(new PlayerEvent(tag, state)); } - private PlayerEvent(int state) { + private PlayerEvent(String tag, int state) { this.state = state; + this.tag = tag; + } + + public String getTag() { + return tag; } public int getState() { diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 7dcb5390a..17276b549 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -87,6 +87,7 @@ public class Players implements Player.Listener, ParseCallback { private VideoSize size; private List subs; private String format; + private String tag; private String key; private String url; private Drm drm; @@ -104,7 +105,7 @@ public class Players implements Player.Listener, ParseCallback { private Players(Activity activity) { decode = Setting.getDecode(); builder = new StringBuilder(); - runnable = ErrorEvent::timeout; + runnable = () -> ErrorEvent.timeout(tag); formatter = new Formatter(builder, Locale.getDefault()); createSession(activity); } @@ -179,6 +180,14 @@ public class Players implements Player.Listener, ParseCallback { this.key = key; } + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + public void reset() { removeTimeoutCheck(); retry = 0; @@ -392,13 +401,13 @@ public class Players implements Player.Listener, ParseCallback { public void start(Channel channel, int timeout) { if (channel.hasMsg()) { - ErrorEvent.extract(channel.getMsg()); + ErrorEvent.extract(tag, channel.getMsg()); } else if (isIllegal(channel.getUrl())) { - ErrorEvent.url(); + ErrorEvent.url(tag); } else if (channel.getParse() == 1) { startParse(channel.result(), false); } else if (channel.getDrm() != null && !FrameworkMediaDrm.isCryptoSchemeSupported(channel.getDrm().getUUID())) { - ErrorEvent.drm(); + ErrorEvent.drm(tag); } else { setMediaItem(channel, timeout); } @@ -406,13 +415,13 @@ public class Players implements Player.Listener, ParseCallback { public void start(Result result, boolean useParse, int timeout) { if (result.hasMsg()) { - ErrorEvent.extract(result.getMsg()); + ErrorEvent.extract(tag, result.getMsg()); } else if (isIllegal(result.getRealUrl())) { - ErrorEvent.url(); + ErrorEvent.url(tag); } else if (result.getParse(1) == 1 || result.getJx() == 1) { startParse(result, useParse); } else if (result.getDrm() != null && !FrameworkMediaDrm.isCryptoSchemeSupported(result.getDrm().getUUID())) { - ErrorEvent.drm(); + ErrorEvent.drm(tag); } else { setMediaItem(result, timeout); } @@ -464,8 +473,8 @@ public class Players implements Player.Listener, ParseCallback { private void setMediaItem(Map headers, String url, String format, Drm drm, List subs, int timeout) { if (exoPlayer != null) exoPlayer.setMediaItem(ExoUtil.getMediaItem(this.headers = checkUa(headers), UrlUtil.uri(this.url = url), this.format = format, this.drm = drm, checkSub(this.subs = subs), decode)); App.post(runnable, timeout); + PlayerEvent.prepare(tag); session.setActive(true); - PlayerEvent.prepare(); Logger.t(TAG).d(url); prepare(); } @@ -595,7 +604,7 @@ public class Players implements Player.Listener, ParseCallback { @Override public void onParseError() { - ErrorEvent.parse(); + ErrorEvent.parse(tag); } @Override @@ -620,26 +629,26 @@ public class Players implements Player.Listener, ParseCallback { @Override public void onPlaybackStateChanged(int state) { if (danPlayer != null) danPlayer.check(state); - PlayerEvent.state(state); + PlayerEvent.state(tag, state); } @Override public void onVideoSizeChanged(@NonNull VideoSize videoSize) { this.size = videoSize; - PlayerEvent.size(); + PlayerEvent.size(tag); } @Override public void onTracksChanged(@NonNull Tracks tracks) { if (tracks.isEmpty()) return; setTrack(Track.find(getKey())); - PlayerEvent.track(); + PlayerEvent.track(tag); } @Override public void onPlayerError(@NonNull PlaybackException error) { Logger.t(TAG).e(error.errorCode + "," + url); - if (retried()) ErrorEvent.extract(error.getErrorCodeName()); + if (retried()) ErrorEvent.extract(tag, error.getErrorCodeName()); else switch (error.errorCode) { case PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW: seekToDefaultPosition(); @@ -657,7 +666,7 @@ public class Players implements Player.Listener, ParseCallback { setFormat(ExoUtil.getMimeType(error.errorCode)); break; default: - ErrorEvent.extract(error.getErrorCodeName()); + ErrorEvent.extract(tag, error.getErrorCodeName()); break; } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 2aed5000a..c194b5038 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -72,6 +72,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.UUID; public class LiveActivity extends BaseActivity implements CustomKeyDownLive.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, EpgDataAdapter.OnClickListener, CastDialog.Listener, InfoDialog.Listener { @@ -95,7 +96,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List private boolean rotate; private boolean stop; private boolean lock; - private int passCount; + private String tag; + private int count; private PiP mPiP; public static void start(Context context) { @@ -197,6 +199,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List PlaybackService.start(mPlayers); setScale(Setting.getLiveScale()); ExoUtil.setSubtitleView(mBinding.exo); + mPlayers.setTag(tag = UUID.randomUUID().toString()); mBinding.control.action.invert.setActivated(Setting.isInvert()); mBinding.control.action.across.setActivated(Setting.isAcross()); mBinding.control.action.change.setActivated(Setting.isChange()); @@ -514,7 +517,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List } private void resetPass() { - this.passCount = 0; + this.count = 0; } private void setArtwork(String url) { @@ -541,7 +544,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List mChannelAdapter.addAll(item.getChannel()); mChannelAdapter.setSelected(item.getPosition()); mBinding.channel.scrollToPosition(Math.max(item.getPosition(), 0)); - if (!item.isKeep() || ++passCount < 5 || mHides.isEmpty()) return; + if (!item.isKeep() || ++count < 5 || mHides.isEmpty()) return; if (Biometric.enable()) Biometric.show(this); else PassDialog.create().show(this); resetPass(); @@ -618,7 +621,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List private void setEpg() { String epg = mChannel.getData().getEpg(); List data = mChannel.getData().getList(); - if (epg.length() > 0) mBinding.widget.name.setMaxEms(12); + if (!epg.isEmpty()) mBinding.widget.name.setMaxEms(12); mBinding.widget.play.setText(epg); mChannelAdapter.changed(mChannel); mEpgDataAdapter.addAll(data); @@ -748,6 +751,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { + if (!event.getTag().equals(tag)) return; switch (event.getState()) { case PlayerEvent.PREPARE: setDecode(); @@ -789,6 +793,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { + if (!event.getTag().equals(tag)) return; if (mPlayers.retried()) onError(event); else fetch(); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index db259e139..a9b60f255 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -108,6 +108,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.regex.Matcher; @@ -145,6 +146,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private Runnable mR3; private Runnable mR4; private Clock mClock; + private String tag; private PiP mPiP; public static void push(FragmentActivity activity, String text) { @@ -371,6 +373,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo PlaybackService.start(mPlayers); ExoUtil.setSubtitleView(mBinding.exo); mPlayers.setDanmakuView(mBinding.danmaku); + mPlayers.setTag(tag = UUID.randomUUID().toString()); if (isPort() && ResUtil.isLand(this)) enterFullscreen(); mBinding.control.action.decode.setText(mPlayers.getDecodeText()); mBinding.control.action.danmaku.setVisibility(Setting.isDanmakuLoad() ? View.VISIBLE : View.GONE); @@ -568,7 +571,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo try { mPlayers.start(result, isUseParse(), getSite().isChangeable() ? getSite().getTimeout() : -1); } catch (Exception e) { - ErrorEvent.extract(e.getMessage()); + ErrorEvent.extract(tag, e.getMessage()); e.printStackTrace(); } } @@ -993,7 +996,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo boolean empty = item.getVodFlags().isEmpty(); mBinding.flag.setVisibility(empty ? View.GONE : View.VISIBLE); if (empty) { - ErrorEvent.flag(); + ErrorEvent.flag(tag); } else { onItemClick(mHistory.getFlag()); if (mHistory.isRevSort()) reverseEpisode(true); @@ -1111,7 +1114,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerEvent(PlayerEvent event) { - if (isRedirect()) return; + if (!event.getTag().equals(tag)) return; switch (event.getState()) { case PlayerEvent.PREPARE: setDecode(); @@ -1181,7 +1184,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorEvent event) { - if (isRedirect()) return; + if (!event.getTag().equals(tag)) return; if (mPlayers.retried()) onError(event); else onRefresh(); }