From b144a50f41bdc6ea389767f8c4d0076d773aee70 Mon Sep 17 00:00:00 2001
From: wood1986 <5212215+wood1986@users.noreply.github.com>
Date: Thu, 14 Jul 2022 11:10:18 -0700
Subject: [PATCH] feat: add full screen support based on expo-av implementation
---
.../exoplayer/FullScreenPlayerView.java | 71 +++++++++++++++++++
.../exoplayer/ReactExoplayerView.java | 11 ++-
.../res/layout/exo_player_control_view.xml | 8 +++
android/src/main/res/values/styles.xml | 7 ++
4 files changed, 95 insertions(+), 2 deletions(-)
create mode 100644 android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.java
create mode 100644 android/src/main/res/values/styles.xml
diff --git a/android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.java b/android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.java
new file mode 100644
index 00000000..72e09aae
--- /dev/null
+++ b/android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.java
@@ -0,0 +1,71 @@
+package com.brentvatne.exoplayer;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ImageButton;
+
+import com.google.android.exoplayer2.ui.PlayerControlView;
+
+public class FullScreenPlayerView extends Dialog {
+ private final PlayerControlView playerControlView;
+ private final ExoPlayerView exoPlayerView;
+ private ViewGroup parent;
+ private final FrameLayout containerView;
+
+ public FullScreenPlayerView(Context context, ExoPlayerView exoPlayerView, PlayerControlView playerControlView) {
+ super(context, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
+ this.playerControlView = playerControlView;
+ this.exoPlayerView = exoPlayerView;
+ containerView = new FrameLayout(context);
+ setContentView(containerView, generateDefaultLayoutParams());
+ }
+
+ @Override
+ protected void onStart() {
+ parent = (FrameLayout)(exoPlayerView.getParent());
+
+ parent.removeView(exoPlayerView);
+ containerView.addView(exoPlayerView, generateDefaultLayoutParams());
+
+ if (playerControlView != null) {
+ ImageButton imageButton = playerControlView.findViewById(com.brentvatne.react.R.id.exo_fullscreen);
+ imageButton.setBackgroundResource(com.google.android.exoplayer2.ui.R.drawable.exo_icon_fullscreen_exit);
+ imageButton.setContentDescription(getContext().getString(com.google.android.exoplayer2.ui.R.string.exo_controls_fullscreen_exit_description));
+ parent.removeView(playerControlView);
+ containerView.addView(playerControlView, generateDefaultLayoutParams());
+
+ }
+
+ super.onStart();
+ }
+
+ @Override
+ protected void onStop() {
+ containerView.removeView(exoPlayerView);
+ parent.addView(exoPlayerView, generateDefaultLayoutParams());
+
+ if (playerControlView != null) {
+ ImageButton imageButton = playerControlView.findViewById(com.brentvatne.react.R.id.exo_fullscreen);
+ imageButton.setBackgroundResource(com.google.android.exoplayer2.ui.R.drawable.exo_icon_fullscreen_enter);
+ imageButton.setContentDescription(getContext().getString(com.google.android.exoplayer2.ui.R.string.exo_controls_fullscreen_enter_description));
+ containerView.removeView(playerControlView);
+ parent.addView(playerControlView, generateDefaultLayoutParams());
+ }
+
+ parent.requestLayout();
+ parent = null;
+
+ super.onStop();
+ }
+
+ private FrameLayout.LayoutParams generateDefaultLayoutParams() {
+ FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
+ FrameLayout.LayoutParams.MATCH_PARENT,
+ FrameLayout.LayoutParams.MATCH_PARENT
+ );
+ layoutParams.setMargins(0, 0, 0, 0);
+ return layoutParams;
+ }
+}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
index 9a334132..c80d86f5 100644
--- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
+++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
@@ -140,6 +140,7 @@ class ReactExoplayerView extends FrameLayout implements
private Player.Listener eventListener;
private ExoPlayerView exoPlayerView;
+ private FullScreenPlayerView fullScreenPlayerView;
private DataSource.Factory mediaDataSourceFactory;
private ExoPlayer player;
@@ -399,6 +400,10 @@ class ReactExoplayerView extends FrameLayout implements
}
});
+ //Handling the fullScreenButton click event
+ ImageButton fullScreenButton = playerControlView.findViewById(R.id.exo_fullscreen);
+ fullScreenButton.setOnClickListener(v -> setFullscreen(!isFullscreen));
+
// Invoking onPlaybackStateChanged and onPlayWhenReadyChanged events for Player
eventListener = new Player.Listener() {
@Override
@@ -664,6 +669,7 @@ class ReactExoplayerView extends FrameLayout implements
setControls(controls);
applyModifiers();
startBufferCheckTimer();
+ fullScreenPlayerView = new FullScreenPlayerView(getContext(), exoPlayerView, playerControlView);
}
private DrmSessionManager buildDrmSessionManager(UUID uuid, String licenseUrl, String[] keyRequestPropertiesArray) throws UnsupportedDrmException {
@@ -1770,14 +1776,15 @@ class ReactExoplayerView extends FrameLayout implements
| SYSTEM_UI_FLAG_FULLSCREEN;
}
eventEmitter.fullscreenWillPresent();
- decorView.setSystemUiVisibility(uiOptions);
+ fullScreenPlayerView.show();
eventEmitter.fullscreenDidPresent();
} else {
uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
eventEmitter.fullscreenWillDismiss();
- decorView.setSystemUiVisibility(uiOptions);
+ fullScreenPlayerView.dismiss();
eventEmitter.fullscreenDidDismiss();
}
+ post(() -> decorView.setSystemUiVisibility(uiOptions));
}
public void setUseTextureView(boolean useTextureView) {
diff --git a/android/src/main/res/layout/exo_player_control_view.xml b/android/src/main/res/layout/exo_player_control_view.xml
index becee6a9..19440912 100644
--- a/android/src/main/res/layout/exo_player_control_view.xml
+++ b/android/src/main/res/layout/exo_player_control_view.xml
@@ -71,6 +71,14 @@
android:paddingRight="4dp"
android:includeFontPadding="false"
android:textColor="#FFBEBEBE"/>
+
+
diff --git a/android/src/main/res/values/styles.xml b/android/src/main/res/values/styles.xml
new file mode 100644
index 00000000..3459d9d6
--- /dev/null
+++ b/android/src/main/res/values/styles.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file