Support setting fullscreen UI and generating events for it

This commit is contained in:
Hampton Maxwell 2018-05-17 15:42:44 -07:00
parent 97fac22524
commit ad8f6b49f5
2 changed files with 69 additions and 0 deletions

View File

@ -1,6 +1,7 @@
package com.brentvatne.exoplayer; package com.brentvatne.exoplayer;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.media.AudioManager; import android.media.AudioManager;
import android.net.Uri; import android.net.Uri;
@ -8,6 +9,8 @@ import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import com.brentvatne.react.R; import com.brentvatne.react.R;
@ -85,6 +88,7 @@ class ReactExoplayerView extends FrameLayout implements
private int resumeWindow; private int resumeWindow;
private long resumePosition; private long resumePosition;
private boolean loadVideoStarted; private boolean loadVideoStarted;
private boolean isFullscreen;
private boolean isPaused = true; private boolean isPaused = true;
private boolean isBuffering; private boolean isBuffering;
private float rate = 1f; private float rate = 1f;
@ -331,6 +335,9 @@ class ReactExoplayerView extends FrameLayout implements
} }
private void onStopPlayback() { private void onStopPlayback() {
if (isFullscreen) {
setFullscreen(false);
}
setKeepScreenOn(false); setKeepScreenOn(false);
audioManager.abandonAudioFocus(this); audioManager.abandonAudioFocus(this);
} }
@ -638,4 +645,37 @@ class ReactExoplayerView extends FrameLayout implements
public void setDisableFocus(boolean disableFocus) { public void setDisableFocus(boolean disableFocus) {
this.disableFocus = disableFocus; this.disableFocus = disableFocus;
} }
public void setFullscreen(boolean fullscreen) {
if (fullscreen == isFullscreen) {
return; // Avoid generating events when nothing is changing
}
isFullscreen = fullscreen;
Activity activity = themedReactContext.getCurrentActivity();
if (activity == null) {
return;
}
Window window = activity.getWindow();
View decorView = window.getDecorView();
int uiOptions;
if (isFullscreen) {
if (Util.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;
}
eventEmitter.fullscreenWillPresent();
decorView.setSystemUiVisibility(uiOptions);
eventEmitter.fullscreenDidPresent();
} else {
uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
eventEmitter.fullscreenWillDismiss();
decorView.setSystemUiVisibility(uiOptions);
eventEmitter.fullscreenDidDismiss();
}
}
} }

View File

@ -31,6 +31,11 @@ class VideoEventEmitter {
private static final String EVENT_PROGRESS = "onVideoProgress"; private static final String EVENT_PROGRESS = "onVideoProgress";
private static final String EVENT_SEEK = "onVideoSeek"; private static final String EVENT_SEEK = "onVideoSeek";
private static final String EVENT_END = "onVideoEnd"; private static final String EVENT_END = "onVideoEnd";
private static final String EVENT_FULLSCREEN_WILL_PRESENT = "onVideoFullscreenPlayerWillPresent";
private static final String EVENT_FULLSCREEN_DID_PRESENT = "onVideoFullscreenPlayerDidPresent";
private static final String EVENT_FULLSCREEN_WILL_DISMISS = "onVideoFullscreenPlayerWillDismiss";
private static final String EVENT_FULLSCREEN_DID_DISMISS = "onVideoFullscreenPlayerDidDismiss";
private static final String EVENT_STALLED = "onPlaybackStalled"; private static final String EVENT_STALLED = "onPlaybackStalled";
private static final String EVENT_RESUME = "onPlaybackResume"; private static final String EVENT_RESUME = "onPlaybackResume";
private static final String EVENT_READY = "onReadyForDisplay"; private static final String EVENT_READY = "onReadyForDisplay";
@ -48,6 +53,10 @@ class VideoEventEmitter {
EVENT_PROGRESS, EVENT_PROGRESS,
EVENT_SEEK, EVENT_SEEK,
EVENT_END, EVENT_END,
EVENT_FULLSCREEN_WILL_PRESENT,
EVENT_FULLSCREEN_DID_PRESENT,
EVENT_FULLSCREEN_WILL_DISMISS,
EVENT_FULLSCREEN_DID_DISMISS,
EVENT_STALLED, EVENT_STALLED,
EVENT_RESUME, EVENT_RESUME,
EVENT_READY, EVENT_READY,
@ -67,6 +76,10 @@ class VideoEventEmitter {
EVENT_PROGRESS, EVENT_PROGRESS,
EVENT_SEEK, EVENT_SEEK,
EVENT_END, EVENT_END,
EVENT_FULLSCREEN_WILL_PRESENT,
EVENT_FULLSCREEN_DID_PRESENT,
EVENT_FULLSCREEN_WILL_DISMISS,
EVENT_FULLSCREEN_DID_DISMISS,
EVENT_STALLED, EVENT_STALLED,
EVENT_RESUME, EVENT_RESUME,
EVENT_READY, EVENT_READY,
@ -175,6 +188,22 @@ class VideoEventEmitter {
receiveEvent(EVENT_END, null); receiveEvent(EVENT_END, null);
} }
void fullscreenWillPresent() {
receiveEvent(EVENT_FULLSCREEN_WILL_PRESENT, null);
}
void fullscreenDidPresent() {
receiveEvent(EVENT_FULLSCREEN_DID_PRESENT, null);
}
void fullscreenWillDismiss() {
receiveEvent(EVENT_FULLSCREEN_WILL_DISMISS, null);
}
void fullscreenDidDismiss() {
receiveEvent(EVENT_FULLSCREEN_DID_DISMISS, null);
}
void error(String errorString, Exception exception) { void error(String errorString, Exception exception) {
WritableMap error = Arguments.createMap(); WritableMap error = Arguments.createMap();
error.putString(EVENT_PROP_ERROR_STRING, errorString); error.putString(EVENT_PROP_ERROR_STRING, errorString);