From 480fdd4faa6cf3c93496f231c960539b2b20f998 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 13 Sep 2023 23:28:44 +0800 Subject: [PATCH] Support danmu - part 7 --- .../android/tv/ui/activity/VideoActivity.java | 15 +++- .../android/tv/ui/fragment/TypeFragment.java | 1 + .../mobile/res/layout/view_control_vod.xml | 2 +- .../controller/CacheManagingDrawTask.java | 5 +- .../flame/danmaku/controller/DrawHandler.java | 73 +++++++++---------- .../danmaku/controller/IDanmakuView.java | 2 +- .../flame/danmaku/ui/widget/DanmakuView.java | 3 +- .../main/java/tv/cjump/jni/DeviceUtils.java | 22 ------ 8 files changed, 51 insertions(+), 72 deletions(-) delete mode 100644 danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java 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 a1950f7a0..38bfb82d8 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 @@ -9,6 +9,7 @@ import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.v4.media.MediaMetadataCompat; import android.text.Html; @@ -661,9 +662,13 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void onDanmu() { Setting.putDanmu(!Setting.isDanmu()); + checkDanmuImg(); + showDanmu(); + } + + private void showDanmu() { if (Setting.isDanmu()) mBinding.danmaku.show(); else mBinding.danmaku.hide(); - checkDanmuImg(); } private void checkPlay() { @@ -848,6 +853,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo if (isFullscreen()) return; App.post(() -> mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)), 50); setRequestedOrientation(mPlayers.isPortrait() ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + int padding = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? getWindowManager().getDefaultDisplay().getCutout().getSafeInsetTop() : 0; + mBinding.control.getRoot().setPadding(padding, 0, padding, 0); mBinding.control.full.setVisibility(View.GONE); mDanmakuContext.setScaleTextSize(1.0f); setSubtitle(Setting.getSubtitle()); @@ -863,6 +870,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo setRequestedOrientation(isPort() ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_FULL_USER); mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()); mBinding.control.full.setVisibility(View.VISIBLE); + mBinding.control.getRoot().setPadding(0, 0, 0, 0); mBinding.video.setLayoutParams(mFrameParams); mDanmakuContext.setScaleTextSize(0.8f); App.post(mR3, 2000); @@ -919,6 +927,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo mBinding.control.cast.setVisibility(getUrl() == null ? View.GONE : View.VISIBLE); mBinding.control.center.setVisibility(isLock() ? View.GONE : View.VISIBLE); mBinding.control.bottom.setVisibility(isLock() ? View.GONE : View.VISIBLE); + mBinding.control.danmu.setVisibility(isLock() ? View.GONE : View.VISIBLE); mBinding.control.top.setVisibility(isLock() ? View.GONE : View.VISIBLE); mBinding.control.getRoot().setVisibility(View.VISIBLE); checkPlayImg(mPlayers.isPlaying()); @@ -1154,8 +1163,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void setDefaultTrack() { if (isInitTrack()) { setInitTrack(false); + mPlayers.prepared(); mPlayers.setTrack(Track.find(getHistoryKey())); - if (isVisible(mBinding.danmaku)) mPlayers.prepared(); } } @@ -1515,10 +1524,10 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo hideControl(); hideSheet(); } else { + showDanmu(); exitFullscreen(); setForeground(true); PlaybackService.stop(); - mBinding.danmaku.show(); if (isStop()) finish(); } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java index f03fb25e0..324a123e3 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java @@ -107,6 +107,7 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac @Override protected void initEvent() { + mBinding.swipeLayout.setEnabled(!isHome()); mBinding.swipeLayout.setOnRefreshListener(this); mBinding.recycler.addOnScrollListener(mScroller = new CustomScroller(this)); } diff --git a/app/src/mobile/res/layout/view_control_vod.xml b/app/src/mobile/res/layout/view_control_vod.xml index df09f6c9b..2331fe99a 100644 --- a/app/src/mobile/res/layout/view_control_vod.xml +++ b/app/src/mobile/res/layout/view_control_vod.xml @@ -149,8 +149,8 @@ android:layout_alignParentStart="true" android:layout_centerVertical="true" android:layout_marginStart="16dp" - android:src="@drawable/ic_control_danmu_off" android:visibility="gone" + tools:src="@drawable/ic_control_danmu_off" tools:visibility="visible" /> mDrawTimes = new LinkedList<>(); - public IDrawTask drawTask; - private DanmakuContext mContext; - private FrameCallback mFrameCallback; - private long pausedPosition = 0; - private boolean quitFlag = true; - private long mTimeBase; - private boolean mReady; - private Callback mCallback; private DanmakuTimer timer = new DanmakuTimer(); - private BaseDanmakuParser mParser; private IDanmakuViewController mDanmakuView; - private boolean mDanmakusVisible; - private AbsDisplay mDisp; + private FrameCallback mFrameCallback; + private BaseDanmakuParser mParser; + private DanmakuContext mContext; private UpdateThread mThread; + private IDrawTask drawTask; + private Callback mCallback; + private AbsDisplay mDisp; + private boolean mUpdateInSeparateThread; - private long mCordonTime = 30; - private long mCordonTime2 = 60; - private long mFrameUpdateRate = 16; - private long mLastDeltaTime; + private boolean mNonBlockModeEnable; + private boolean mDanmakusVisible; private boolean mInSeekingAction; - private long mDesireSeekingTime; - private long mRemainingTime; - private boolean mInSyncAction; private boolean mInWaitingState; + private boolean mInSyncAction; private boolean mIdleSleep; - private boolean mNonBlockModeEnable; + private boolean quitFlag; + private boolean mReady; + + private long mDesireSeekingTime; + private long mFrameUpdateRate; + private long mLastDeltaTime; + private long mRemainingTime; + private long pausedPosition; + private long mCordonTime2; + private long mCordonTime; + private long mTimeBase; public DrawHandler(Looper looper, IDanmakuViewController view, boolean danmakuVisibile) { super(looper); - mIdleSleep = !DeviceUtils.isProblemBoxDevice(); bindView(view); - if (danmakuVisibile) { - showDanmakus(null); - } else { - hideDanmakus(false); - } + quitFlag = true; + mIdleSleep = true; + mCordonTime = 30; + mCordonTime2 = 60; + mFrameUpdateRate = 16; mDanmakusVisible = danmakuVisibile; + if (danmakuVisibile) showDanmakus(null); + else hideDanmakus(false); } private void bindView(IDanmakuViewController view) { @@ -187,7 +191,7 @@ public class DrawHandler extends Handler { timer.update(position); mContext.mGlobalFlagValues.updateMeasureFlag(); pausedPosition = position; - drawTask.seek(position); + if (drawTask != null) drawTask.seek(position); } case RESUME: removeMessages(DrawHandler.PAUSE); @@ -409,15 +413,11 @@ public class DrawHandler extends Handler { long time = startMS - mTimeBase; if (mNonBlockModeEnable) { if (mCallback != null) { - //mCallback.updateTimer(timer); d = timer.lastInterval(); } } else if (!mDanmakusVisible || mRenderingState.nothingRendered || mInWaitingState) { timer.update(time); mRemainingTime = 0; - if (mCallback != null) { - //mCallback.updateTimer(timer); - } } else { long gapTime = time - timer.currMillisecond; long averageTime = Math.max(mFrameUpdateRate, getAverageRenderingTime()); @@ -437,9 +437,6 @@ public class DrawHandler extends Handler { } mRemainingTime = gapTime; timer.add(d); - if (mCallback != null) { - //mCallback.updateTimer(timer); - } } mInSyncAction = false; return d; @@ -483,12 +480,10 @@ public class DrawHandler extends Handler { @Override public void onDanmakuShown(BaseDanmaku danmaku) { - //if (mCallback != null) mCallback.danmakuShown(danmaku); } @Override public void onDanmakusDrawingFinished() { - //if (mCallback != null) mCallback.drawingFinished(); } @Override @@ -535,9 +530,7 @@ public class DrawHandler extends Handler { } public void invalidateDanmaku(BaseDanmaku item, boolean remeasure) { - if (drawTask != null && item != null) { - drawTask.invalidateDanmaku(item, remeasure); - } + if (drawTask != null && item != null) drawTask.invalidateDanmaku(item, remeasure); redrawIfNeeded(); } diff --git a/danmaku/src/main/java/master/flame/danmaku/controller/IDanmakuView.java b/danmaku/src/main/java/master/flame/danmaku/controller/IDanmakuView.java index 9f07a810e..ddbbe0e02 100644 --- a/danmaku/src/main/java/master/flame/danmaku/controller/IDanmakuView.java +++ b/danmaku/src/main/java/master/flame/danmaku/controller/IDanmakuView.java @@ -47,7 +47,7 @@ public interface IDanmakuView { IDanmakus getCurrentVisibleDanmakus(); - void setCallback(Callback callback); + IDanmakuView setCallback(Callback callback); /** * for getting the accurate play-time. use this method intead of parser.getTimer().currMillisecond diff --git a/danmaku/src/main/java/master/flame/danmaku/ui/widget/DanmakuView.java b/danmaku/src/main/java/master/flame/danmaku/ui/widget/DanmakuView.java index 6d714830b..5a75df2e9 100644 --- a/danmaku/src/main/java/master/flame/danmaku/ui/widget/DanmakuView.java +++ b/danmaku/src/main/java/master/flame/danmaku/ui/widget/DanmakuView.java @@ -132,9 +132,10 @@ public class DanmakuView extends View implements IDanmakuView, IDanmakuViewContr return null; } - public void setCallback(Callback callback) { + public DanmakuView setCallback(Callback callback) { if (handler != null) handler.setCallback(callback); mCallback = callback; + return this; } public void setSpeed(float speed) { diff --git a/danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java b/danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java deleted file mode 100644 index 5304cb20c..000000000 --- a/danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java +++ /dev/null @@ -1,22 +0,0 @@ -package tv.cjump.jni; - -import android.os.Build; - -public class DeviceUtils { - - public static boolean isMiBox2Device() { - String manufacturer = Build.MANUFACTURER; - String productName = Build.PRODUCT; - return manufacturer.equalsIgnoreCase("Xiaomi") && productName.equalsIgnoreCase("dredd"); - } - - public static boolean isMagicBoxDevice() { - String manufacturer = Build.MANUFACTURER; - String productName = Build.PRODUCT; - return manufacturer.equalsIgnoreCase("MagicBox") && productName.equalsIgnoreCase("MagicBox"); - } - - public static boolean isProblemBoxDevice() { - return isMiBox2Device() || isMagicBoxDevice(); - } -}