From 94bceb472bce35b08e04b2e93bb0c11096ce30fe Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sat, 4 Jul 2020 17:41:15 +0700 Subject: [PATCH 1/9] add fullscreen activity --- .../ExoPlayerFullscreenVideoActivity.java | 107 ++++++++++++++++++ .../brentvatne/exoplayer/ExoPlayerView.java | 3 - .../exoplayer/ReactExoplayerView.java | 91 ++++++++++----- .../res/layout/exo_player_control_view.xml | 19 +++- .../layout/exo_player_fullscreen_video.xml | 18 +++ android/src/main/AndroidManifest.xml | 8 +- 6 files changed, 211 insertions(+), 35 deletions(-) create mode 100644 android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java create mode 100644 android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java new file mode 100644 index 00000000..1f2ee1d5 --- /dev/null +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -0,0 +1,107 @@ +package com.brentvatne.exoplayer; + +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.brentvatne.react.R; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.ui.PlayerControlView; + +public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implements ReactExoplayerView.FullScreenDelegate { + public static final String EXTRA_ID = "extra_id"; + public static final String EXTRA_IS_PLAYING = "extra_is_playing"; + + private int id; + private PlayerControlView playerControlView; + private SimpleExoPlayer player; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.exo_player_fullscreen_video); + id = getIntent().getIntExtra(EXTRA_ID, -1); + player = ReactExoplayerView.getViewInstance(id).getPlayer(); + + ExoPlayerView playerView = findViewById(R.id.player_view); + playerView.setPlayer(player); + playerView.setOnClickListener(v -> togglePlayerControlVisibility()); + + playerControlView = findViewById(R.id.player_controls); + playerControlView.setPlayer(player); + // Set the fullscreen button to "close fullscreen" icon + ImageView fullscreenIcon = playerControlView.findViewById(R.id.exo_fullscreen_icon); + fullscreenIcon.setImageResource(R.drawable.exo_controls_fullscreen_exit); + playerControlView.findViewById(R.id.exo_fullscreen_button) + .setOnClickListener(v -> finish()); + } + + @Override + public void onResume() { + super.onResume(); + boolean isPlaying = getIntent().getBooleanExtra(EXTRA_IS_PLAYING, false); + player.setPlayWhenReady(isPlaying); + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); + } + + @Override + public void onPause() { + super.onPause(); + boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; + ReactExoplayerView.getViewInstance(id).setPausedModifier(!isPlaying); + player.setPlayWhenReady(false); + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus) { + hideSystemUI(); + } + } + + private void togglePlayerControlVisibility() { + if (playerControlView.isVisible()) { + playerControlView.hide(); + } else { + playerControlView.show(); + } + } + + /** + * Enables regular immersive mode. + */ + private void hideSystemUI() { + View decorView = getWindow().getDecorView(); + decorView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_IMMERSIVE + // Set the content to appear under the system bars so that the + // content doesn't resize when the system bars hide and show. + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + // Hide the nav bar and status bar + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN); + } + + /** + * Shows the system bars by removing all the flags + * except for the ones that make the content appear under the system bars. + */ + private void showSystemUI() { + View decorView = getWindow().getDecorView(); + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } + + @Override + public void closeFullScreen() { + finish(); + } +} diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java index afa5106c..1a244f29 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java @@ -120,9 +120,6 @@ public final class ExoPlayerView extends FrameLayout { * @param player The {@link SimpleExoPlayer} to use. */ public void setPlayer(SimpleExoPlayer player) { - if (this.player == player) { - return; - } if (this.player != null) { this.player.setTextOutput(null); this.player.setVideoListener(null); diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 4e6fea58..6cd6b844 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -1,8 +1,8 @@ package com.brentvatne.exoplayer; import android.annotation.SuppressLint; -import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; @@ -10,10 +10,12 @@ import android.os.Message; import android.text.TextUtils; import android.util.Log; import android.view.View; -import android.view.Window; import android.view.accessibility.CaptioningManager; import android.widget.FrameLayout; -import android.widget.ImageButton; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentTransaction; import com.brentvatne.react.R; import com.brentvatne.receiver.AudioBecomingNoisyReceiver; @@ -25,28 +27,33 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.modules.timepicker.TimePickerDialogFragment; +import com.facebook.react.uimanager.NativeViewHierarchyManager; import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.UIBlock; +import com.facebook.react.uimanager.UIManagerModule; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; -import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.metadata.Metadata; -import com.google.android.exoplayer2.metadata.MetadataOutput; +import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.source.BehindLiveWindowException; +import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MergingMediaSource; -import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.SingleSampleMediaSource; -import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; @@ -57,17 +64,20 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; -import com.google.android.exoplayer2.ui.PlayerControlView; -import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.ui.PlayerControlView; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; +import java.lang.Math; +import java.util.HashMap; +import java.util.Map; +import java.lang.Object; import java.util.ArrayList; import java.util.Locale; import java.util.Map; @@ -91,6 +101,11 @@ class ReactExoplayerView extends FrameLayout implements DEFAULT_COOKIE_MANAGER.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); } + private static Map instances = new HashMap<>(); + private static int UNIQUE_ID = 0; + private int uid = ++UNIQUE_ID; + private FullScreenDelegate fullScreenDelegate; + private final VideoEventEmitter eventEmitter; private final ReactExoplayerConfig config; private final DefaultBandwidthMeter bandwidthMeter; @@ -187,7 +202,6 @@ class ReactExoplayerView extends FrameLayout implements createViews(); audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - themedReactContext.addLifecycleEventListener(this); audioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(themedReactContext); initializePlayer(); @@ -235,6 +249,7 @@ class ReactExoplayerView extends FrameLayout implements @Override public void onHostResume() { + exoPlayerView.setPlayer(player); if (!playInBackground || !isInBackground) { setPlayWhenReady(!isPaused); } @@ -275,6 +290,22 @@ class ReactExoplayerView extends FrameLayout implements } } + public static ReactExoplayerView getViewInstance(Integer uid) { + return instances.get(uid); + } + + public SimpleExoPlayer getPlayer() { + return player; + } + + public boolean isPaused() { + return isPaused; + } + + public void registerFullScreenDelegate(FullScreenDelegate delegate) { + this.fullScreenDelegate = delegate; + } + // Internal methods /** @@ -290,6 +321,15 @@ class ReactExoplayerView extends FrameLayout implements } } + private void showFullscreen() { + instances.put(uid, this); + Intent intent = new Intent(getContext(), ExoPlayerFullscreenVideoActivity.class); + intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); + boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; + intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_IS_PLAYING, isPlaying); + getContext().startActivity(intent); + } + /** * Initializing Player control */ @@ -302,6 +342,7 @@ class ReactExoplayerView extends FrameLayout implements playerControlView.setPlayer(player); playerControlView.show(); playPauseControlContainer = playerControlView.findViewById(R.id.exo_play_pause_container); + playerControlView.findViewById(R.id.exo_fullscreen_button).setOnClickListener(v -> showFullscreen()); // Invoking onClick event for exoplayerView exoPlayerView.setOnClickListener(new OnClickListener() { @@ -374,6 +415,7 @@ class ReactExoplayerView extends FrameLayout implements } private void initializePlayer() { + themedReactContext.addLifecycleEventListener(this); ReactExoplayerView self = this; // This ensures all props have been settled, to avoid async racing conditions. new Handler().postDelayed(new Runnable() { @@ -1217,30 +1259,15 @@ class ReactExoplayerView extends FrameLayout implements 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); + showFullscreen(); eventEmitter.fullscreenDidPresent(); } else { - uiOptions = View.SYSTEM_UI_FLAG_VISIBLE; eventEmitter.fullscreenWillDismiss(); - decorView.setSystemUiVisibility(uiOptions); + if (fullScreenDelegate != null) { + fullScreenDelegate.closeFullScreen(); + } eventEmitter.fullscreenDidDismiss(); } } @@ -1279,4 +1306,8 @@ class ReactExoplayerView extends FrameLayout implements } } } + + public interface FullScreenDelegate { + void closeFullScreen(); + } } diff --git a/android-exoplayer/src/main/res/layout/exo_player_control_view.xml b/android-exoplayer/src/main/res/layout/exo_player_control_view.xml index becee6a9..51cbf3a8 100644 --- a/android-exoplayer/src/main/res/layout/exo_player_control_view.xml +++ b/android-exoplayer/src/main/res/layout/exo_player_control_view.xml @@ -1,5 +1,6 @@ - + + + + + + diff --git a/android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml b/android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml new file mode 100644 index 00000000..671a00ee --- /dev/null +++ b/android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 3535ad44..2d632b3d 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,3 +1,9 @@ + package="com.brentvatne.react"> + + + + From 32880544e5aa7424067feefa6f947b3e0e5b6688 Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sat, 4 Jul 2020 22:08:57 +0700 Subject: [PATCH 2/9] update manifest and import --- .../src/main/AndroidManifest.xml | 5 ++++ .../exoplayer/ReactExoplayerView.java | 28 ++++++------------- android/src/main/AndroidManifest.xml | 6 ---- 3 files changed, 14 insertions(+), 25 deletions(-) diff --git a/android-exoplayer/src/main/AndroidManifest.xml b/android-exoplayer/src/main/AndroidManifest.xml index 3535ad44..39515895 100644 --- a/android-exoplayer/src/main/AndroidManifest.xml +++ b/android-exoplayer/src/main/AndroidManifest.xml @@ -1,3 +1,8 @@ + + + diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 6cd6b844..5d546877 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -12,10 +12,7 @@ import android.util.Log; import android.view.View; import android.view.accessibility.CaptioningManager; import android.widget.FrameLayout; - -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.fragment.app.FragmentTransaction; +import android.widget.ImageButton; import com.brentvatne.react.R; import com.brentvatne.receiver.AudioBecomingNoisyReceiver; @@ -27,33 +24,28 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; -import com.facebook.react.modules.timepicker.TimePickerDialogFragment; -import com.facebook.react.uimanager.NativeViewHierarchyManager; import com.facebook.react.uimanager.ThemedReactContext; -import com.facebook.react.uimanager.UIBlock; -import com.facebook.react.uimanager.UIManagerModule; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.metadata.Metadata; -import com.google.android.exoplayer2.metadata.MetadataRenderer; +import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.BehindLiveWindowException; -import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MergingMediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.SingleSampleMediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; @@ -64,21 +56,19 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.ui.PlayerControlView; +import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultAllocator; -import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.ui.PlayerControlView; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; -import java.lang.Math; -import java.util.HashMap; -import java.util.Map; -import java.lang.Object; import java.util.ArrayList; +import java.util.HashMap; import java.util.Locale; import java.util.Map; diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 2d632b3d..42a828cc 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,9 +1,3 @@ - - - - From 0b7ea71d7707516c8c108f021f70477e962c7bcb Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sun, 5 Jul 2020 11:00:25 +0700 Subject: [PATCH 3/9] update fullscreen activity --- .../src/main/AndroidManifest.xml | 3 +- .../ExoPlayerFullscreenVideoActivity.java | 35 +++++++++++++++---- .../exoplayer/ReactExoplayerView.java | 16 ++++++--- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/android-exoplayer/src/main/AndroidManifest.xml b/android-exoplayer/src/main/AndroidManifest.xml index 39515895..53e507e0 100644 --- a/android-exoplayer/src/main/AndroidManifest.xml +++ b/android-exoplayer/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ + android:configChanges="orientation|keyboardHidden|screenSize" + android:launchMode="singleTop" /> diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 1f2ee1d5..5492145f 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -1,6 +1,7 @@ package com.brentvatne.exoplayer; import android.os.Bundle; +import android.view.KeyEvent; import android.view.View; import android.widget.ImageView; @@ -13,7 +14,6 @@ import com.google.android.exoplayer2.ui.PlayerControlView; public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implements ReactExoplayerView.FullScreenDelegate { public static final String EXTRA_ID = "extra_id"; - public static final String EXTRA_IS_PLAYING = "extra_is_playing"; private int id; private PlayerControlView playerControlView; @@ -36,26 +36,40 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen ImageView fullscreenIcon = playerControlView.findViewById(R.id.exo_fullscreen_icon); fullscreenIcon.setImageResource(R.drawable.exo_controls_fullscreen_exit); playerControlView.findViewById(R.id.exo_fullscreen_button) - .setOnClickListener(v -> finish()); + .setOnClickListener(v -> ReactExoplayerView.getViewInstance(id).setFullscreen(false)); + //Handling the playButton click event + playerControlView.findViewById(R.id.exo_play).setOnClickListener(v -> { + if (player != null && player.getPlaybackState() == Player.STATE_ENDED) { + player.seekTo(0); + } + ReactExoplayerView.getViewInstance(id).setPausedModifier(false); + }); + + //Handling the pauseButton click event + playerControlView.findViewById(R.id.exo_pause).setOnClickListener(v -> ReactExoplayerView.getViewInstance(id).setPausedModifier(true)); } @Override public void onResume() { super.onResume(); - boolean isPlaying = getIntent().getBooleanExtra(EXTRA_IS_PLAYING, false); - player.setPlayWhenReady(isPlaying); + boolean isPaused = ReactExoplayerView.getViewInstance(id).isPaused(); + player.setPlayWhenReady(!isPaused); ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); } @Override public void onPause() { super.onPause(); - boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; - ReactExoplayerView.getViewInstance(id).setPausedModifier(!isPlaying); player.setPlayWhenReady(false); ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); } + @Override + protected void onDestroy() { + super.onDestroy(); + ReactExoplayerView.getViewInstance(id).removeViewInstance(); + } + @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); @@ -64,6 +78,15 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen } } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_BACK)) { + ReactExoplayerView.getViewInstance(id).setFullscreen(false); + return false; + } + return super.onKeyDown(keyCode, event); + } + private void togglePlayerControlVisibility() { if (playerControlView.isVisible()) { playerControlView.hide(); diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 5d546877..38bcd827 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -239,9 +239,13 @@ class ReactExoplayerView extends FrameLayout implements @Override public void onHostResume() { - exoPlayerView.setPlayer(player); if (!playInBackground || !isInBackground) { - setPlayWhenReady(!isPaused); + if (player != null) { + exoPlayerView.setPlayer(player); + boolean temp = this.disableFocus; + player.setPlayWhenReady(!isPaused); + this.disableFocus = temp; + } } isInBackground = false; } @@ -296,6 +300,10 @@ class ReactExoplayerView extends FrameLayout implements this.fullScreenDelegate = delegate; } + public void removeViewInstance() { + instances.remove(uid); + } + // Internal methods /** @@ -315,8 +323,6 @@ class ReactExoplayerView extends FrameLayout implements instances.put(uid, this); Intent intent = new Intent(getContext(), ExoPlayerFullscreenVideoActivity.class); intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); - boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; - intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_IS_PLAYING, isPlaying); getContext().startActivity(intent); } @@ -332,7 +338,7 @@ class ReactExoplayerView extends FrameLayout implements playerControlView.setPlayer(player); playerControlView.show(); playPauseControlContainer = playerControlView.findViewById(R.id.exo_play_pause_container); - playerControlView.findViewById(R.id.exo_fullscreen_button).setOnClickListener(v -> showFullscreen()); + playerControlView.findViewById(R.id.exo_fullscreen_button).setOnClickListener(v -> setFullscreen(true)); // Invoking onClick event for exoplayerView exoPlayerView.setOnClickListener(new OnClickListener() { From 5fe76574bbf30b7ea95fa4308760c12b26377f5e Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Fri, 10 Jul 2020 10:45:41 +0700 Subject: [PATCH 4/9] add fullscreenOrientation --- README.md | 2 +- .../ExoPlayerFullscreenVideoActivity.java | 33 ++++++++++++------- .../exoplayer/ReactExoplayerView.java | 11 ++++--- .../exoplayer/ReactExoplayerViewManager.java | 6 ++++ 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 00fc7932..3e701aa7 100644 --- a/README.md +++ b/README.md @@ -469,7 +469,7 @@ Platforms: iOS * **landscape** * **portrait** -Platforms: iOS +Platforms: Android ExoPlayer, iOS #### headers Pass headers to the HTTP client. Can be used for authorization. Headers must be a part of the source object. diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 5492145f..6996eb6c 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -1,5 +1,6 @@ package com.brentvatne.exoplayer; +import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; @@ -14,7 +15,8 @@ import com.google.android.exoplayer2.ui.PlayerControlView; public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implements ReactExoplayerView.FullScreenDelegate { public static final String EXTRA_ID = "extra_id"; - + public static final String EXTRA_ORIENTATION = "extra_orientation"; + private int id; private PlayerControlView playerControlView; private SimpleExoPlayer player; @@ -22,8 +24,14 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.exo_player_fullscreen_video); id = getIntent().getIntExtra(EXTRA_ID, -1); + String orientation = getIntent().getStringExtra(EXTRA_ORIENTATION); + if ("landscape".equals(orientation)) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + } else if ("portrait".equals(orientation)) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); + } + setContentView(R.layout.exo_player_fullscreen_video); player = ReactExoplayerView.getViewInstance(id).getPlayer(); ExoPlayerView playerView = findViewById(R.id.player_view); @@ -54,20 +62,18 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen super.onResume(); boolean isPaused = ReactExoplayerView.getViewInstance(id).isPaused(); player.setPlayWhenReady(!isPaused); - ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); + if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); + } } @Override public void onPause() { super.onPause(); player.setPlayWhenReady(false); - ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - ReactExoplayerView.getViewInstance(id).removeViewInstance(); + if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); + } } @Override @@ -81,8 +87,11 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { - ReactExoplayerView.getViewInstance(id).setFullscreen(false); - return false; + if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).setFullscreen(false); + return false; + } + return true; } return super.onKeyDown(keyCode, event); } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 38bcd827..875d3402 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -114,6 +114,7 @@ class ReactExoplayerView extends FrameLayout implements private long resumePosition; private boolean loadVideoStarted; private boolean isFullscreen; + private String fullScreenOrientation; private boolean isInBackground; private boolean isPaused; private boolean isBuffering; @@ -266,6 +267,7 @@ class ReactExoplayerView extends FrameLayout implements public void cleanUpResources() { stopPlayback(); + instances.remove(uid); } //BandwidthMeter.EventListener implementation @@ -300,10 +302,6 @@ class ReactExoplayerView extends FrameLayout implements this.fullScreenDelegate = delegate; } - public void removeViewInstance() { - instances.remove(uid); - } - // Internal methods /** @@ -323,6 +321,7 @@ class ReactExoplayerView extends FrameLayout implements instances.put(uid, this); Intent intent = new Intent(getContext(), ExoPlayerFullscreenVideoActivity.class); intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); + intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ORIENTATION, this.fullScreenOrientation); getContext().startActivity(intent); } @@ -1268,6 +1267,10 @@ class ReactExoplayerView extends FrameLayout implements } } + public void setFullscreenOrientation(String orientation) { + this.fullScreenOrientation = orientation; + } + public void setUseTextureView(boolean useTextureView) { exoPlayerView.setUseTextureView(useTextureView); } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index cf50fdae..d520970d 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -54,6 +54,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager Date: Mon, 13 Jul 2020 14:41:38 +0700 Subject: [PATCH 5/9] do not hide fullscreen in stopPlayback --- .../ExoPlayerFullscreenVideoActivity.java | 3 +- .../exoplayer/ReactExoplayerView.java | 29 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 6996eb6c..329a8fda 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -60,9 +60,8 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen @Override public void onResume() { super.onResume(); - boolean isPaused = ReactExoplayerView.getViewInstance(id).isPaused(); - player.setPlayWhenReady(!isPaused); if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).syncPlayerState(); ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); } } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 875d3402..83d70361 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -116,6 +116,7 @@ class ReactExoplayerView extends FrameLayout implements private boolean isFullscreen; private String fullScreenOrientation; private boolean isInBackground; + private boolean isInFullscreen; private boolean isPaused; private boolean isBuffering; private boolean muted = false; @@ -241,11 +242,14 @@ class ReactExoplayerView extends FrameLayout implements @Override public void onHostResume() { if (!playInBackground || !isInBackground) { - if (player != null) { - exoPlayerView.setPlayer(player); - boolean temp = this.disableFocus; - player.setPlayWhenReady(!isPaused); - this.disableFocus = temp; + if (isInFullscreen) { + if (player != null) { + exoPlayerView.setPlayer(player); + syncPlayerState(); + } + isInFullscreen = false; + } else { + setPlayWhenReady(!isPaused); } } isInBackground = false; @@ -294,8 +298,15 @@ class ReactExoplayerView extends FrameLayout implements return player; } - public boolean isPaused() { - return isPaused; + public void syncPlayerState() { + if (player == null) return; + if (player.getPlaybackState() == Player.STATE_ENDED) { + // Try to get last frame displayed + player.seekTo(player.getDuration() - 200); + player.setPlayWhenReady(true); + } else { + player.setPlayWhenReady(!isPaused); + } } public void registerFullScreenDelegate(FullScreenDelegate delegate) { @@ -323,6 +334,7 @@ class ReactExoplayerView extends FrameLayout implements intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ORIENTATION, this.fullScreenOrientation); getContext().startActivity(intent); + isInFullscreen = true; } /** @@ -623,9 +635,6 @@ class ReactExoplayerView extends FrameLayout implements } private void onStopPlayback() { - if (isFullscreen) { - setFullscreen(false); - } audioManager.abandonAudioFocus(this); } From 4d35511fb98f5494fc915502f5fe7799237ab724 Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Mon, 13 Jul 2020 14:50:09 +0700 Subject: [PATCH 6/9] add delay when hideSystemUI --- .../brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 329a8fda..d3b87208 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -79,7 +79,7 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { - hideSystemUI(); + playerControlView.postDelayed(this::hideSystemUI, 200); } } From d094886087c046bc79888c47f48833463bf7350a Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sun, 13 Jun 2021 12:06:37 +0700 Subject: [PATCH 7/9] keep screen on when in fullscreen mode --- .../brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index d3b87208..09b2cdfd 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -4,6 +4,7 @@ import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; +import android.view.WindowManager; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; @@ -24,6 +25,8 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + id = getIntent().getIntExtra(EXTRA_ID, -1); String orientation = getIntent().getStringExtra(EXTRA_ORIENTATION); if ("landscape".equals(orientation)) { From 7c17f5ec96e7913ffe5d97db952c061882ab4681 Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Fri, 6 Aug 2021 10:56:07 +0700 Subject: [PATCH 8/9] Update ReactExoplayerView.java --- .../main/java/com/brentvatne/exoplayer/ReactExoplayerView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 9ada2571..f2469032 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -460,7 +460,7 @@ class ReactExoplayerView extends FrameLayout implements new DefaultRenderersFactory(getContext()) .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); player = new SimpleExoPlayer.Builder(getContext(), renderersFactory) - .setTrackSelector​(trackSelector) + .setTrackSelector(trackSelector) .setBandwidthMeter(bandwidthMeter) .setLoadControl(defaultLoadControl) .build(); From 7373761a4c9566650179e40bba52681ff9b8cec2 Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sun, 12 Dec 2021 13:47:50 +0700 Subject: [PATCH 9/9] check null before trigger action --- .../ExoPlayerFullscreenVideoActivity.java | 46 ++++++++++++------- .../exoplayer/ReactExoplayerView.java | 18 ++------ 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 09b2cdfd..d2e6f2d3 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -15,19 +15,23 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.ui.PlayerControlView; public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implements ReactExoplayerView.FullScreenDelegate { - public static final String EXTRA_ID = "extra_id"; + public static final String EXTRA_EXO_PLAYER_VIEW_ID = "extra_id"; public static final String EXTRA_ORIENTATION = "extra_orientation"; - - private int id; + + private ReactExoplayerView exoplayerView; private PlayerControlView playerControlView; private SimpleExoPlayer player; @Override public void onCreate(Bundle savedInstanceState) { + int exoplayerViewId = getIntent().getIntExtra(EXTRA_EXO_PLAYER_VIEW_ID, -1); + exoplayerView = ReactExoplayerView.getViewInstance(exoplayerViewId); + if (exoplayerView == null) { + finish(); + return; + } super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); - - id = getIntent().getIntExtra(EXTRA_ID, -1); String orientation = getIntent().getStringExtra(EXTRA_ORIENTATION); if ("landscape".equals(orientation)) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); @@ -35,7 +39,7 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); } setContentView(R.layout.exo_player_fullscreen_video); - player = ReactExoplayerView.getViewInstance(id).getPlayer(); + player = exoplayerView.getPlayer(); ExoPlayerView playerView = findViewById(R.id.player_view); playerView.setPlayer(player); @@ -47,25 +51,35 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen ImageView fullscreenIcon = playerControlView.findViewById(R.id.exo_fullscreen_icon); fullscreenIcon.setImageResource(R.drawable.exo_controls_fullscreen_exit); playerControlView.findViewById(R.id.exo_fullscreen_button) - .setOnClickListener(v -> ReactExoplayerView.getViewInstance(id).setFullscreen(false)); + .setOnClickListener(v -> { + if (exoplayerView != null) { + exoplayerView.setFullscreen(false); + } + }); //Handling the playButton click event playerControlView.findViewById(R.id.exo_play).setOnClickListener(v -> { if (player != null && player.getPlaybackState() == Player.STATE_ENDED) { player.seekTo(0); } - ReactExoplayerView.getViewInstance(id).setPausedModifier(false); + if (exoplayerView != null) { + exoplayerView.setPausedModifier(false); + } }); //Handling the pauseButton click event - playerControlView.findViewById(R.id.exo_pause).setOnClickListener(v -> ReactExoplayerView.getViewInstance(id).setPausedModifier(true)); + playerControlView.findViewById(R.id.exo_pause).setOnClickListener(v -> { + if (exoplayerView != null) { + exoplayerView.setPausedModifier(true); + } + }); } @Override public void onResume() { super.onResume(); - if (ReactExoplayerView.getViewInstance(id) != null) { - ReactExoplayerView.getViewInstance(id).syncPlayerState(); - ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); + if (exoplayerView != null) { + exoplayerView.syncPlayerState(); + exoplayerView.registerFullScreenDelegate(this); } } @@ -73,8 +87,8 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen public void onPause() { super.onPause(); player.setPlayWhenReady(false); - if (ReactExoplayerView.getViewInstance(id) != null) { - ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); + if (exoplayerView != null) { + exoplayerView.registerFullScreenDelegate(null); } } @@ -89,8 +103,8 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { - if (ReactExoplayerView.getViewInstance(id) != null) { - ReactExoplayerView.getViewInstance(id).setFullscreen(false); + if (exoplayerView != null) { + exoplayerView.setFullscreen(false); return false; } return true; diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index edd3c45b..482ff939 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -29,7 +29,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; @@ -38,7 +37,6 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; -import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; import com.google.android.exoplayer2.drm.HttpMediaDrmCallback; import com.google.android.exoplayer2.drm.UnsupportedDrmException; @@ -60,8 +58,8 @@ import com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource import com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource; import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.ExoTrackSelection; +import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.upstream.BandwidthMeter; @@ -77,8 +75,8 @@ import java.net.CookiePolicy; import java.util.ArrayList; import java.util.HashMap; import java.util.Locale; -import java.util.UUID; import java.util.Map; +import java.util.UUID; @SuppressLint("ViewConstructor") class ReactExoplayerView extends FrameLayout implements @@ -101,8 +99,6 @@ class ReactExoplayerView extends FrameLayout implements } private static Map instances = new HashMap<>(); - private static int UNIQUE_ID = 0; - private int uid = ++UNIQUE_ID; private FullScreenDelegate fullScreenDelegate; private final VideoEventEmitter eventEmitter; @@ -141,8 +137,6 @@ class ReactExoplayerView extends FrameLayout implements private int bufferForPlaybackMs = DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS; private int bufferForPlaybackAfterRebufferMs = DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS; - private Handler mainHandler; - // Props from React private Uri srcUri; private String extension; @@ -233,8 +227,6 @@ class ReactExoplayerView extends FrameLayout implements exoPlayerView.setLayoutParams(layoutParams); addView(exoPlayerView, 0, layoutParams); - - mainHandler = new Handler(); } @Override @@ -286,7 +278,7 @@ class ReactExoplayerView extends FrameLayout implements public void cleanUpResources() { stopPlayback(); - instances.remove(uid); + instances.remove(this.getId()); } //BandwidthMeter.EventListener implementation @@ -344,9 +336,9 @@ class ReactExoplayerView extends FrameLayout implements } private void showFullscreen() { - instances.put(uid, this); + instances.put(this.getId(), this); Intent intent = new Intent(getContext(), ExoPlayerFullscreenVideoActivity.class); - intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); + intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_EXO_PLAYER_VIEW_ID, this.getId()); intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ORIENTATION, this.fullScreenOrientation); getContext().startActivity(intent); isInFullscreen = true;