From 18efffbd1a876e59dc1fdbefb5f00d7f2b958829 Mon Sep 17 00:00:00 2001 From: Hampton Maxwell Date: Tue, 17 Jul 2018 17:47:19 -0700 Subject: [PATCH] Implement hacky fullscreen This only handles the controls portion of fullscreen. It doesn't make the video use the entire screen, that still needs to be done via styles. Will be implemented later --- .../com/brentvatne/react/ReactVideoView.java | 46 ++++++++++++++++++- .../react/ReactVideoViewManager.java | 6 +++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/brentvatne/react/ReactVideoView.java b/android/src/main/java/com/brentvatne/react/ReactVideoView.java index 954130a1..7cc0aca3 100644 --- a/android/src/main/java/com/brentvatne/react/ReactVideoView.java +++ b/android/src/main/java/com/brentvatne/react/ReactVideoView.java @@ -1,6 +1,7 @@ package com.brentvatne.react; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.graphics.Matrix; import android.media.MediaPlayer; @@ -9,6 +10,8 @@ import android.os.Build; import android.os.Handler; import android.util.Log; import android.view.MotionEvent; +import android.view.View; +import android.view.Window; import android.webkit.CookieManager; import android.widget.MediaController; @@ -46,7 +49,11 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP EVENT_END("onVideoEnd"), EVENT_STALLED("onPlaybackStalled"), EVENT_RESUME("onPlaybackResume"), - EVENT_READY_FOR_DISPLAY("onReadyForDisplay"); + EVENT_READY_FOR_DISPLAY("onReadyForDisplay"), + EVENT_FULLSCREEN_WILL_PRESENT("onVideoFullscreenPlayerWillPresent"), + EVENT_FULLSCREEN_DID_PRESENT("onVideoFullscreenPlayerDidPresent"), + EVENT_FULLSCREEN_WILL_DISMISS("onVideoFullscreenPlayerWillDismiss"), + EVENT_FULLSCREEN_DID_DISMISS("onVideoFullscreenPlayerDidDismiss"); private final String mName; @@ -106,6 +113,7 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP private float mActiveRate = 1.0f; private boolean mPlayInBackground = false; private boolean mBackgroundPaused = false; + private boolean mIsFullscreen = false; private int mMainVer = 0; private int mPatchVer = 0; @@ -208,6 +216,9 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP mMediaPlayerValid = false; release(); } + if (mIsFullscreen) { + setFullscreen(false); + } } public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders) { @@ -439,6 +450,39 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP } } + public void setFullscreen(boolean isFullscreen) { + if (isFullscreen == mIsFullscreen) { + return; // Avoid generating events when nothing is changing + } + mIsFullscreen = isFullscreen; + + Activity activity = mThemedReactContext.getCurrentActivity(); + if (activity == null) { + return; + } + Window window = activity.getWindow(); + View decorView = window.getDecorView(); + int uiOptions; + if (mIsFullscreen) { + if (Build.VERSION.SDK_INT >= 19) { // 4.4+ + uiOptions = SYSTEM_UI_FLAG_HIDE_NAVIGATION + | SYSTEM_UI_FLAG_IMMERSIVE_STICKY + | SYSTEM_UI_FLAG_FULLSCREEN; + } else { + uiOptions = SYSTEM_UI_FLAG_HIDE_NAVIGATION + | SYSTEM_UI_FLAG_FULLSCREEN; + } + mEventEmitter.receiveEvent(getId(), Events.EVENT_FULLSCREEN_WILL_PRESENT.toString(), null); + decorView.setSystemUiVisibility(uiOptions); + mEventEmitter.receiveEvent(getId(), Events.EVENT_FULLSCREEN_DID_PRESENT.toString(), null); + } else { + uiOptions = View.SYSTEM_UI_FLAG_VISIBLE; + mEventEmitter.receiveEvent(getId(), Events.EVENT_FULLSCREEN_WILL_DISMISS.toString(), null); + decorView.setSystemUiVisibility(uiOptions); + mEventEmitter.receiveEvent(getId(), Events.EVENT_FULLSCREEN_DID_DISMISS.toString(), null); + } + } + public void applyModifiers() { setResizeModeModifier(mResizeMode); setRepeatModifier(mRepeat); diff --git a/android/src/main/java/com/brentvatne/react/ReactVideoViewManager.java b/android/src/main/java/com/brentvatne/react/ReactVideoViewManager.java index 7973121a..dbf152a8 100644 --- a/android/src/main/java/com/brentvatne/react/ReactVideoViewManager.java +++ b/android/src/main/java/com/brentvatne/react/ReactVideoViewManager.java @@ -35,6 +35,7 @@ public class ReactVideoViewManager extends SimpleViewManager { public static final String PROP_PROGRESS_UPDATE_INTERVAL = "progressUpdateInterval"; public static final String PROP_SEEK = "seek"; public static final String PROP_RATE = "rate"; + public static final String PROP_FULLSCREEN = "fullscreen"; public static final String PROP_PLAY_IN_BACKGROUND = "playInBackground"; public static final String PROP_CONTROLS = "controls"; @@ -148,6 +149,11 @@ public class ReactVideoViewManager extends SimpleViewManager { videoView.setRateModifier(rate); } + @ReactProp(name = PROP_FULLSCREEN, defaultBoolean = false) + public void setFullscreen(final ReactVideoView videoView, final boolean fullscreen) { + videoView.setFullscreen(fullscreen); + } + @ReactProp(name = PROP_PLAY_IN_BACKGROUND, defaultBoolean = false) public void setPlayInBackground(final ReactVideoView videoView, final boolean playInBackground) { videoView.setPlayInBackground(playInBackground);