Support danmu - part 7

pull/142/head
FongMi 3 years ago
parent 3095114428
commit 480fdd4faa
  1. 15
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  2. 1
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java
  3. 2
      app/src/mobile/res/layout/view_control_vod.xml
  4. 5
      danmaku/src/main/java/master/flame/danmaku/controller/CacheManagingDrawTask.java
  5. 73
      danmaku/src/main/java/master/flame/danmaku/controller/DrawHandler.java
  6. 2
      danmaku/src/main/java/master/flame/danmaku/controller/IDanmakuView.java
  7. 3
      danmaku/src/main/java/master/flame/danmaku/ui/widget/DanmakuView.java
  8. 22
      danmaku/src/main/java/tv/cjump/jni/DeviceUtils.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();
}
}

@ -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));
}

@ -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" />
<include

@ -38,7 +38,6 @@ import master.flame.danmaku.danmaku.model.objectpool.Pools;
import master.flame.danmaku.danmaku.renderer.IRenderer.RenderingState;
import master.flame.danmaku.danmaku.util.DanmakuUtils;
import master.flame.danmaku.danmaku.util.SystemClock;
import tv.cjump.jni.NativeBitmapFactory;
public class CacheManagingDrawTask extends DrawTask {
@ -122,9 +121,7 @@ public class CacheManagingDrawTask extends DrawTask {
@Override
public void seek(long mills) {
super.seek(mills);
if (mCacheManager == null) {
start();
}
if (mCacheManager == null) start();
mCacheManager.seek(mills);
}

@ -38,7 +38,6 @@ import master.flame.danmaku.danmaku.parser.BaseDanmakuParser;
import master.flame.danmaku.danmaku.renderer.IRenderer.RenderingState;
import master.flame.danmaku.danmaku.util.FrameHelper;
import master.flame.danmaku.danmaku.util.SystemClock;
import tv.cjump.jni.DeviceUtils;
public class DrawHandler extends Handler {
@ -47,6 +46,7 @@ public class DrawHandler extends Handler {
public static final int RESUME = 3;
public static final int SEEK_POS = 4;
public static final int PREPARE = 5;
private static final int QUIT = 6;
private static final int PAUSE = 7;
private static final int SHOW_DANMAKUS = 8;
@ -56,47 +56,51 @@ public class DrawHandler extends Handler {
private static final int UPDATE_WHEN_PAUSED = 12;
private static final int CLEAR_DANMAKUS_ON_SCREEN = 13;
private static final int FORCE_RENDER = 14;
private static final long INDEFINITE_TIME = 10000000;
private static final int MAX_RECORD_SIZE = 500;
private static final long INDEFINITE_TIME = 10000000;
private final RenderingState mRenderingState = new RenderingState();
private final LinkedList<Long> 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();
}

@ -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

@ -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) {

@ -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();
}
}
Loading…
Cancel
Save