From a2a18c98fc4274503689322ca8572f00e4fcc67e Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 4 Apr 2025 17:13:24 +0800 Subject: [PATCH] Clean code --- app/build.gradle | 4 +- .../com/fongmi/android/tv/player/Players.java | 81 ++++-------- .../android/tv/player/danmaku/DanPlayer.java | 118 ++++++++++++++++++ .../android/tv/ui/activity/VideoActivity.java | 2 +- 4 files changed, 142 insertions(+), 63 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/player/danmaku/DanPlayer.java diff --git a/app/build.gradle b/app/build.gradle index a2a3c53eb..1e6cb2cd8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { minSdk 21 //noinspection ExpiredTargetSdkVersion targetSdk 28 - versionCode 346 - versionName "3.4.6" + versionCode 347 + versionName "3.4.7" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"] 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 558e54d8c..0375e7cd0 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 @@ -44,9 +44,7 @@ import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.impl.ParseCallback; import com.fongmi.android.tv.impl.SessionCallback; -import com.fongmi.android.tv.player.danmaku.Loader; -import com.fongmi.android.tv.player.danmaku.Parser; -import com.fongmi.android.tv.player.danmaku.Sync; +import com.fongmi.android.tv.player.danmaku.DanPlayer; import com.fongmi.android.tv.player.exo.ExoUtil; import com.fongmi.android.tv.server.Server; import com.fongmi.android.tv.utils.FileUtil; @@ -66,21 +64,15 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import master.flame.danmaku.controller.DrawHandler; -import master.flame.danmaku.danmaku.model.BaseDanmaku; -import master.flame.danmaku.danmaku.model.DanmakuTimer; -import master.flame.danmaku.danmaku.model.IDisplayer; -import master.flame.danmaku.danmaku.model.android.DanmakuContext; import master.flame.danmaku.ui.widget.DanmakuView; -public class Players implements Player.Listener, ParseCallback, DrawHandler.Callback { +public class Players implements Player.Listener, ParseCallback { private static final String TAG = Players.class.getSimpleName(); public static final int SOFT = 0; public static final int HARD = 1; - private final DanmakuContext context; private final StringBuilder builder; private final Formatter formatter; private final Runnable runnable; @@ -88,8 +80,8 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call private Map headers; private MediaSessionCompat session; private List danmakus; - private DanmakuView danmaku; private ExoPlayer exoPlayer; + private DanPlayer danPlayer; private ParseJob parseJob; private PlayerView view; private VideoSize size; @@ -113,7 +105,6 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call decode = Setting.getDecode(); builder = new StringBuilder(); runnable = ErrorEvent::timeout; - context = DanmakuContext.create(); formatter = new Formatter(builder, Locale.getDefault()); createSession(activity); } @@ -145,15 +136,9 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call } public void setDanmakuView(DanmakuView view) { - (danmaku = view).setCallback(this); - context.setDanmakuSync(new Sync(this)); - HashMap maxLines = new HashMap<>(); - maxLines.put(BaseDanmaku.TYPE_FIX_TOP, 2); - maxLines.put(BaseDanmaku.TYPE_SCROLL_RL, 2); - maxLines.put(BaseDanmaku.TYPE_SCROLL_LR, 2); - maxLines.put(BaseDanmaku.TYPE_FIX_BOTTOM, 2); - context.setMaximumLines(maxLines).setScrollSpeedFactor(1.2f).setDanmakuTransparency(0.8f); - context.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setDanmakuMargin(ResUtil.dp2px(8)); + danPlayer = new DanPlayer(); + danPlayer.setPlayer(this); + danPlayer.setView(view); } public ExoPlayer get() { @@ -248,8 +233,9 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call return exoPlayer != null && ExoUtil.haveTrack(exoPlayer.getCurrentTracks(), type); } - public boolean isDanmakuPrepared() { - return danmaku != null && danmaku.isPrepared(); + public boolean haveDanmaku() { + if (danmakus != null) for (Danmaku danmaku : danmakus) if (danmaku.isSelected()) return true; + return false; } public boolean isPlaying() { @@ -356,8 +342,7 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call public void seekTo(long time) { if (exoPlayer != null) exoPlayer.seekTo(time); - if (isDanmakuPrepared()) danmaku.seekTo(time); - if (isDanmakuPrepared()) danmaku.hide(); + if (danPlayer != null) danPlayer.seekTo(time); } public void seekToDefaultPosition() { @@ -371,17 +356,17 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call public void play() { if (exoPlayer != null) exoPlayer.play(); - if (isDanmakuPrepared()) danmaku.resume(); + if (danPlayer != null) danPlayer.play(); } public void pause() { if (exoPlayer != null) exoPlayer.pause(); - if (isDanmakuPrepared()) danmaku.pause(); + if (danPlayer != null) danPlayer.pause(); } public void stop() { if (exoPlayer != null) exoPlayer.stop(); - if (isDanmakuPrepared()) danmaku.stop(); + if (danPlayer != null) danPlayer.stop(); stopParse(); } @@ -392,11 +377,11 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call removeTimeoutCheck(); Server.get().setPlayer(null); App.execute(() -> Source.get().stop()); - if (isDanmakuPrepared()) danmaku.release(); } private void releasePlayer() { if (exoPlayer != null) exoPlayer.release(); + if (danPlayer != null) danPlayer.release(); if (view != null) view.setPlayer(null); exoPlayer = null; } @@ -490,17 +475,14 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call } public void setDanmaku(Danmaku item) { - App.execute(() -> { - danmaku.release(); - if (danmakus == null) danmakus = new ArrayList<>(); - if (!item.isEmpty() && !danmakus.contains(item)) danmakus.add(0, item); - if (!item.isEmpty()) danmaku.prepare(new Parser().load(new Loader(item).getDataSource()), context); - for (int i = 0; i < danmakus.size(); i++) danmakus.get(i).setSelected(danmakus.get(i).getUrl().equals(item.getUrl()) && !danmakus.get(i).isSelected()); - }); + if (danPlayer != null) danPlayer.setDanmaku(item); + if (danmakus == null) danmakus = new ArrayList<>(); + if (!item.isEmpty() && !danmakus.contains(item)) danmakus.add(0, item); + for (int i = 0; i < danmakus.size(); i++) danmakus.get(i).setSelected(danmakus.get(i).getUrl().equals(item.getUrl()) && !danmakus.get(i).isSelected()); } public void setDanmakuSize(float size) { - context.setScaleTextSize(size); + if (danPlayer != null) danPlayer.setTextSize(size); } public void resetTrack() { @@ -637,8 +619,8 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call @Override public void onPlaybackStateChanged(int state) { - if (state == Player.STATE_BUFFERING && isDanmakuPrepared()) danmaku.pause(); - if (state == Player.STATE_READY && isDanmakuPrepared()) prepared(); + if (state == Player.STATE_BUFFERING && danPlayer != null) danPlayer.pause(); + if (state == Player.STATE_READY && danPlayer != null) danPlayer.prepared(); PlayerEvent.state(state); } @@ -680,25 +662,4 @@ public class Players implements Player.Listener, ParseCallback, DrawHandler.Call break; } } - - @Override - public void prepared() { - App.post(() -> { - if (isPlaying()) danmaku.start(getPosition()); - else danmaku.pause(); - danmaku.show(); - }); - } - - @Override - public void updateTimer(DanmakuTimer danmakuTimer) { - } - - @Override - public void danmakuShown(BaseDanmaku baseDanmaku) { - } - - @Override - public void drawingFinished() { - } } diff --git a/app/src/main/java/com/fongmi/android/tv/player/danmaku/DanPlayer.java b/app/src/main/java/com/fongmi/android/tv/player/danmaku/DanPlayer.java new file mode 100644 index 000000000..86bf15eee --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/player/danmaku/DanPlayer.java @@ -0,0 +1,118 @@ +package com.fongmi.android.tv.player.danmaku; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.bean.Danmaku; +import com.fongmi.android.tv.player.Players; +import com.fongmi.android.tv.utils.ResUtil; + +import java.util.HashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import master.flame.danmaku.controller.DrawHandler; +import master.flame.danmaku.danmaku.model.BaseDanmaku; +import master.flame.danmaku.danmaku.model.DanmakuTimer; +import master.flame.danmaku.danmaku.model.IDisplayer; +import master.flame.danmaku.danmaku.model.android.DanmakuContext; +import master.flame.danmaku.ui.widget.DanmakuView; + +public class DanPlayer implements DrawHandler.Callback { + + private final ExecutorService executor; + private final DanmakuContext context; + private DanmakuView view; + private Players player; + + public DanPlayer() { + context = DanmakuContext.create(); + executor = Executors.newCachedThreadPool(); + HashMap maxLines = new HashMap<>(); + maxLines.put(BaseDanmaku.TYPE_FIX_TOP, 2); + maxLines.put(BaseDanmaku.TYPE_SCROLL_RL, 2); + maxLines.put(BaseDanmaku.TYPE_SCROLL_LR, 2); + maxLines.put(BaseDanmaku.TYPE_FIX_BOTTOM, 2); + context.setMaximumLines(maxLines).setScrollSpeedFactor(1.2f).setDanmakuTransparency(0.8f); + context.setDanmakuStyle(IDisplayer.DANMAKU_STYLE_STROKEN, 3).setDanmakuMargin(ResUtil.dp2px(8)); + } + + public void setView(DanmakuView view) { + view.setCallback(this); + this.view = view; + } + + public void setPlayer(Players player) { + context.setDanmakuSync(new Sync(this.player = player)); + } + + private boolean isDanmakuPrepared() { + return view != null && view.isPrepared(); + } + + public void seekTo(long time) { + executor.execute(() -> { + if (isDanmakuPrepared()) view.seekTo(time); + if (isDanmakuPrepared()) view.hide(); + }); + } + + public void play() { + executor.execute(() -> { + if (isDanmakuPrepared()) view.resume(); + }); + } + + public void pause() { + executor.execute(() -> { + if (isDanmakuPrepared()) view.pause(); + }); + } + + public void stop() { + executor.execute(() -> { + if (isDanmakuPrepared()) view.stop(); + }); + } + + public void release() { + executor.execute(() -> { + if (isDanmakuPrepared()) view.release(); + }); + } + + public void setDanmaku(Danmaku item) { + executor.execute(() -> { + view.release(); + if (!item.isEmpty()) view.prepare(new Parser().load(new Loader(item).getDataSource()), context); + }); + } + + public void setTextSize(float size) { + context.setScaleTextSize(size); + } + + @Override + public void prepared() { + App.post(() -> { + boolean playing = player.isPlaying(); + long position = player.getPosition(); + executor.execute(() -> { + if (!isDanmakuPrepared()) return; + if (playing) view.start(position); + else view.pause(); + view.show(); + }); + }); + } + + @Override + public void updateTimer(DanmakuTimer danmakuTimer) { + } + + @Override + public void danmakuShown(BaseDanmaku baseDanmaku) { + } + + @Override + public void drawingFinished() { + } +} \ No newline at end of file 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 ddaa48a1c..766ed8b1d 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 @@ -929,7 +929,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void showControl() { if (mPiP.isInMode(this)) return; - mBinding.control.danmaku.setVisibility(isLock() || !mPlayers.isDanmakuPrepared() ? View.GONE : View.VISIBLE); + mBinding.control.danmaku.setVisibility(isLock() || !mPlayers.haveDanmaku() ? View.GONE : View.VISIBLE); mBinding.control.setting.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE); mBinding.control.right.rotate.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE); mBinding.control.keep.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE);