[ANDROID] Fix android after merge
This commit is contained in:
parent
d5c245e675
commit
002f39181a
@ -1,77 +0,0 @@
|
|||||||
apply plugin: 'com.android.library'
|
|
||||||
|
|
||||||
def safeExtGet(prop, fallback) {
|
|
||||||
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdkVersion safeExtGet('compileSdkVersion', 28)
|
|
||||||
buildToolsVersion safeExtGet('buildToolsVersion', '28.0.3')
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
minSdkVersion safeExtGet('minSdkVersion', 16)
|
|
||||||
targetSdkVersion safeExtGet('targetSdkVersion', 28)
|
|
||||||
versionCode 1
|
|
||||||
versionName "1.0"
|
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation "com.facebook.react:react-native:${safeExtGet('reactNativeVersion', '+')}"
|
|
||||||
implementation('com.google.android.exoplayer:exoplayer:2.11.4') {
|
|
||||||
exclude group: 'com.android.support'
|
|
||||||
}
|
|
||||||
|
|
||||||
// All support libs must use the same version
|
|
||||||
implementation "androidx.annotation:annotation:1.1.0"
|
|
||||||
implementation "androidx.core:core:1.1.0"
|
|
||||||
implementation "androidx.media:media:1.1.0"
|
|
||||||
|
|
||||||
implementation('com.google.android.exoplayer:extension-okhttp:2.11.4') {
|
|
||||||
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
|
|
||||||
}
|
|
||||||
implementation 'com.google.android.exoplayer:extension-ima:2.11.4'
|
|
||||||
|
|
||||||
implementation 'com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}'
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* If one wants to open this module in Android studio. Uncomment these repositories and buildscript parts*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
repositories {
|
|
||||||
maven {
|
|
||||||
url 'https://maven.google.com/'
|
|
||||||
name 'Google'
|
|
||||||
}
|
|
||||||
jcenter()
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
|
|
||||||
buildscript {
|
|
||||||
repositories {
|
|
||||||
maven {
|
|
||||||
url 'https://maven.google.com/'
|
|
||||||
name 'Google'
|
|
||||||
}
|
|
||||||
jcenter()
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
dependencies {
|
|
||||||
classpath 'com.android.tools.build:gradle:3.5.3'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
@ -1,319 +0,0 @@
|
|||||||
package com.brentvatne.exoplayer;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.content.Context;
|
|
||||||
import androidx.core.content.ContextCompat;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Gravity;
|
|
||||||
import android.view.SurfaceView;
|
|
||||||
import android.view.TextureView;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.FrameLayout;
|
|
||||||
|
|
||||||
import com.google.android.exoplayer2.C;
|
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.PlaybackParameters;
|
|
||||||
import com.google.android.exoplayer2.SimpleExoPlayer;
|
|
||||||
import com.google.android.exoplayer2.Timeline;
|
|
||||||
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
|
||||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
|
||||||
import com.google.android.exoplayer2.text.Cue;
|
|
||||||
import com.google.android.exoplayer2.text.TextRenderer;
|
|
||||||
import com.google.android.exoplayer2.text.TextOutput;
|
|
||||||
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
|
|
||||||
import com.google.android.exoplayer2.ui.SubtitleView;
|
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
@TargetApi(16)
|
|
||||||
public final class ExoPlayerView extends FrameLayout implements AdsLoader.AdViewProvider {
|
|
||||||
|
|
||||||
private View surfaceView;
|
|
||||||
private final View shutterView;
|
|
||||||
private final SubtitleView subtitleLayout;
|
|
||||||
private final AspectRatioFrameLayout layout;
|
|
||||||
private final ComponentListener componentListener;
|
|
||||||
private SimpleExoPlayer player;
|
|
||||||
private Context context;
|
|
||||||
private ViewGroup.LayoutParams layoutParams;
|
|
||||||
private final FrameLayout adOverlayFrameLayout;
|
|
||||||
|
|
||||||
private boolean useTextureView = true;
|
|
||||||
private boolean hideShutterView = false;
|
|
||||||
|
|
||||||
public ExoPlayerView(Context context) {
|
|
||||||
this(context, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ExoPlayerView(Context context, AttributeSet attrs) {
|
|
||||||
this(context, attrs, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ExoPlayerView(Context context, AttributeSet attrs, int defStyleAttr) {
|
|
||||||
super(context, attrs, defStyleAttr);
|
|
||||||
|
|
||||||
this.context = context;
|
|
||||||
|
|
||||||
layoutParams = new ViewGroup.LayoutParams(
|
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
||||||
ViewGroup.LayoutParams.MATCH_PARENT);
|
|
||||||
|
|
||||||
componentListener = new ComponentListener();
|
|
||||||
|
|
||||||
FrameLayout.LayoutParams aspectRatioParams = new FrameLayout.LayoutParams(
|
|
||||||
FrameLayout.LayoutParams.MATCH_PARENT,
|
|
||||||
FrameLayout.LayoutParams.MATCH_PARENT);
|
|
||||||
aspectRatioParams.gravity = Gravity.CENTER;
|
|
||||||
layout = new AspectRatioFrameLayout(context);
|
|
||||||
layout.setLayoutParams(aspectRatioParams);
|
|
||||||
|
|
||||||
shutterView = new View(getContext());
|
|
||||||
shutterView.setLayoutParams(layoutParams);
|
|
||||||
shutterView.setBackgroundColor(ContextCompat.getColor(context, android.R.color.black));
|
|
||||||
|
|
||||||
subtitleLayout = new SubtitleView(context);
|
|
||||||
subtitleLayout.setLayoutParams(layoutParams);
|
|
||||||
subtitleLayout.setUserDefaultStyle();
|
|
||||||
subtitleLayout.setUserDefaultTextSize();
|
|
||||||
|
|
||||||
updateSurfaceView();
|
|
||||||
|
|
||||||
layout.addView(shutterView, 1, layoutParams);
|
|
||||||
layout.addView(subtitleLayout, 2, layoutParams);
|
|
||||||
|
|
||||||
adOverlayFrameLayout = new FrameLayout(context);
|
|
||||||
|
|
||||||
addViewInLayout(layout, 0, aspectRatioParams);
|
|
||||||
addViewInLayout(adOverlayFrameLayout, 1, layoutParams);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setVideoView() {
|
|
||||||
if (surfaceView instanceof TextureView) {
|
|
||||||
player.setVideoTextureView((TextureView) surfaceView);
|
|
||||||
} else if (surfaceView instanceof SurfaceView) {
|
|
||||||
player.setVideoSurfaceView((SurfaceView) surfaceView);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateSurfaceView() {
|
|
||||||
View view = useTextureView ? new TextureView(context) : new SurfaceView(context);
|
|
||||||
view.setLayoutParams(layoutParams);
|
|
||||||
|
|
||||||
surfaceView = view;
|
|
||||||
if (layout.getChildAt(0) != null) {
|
|
||||||
layout.removeViewAt(0);
|
|
||||||
}
|
|
||||||
layout.addView(surfaceView, 0, layoutParams);
|
|
||||||
|
|
||||||
if (this.player != null) {
|
|
||||||
setVideoView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateShutterViewVisibility() {
|
|
||||||
shutterView.setVisibility(this.hideShutterView ? View.INVISIBLE : View.VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void requestLayout() {
|
|
||||||
super.requestLayout();
|
|
||||||
post(measureAndLayout);
|
|
||||||
}
|
|
||||||
|
|
||||||
// AdsLoader.AdViewProvider implementation.
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ViewGroup getAdViewGroup() {
|
|
||||||
return Assertions.checkNotNull(adOverlayFrameLayout, "exo_ad_overlay must be present for ad playback");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View[] getAdOverlayViews() {
|
|
||||||
ArrayList<View> overlayViews = new ArrayList<>();
|
|
||||||
if (adOverlayFrameLayout != null) {
|
|
||||||
overlayViews.add(adOverlayFrameLayout);
|
|
||||||
}
|
|
||||||
return overlayViews.toArray(new View[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the {@link SimpleExoPlayer} to use. The {@link SimpleExoPlayer#setTextOutput} and
|
|
||||||
* {@link SimpleExoPlayer#setVideoListener} method of the player will be called and previous
|
|
||||||
* assignments are overridden.
|
|
||||||
*
|
|
||||||
* @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);
|
|
||||||
this.player.removeListener(componentListener);
|
|
||||||
this.player.setVideoSurface(null);
|
|
||||||
}
|
|
||||||
this.player = player;
|
|
||||||
shutterView.setVisibility(VISIBLE);
|
|
||||||
if (player != null) {
|
|
||||||
setVideoView();
|
|
||||||
player.setVideoListener(componentListener);
|
|
||||||
player.addListener(componentListener);
|
|
||||||
player.setTextOutput(componentListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the resize mode which can be of value {@link ResizeMode.Mode}
|
|
||||||
*
|
|
||||||
* @param resizeMode The resize mode.
|
|
||||||
*/
|
|
||||||
public void setResizeMode(@ResizeMode.Mode int resizeMode) {
|
|
||||||
if (layout.getResizeMode() != resizeMode) {
|
|
||||||
layout.setResizeMode(resizeMode);
|
|
||||||
post(measureAndLayout);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the view onto which video is rendered. This is either a {@link SurfaceView} (default)
|
|
||||||
* or a {@link TextureView} if the {@code use_texture_view} view attribute has been set to true.
|
|
||||||
*
|
|
||||||
* @return either a {@link SurfaceView} or a {@link TextureView}.
|
|
||||||
*/
|
|
||||||
public View getVideoSurfaceView() {
|
|
||||||
return surfaceView;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setUseTextureView(boolean useTextureView) {
|
|
||||||
if (useTextureView != this.useTextureView) {
|
|
||||||
this.useTextureView = useTextureView;
|
|
||||||
updateSurfaceView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHideShutterView(boolean hideShutterView) {
|
|
||||||
this.hideShutterView = hideShutterView;
|
|
||||||
updateShutterViewVisibility();
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Runnable measureAndLayout = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
measure(
|
|
||||||
MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
|
|
||||||
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
|
|
||||||
layout(getLeft(), getTop(), getRight(), getBottom());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private void updateForCurrentTrackSelections() {
|
|
||||||
if (player == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
TrackSelectionArray selections = player.getCurrentTrackSelections();
|
|
||||||
for (int i = 0; i < selections.length; i++) {
|
|
||||||
if (player.getRendererType(i) == C.TRACK_TYPE_VIDEO && selections.get(i) != null) {
|
|
||||||
// Video enabled so artwork must be hidden. If the shutter is closed, it will be opened in
|
|
||||||
// onRenderedFirstFrame().
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Video disabled so the shutter must be closed.
|
|
||||||
shutterView.setVisibility(VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void invalidateAspectRatio() {
|
|
||||||
// Resetting aspect ratio will force layout refresh on next video size changed
|
|
||||||
layout.invalidateAspectRatio();
|
|
||||||
}
|
|
||||||
|
|
||||||
private final class ComponentListener implements SimpleExoPlayer.VideoListener,
|
|
||||||
TextOutput, ExoPlayer.EventListener {
|
|
||||||
|
|
||||||
// TextRenderer.Output implementation
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCues(List<Cue> cues) {
|
|
||||||
subtitleLayout.onCues(cues);
|
|
||||||
}
|
|
||||||
|
|
||||||
// SimpleExoPlayer.VideoListener implementation
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {
|
|
||||||
boolean isInitialRatio = layout.getAspectRatio() == 0;
|
|
||||||
layout.setAspectRatio(height == 0 ? 1 : (width * pixelWidthHeightRatio) / height);
|
|
||||||
|
|
||||||
// React native workaround for measuring and layout on initial load.
|
|
||||||
if (isInitialRatio) {
|
|
||||||
post(measureAndLayout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRenderedFirstFrame() {
|
|
||||||
shutterView.setVisibility(INVISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExoPlayer.EventListener implementation
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onLoadingChanged(boolean isLoading) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPlayerError(ExoPlaybackException e) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPositionDiscontinuity(int reason) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTimelineChanged(Timeline timeline, Object manifest, int reason) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
|
|
||||||
updateForCurrentTrackSelections();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPlaybackParametersChanged(PlaybackParameters params) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSeekProcessed() {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRepeatModeChanged(int repeatMode) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -45,5 +45,7 @@ dependencies {
|
|||||||
implementation('com.google.android.exoplayer:extension-okhttp:2.18.1') {
|
implementation('com.google.android.exoplayer:extension-okhttp:2.18.1') {
|
||||||
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
|
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
|
||||||
}
|
}
|
||||||
|
implementation 'com.google.android.exoplayer:extension-ima:2.11.4'
|
||||||
|
|
||||||
implementation "com.squareup.okhttp3:okhttp:" + '$OKHTTP_VERSION'
|
implementation "com.squareup.okhttp3:okhttp:" + '$OKHTTP_VERSION'
|
||||||
}
|
}
|
||||||
|
@ -19,16 +19,19 @@ import com.google.android.exoplayer2.PlaybackParameters;
|
|||||||
import com.google.android.exoplayer2.Player;
|
import com.google.android.exoplayer2.Player;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
import com.google.android.exoplayer2.ExoPlayer;
|
||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
|
import com.google.android.exoplayer2.source.ads.AdsLoader;
|
||||||
import com.google.android.exoplayer2.Tracks;
|
import com.google.android.exoplayer2.Tracks;
|
||||||
import com.google.android.exoplayer2.text.Cue;
|
import com.google.android.exoplayer2.text.Cue;
|
||||||
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
|
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
|
||||||
import com.google.android.exoplayer2.ui.SubtitleView;
|
import com.google.android.exoplayer2.ui.SubtitleView;
|
||||||
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.video.VideoSize;
|
import com.google.android.exoplayer2.video.VideoSize;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
@TargetApi(16)
|
@TargetApi(16)
|
||||||
public final class ExoPlayerView extends FrameLayout {
|
public final class ExoPlayerView extends FrameLayout implements AdsLoader.AdViewProvider {
|
||||||
|
|
||||||
private View surfaceView;
|
private View surfaceView;
|
||||||
private final View shutterView;
|
private final View shutterView;
|
||||||
@ -38,6 +41,7 @@ public final class ExoPlayerView extends FrameLayout {
|
|||||||
private ExoPlayer player;
|
private ExoPlayer player;
|
||||||
private Context context;
|
private Context context;
|
||||||
private ViewGroup.LayoutParams layoutParams;
|
private ViewGroup.LayoutParams layoutParams;
|
||||||
|
private final FrameLayout adOverlayFrameLayout;
|
||||||
|
|
||||||
private boolean useTextureView = true;
|
private boolean useTextureView = true;
|
||||||
private boolean useSecureView = false;
|
private boolean useSecureView = false;
|
||||||
@ -83,7 +87,10 @@ public final class ExoPlayerView extends FrameLayout {
|
|||||||
layout.addView(shutterView, 1, layoutParams);
|
layout.addView(shutterView, 1, layoutParams);
|
||||||
layout.addView(subtitleLayout, 2, layoutParams);
|
layout.addView(subtitleLayout, 2, layoutParams);
|
||||||
|
|
||||||
|
adOverlayFrameLayout = new FrameLayout(context);
|
||||||
|
|
||||||
addViewInLayout(layout, 0, aspectRatioParams);
|
addViewInLayout(layout, 0, aspectRatioParams);
|
||||||
|
addViewInLayout(adOverlayFrameLayout, 1, layoutParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clearVideoView() {
|
private void clearVideoView() {
|
||||||
@ -139,6 +146,28 @@ public final class ExoPlayerView extends FrameLayout {
|
|||||||
shutterView.setVisibility(this.hideShutterView ? View.INVISIBLE : View.VISIBLE);
|
shutterView.setVisibility(this.hideShutterView ? View.INVISIBLE : View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void requestLayout() {
|
||||||
|
super.requestLayout();
|
||||||
|
post(measureAndLayout);
|
||||||
|
}
|
||||||
|
|
||||||
|
// AdsLoader.AdViewProvider implementation.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewGroup getAdViewGroup() {
|
||||||
|
return Assertions.checkNotNull(adOverlayFrameLayout, "exo_ad_overlay must be present for ad playback");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View[] getAdOverlayViews() {
|
||||||
|
ArrayList<View> overlayViews = new ArrayList<>();
|
||||||
|
if (adOverlayFrameLayout != null) {
|
||||||
|
overlayViews.add(adOverlayFrameLayout);
|
||||||
|
}
|
||||||
|
return overlayViews.toArray(new View[0]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the {@link ExoPlayer} to use. The {@link ExoPlayer#addListener} method of the
|
* Set the {@link ExoPlayer} to use. The {@link ExoPlayer#addListener} method of the
|
||||||
* player will be called and previous
|
* player will be called and previous
|
||||||
|
@ -31,6 +31,7 @@ import com.facebook.react.bridge.WritableArray;
|
|||||||
import com.facebook.react.bridge.WritableMap;
|
import com.facebook.react.bridge.WritableMap;
|
||||||
import com.facebook.react.uimanager.ThemedReactContext;
|
import com.facebook.react.uimanager.ThemedReactContext;
|
||||||
import com.facebook.react.util.RNLog;
|
import com.facebook.react.util.RNLog;
|
||||||
|
import com.google.ads.interactivemedia.v3.api.AdEvent;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.DefaultLoadControl;
|
import com.google.android.exoplayer2.DefaultLoadControl;
|
||||||
import com.google.android.exoplayer2.DefaultRenderersFactory;
|
import com.google.android.exoplayer2.DefaultRenderersFactory;
|
||||||
@ -93,9 +94,13 @@ import com.google.android.exoplayer2.source.dash.manifest.AdaptationSet;
|
|||||||
import com.google.android.exoplayer2.source.dash.manifest.Representation;
|
import com.google.android.exoplayer2.source.dash.manifest.Representation;
|
||||||
import com.google.android.exoplayer2.source.dash.manifest.Descriptor;
|
import com.google.android.exoplayer2.source.dash.manifest.Descriptor;
|
||||||
|
|
||||||
|
import com.google.android.exoplayer2.ext.ima.ImaAdsLoader;
|
||||||
|
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
|
||||||
|
|
||||||
import java.net.CookieHandler;
|
import java.net.CookieHandler;
|
||||||
import java.net.CookieManager;
|
import java.net.CookieManager;
|
||||||
import java.net.CookiePolicy;
|
import java.net.CookiePolicy;
|
||||||
|
import java.net.URI;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -119,7 +124,8 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
BandwidthMeter.EventListener,
|
BandwidthMeter.EventListener,
|
||||||
BecomingNoisyListener,
|
BecomingNoisyListener,
|
||||||
AudioManager.OnAudioFocusChangeListener,
|
AudioManager.OnAudioFocusChangeListener,
|
||||||
DrmSessionEventListener {
|
DrmSessionEventListener,
|
||||||
|
AdEvent.AdEventListener {
|
||||||
|
|
||||||
public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 1;
|
public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 1;
|
||||||
public static final double DEFAULT_MIN_BACK_BUFFER_MEMORY_RESERVE = 0;
|
public static final double DEFAULT_MIN_BACK_BUFFER_MEMORY_RESERVE = 0;
|
||||||
@ -144,6 +150,7 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
|
|
||||||
private ExoPlayerView exoPlayerView;
|
private ExoPlayerView exoPlayerView;
|
||||||
private FullScreenPlayerView fullScreenPlayerView;
|
private FullScreenPlayerView fullScreenPlayerView;
|
||||||
|
private ImaAdsLoader adsLoader;
|
||||||
|
|
||||||
private DataSource.Factory mediaDataSourceFactory;
|
private DataSource.Factory mediaDataSourceFactory;
|
||||||
private ExoPlayer player;
|
private ExoPlayer player;
|
||||||
@ -203,6 +210,7 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
private String drmLicenseUrl = null;
|
private String drmLicenseUrl = null;
|
||||||
private String[] drmLicenseHeader = null;
|
private String[] drmLicenseHeader = null;
|
||||||
private boolean controls;
|
private boolean controls;
|
||||||
|
private Uri adTagUrl;
|
||||||
// \ End props
|
// \ End props
|
||||||
|
|
||||||
// React
|
// React
|
||||||
@ -221,6 +229,9 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
switch (msg.what) {
|
switch (msg.what) {
|
||||||
case SHOW_PROGRESS:
|
case SHOW_PROGRESS:
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
|
if (isPlayingAd()) {
|
||||||
|
playerControlView.hide();
|
||||||
|
}
|
||||||
long pos = player.getCurrentPosition();
|
long pos = player.getCurrentPosition();
|
||||||
long bufferedDuration = player.getBufferedPercentage() * player.getDuration() / 100;
|
long bufferedDuration = player.getBufferedPercentage() * player.getDuration() / 100;
|
||||||
long duration = player.getDuration();
|
long duration = player.getDuration();
|
||||||
@ -256,6 +267,8 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
this.config = config;
|
this.config = config;
|
||||||
this.bandwidthMeter = config.getBandwidthMeter();
|
this.bandwidthMeter = config.getBandwidthMeter();
|
||||||
|
|
||||||
|
adsLoader = new ImaAdsLoader(this.themedReactContext, Uri.EMPTY);
|
||||||
|
|
||||||
createViews();
|
createViews();
|
||||||
|
|
||||||
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||||
@ -263,6 +276,9 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
audioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(themedReactContext);
|
audioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(themedReactContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isPlayingAd() {
|
||||||
|
return player != null && player.isPlayingAd() && player.getPlayWhenReady();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setId(int id) {
|
public void setId(int id) {
|
||||||
@ -380,8 +396,10 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
exoPlayerView.setOnClickListener(new OnClickListener() {
|
exoPlayerView.setOnClickListener(new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
if (!isPlayingAd()) {
|
||||||
togglePlayerControlVisibility();
|
togglePlayerControlVisibility();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//Handling the playButton click event
|
//Handling the playButton click event
|
||||||
@ -604,6 +622,7 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
.setLoadControl(loadControl)
|
.setLoadControl(loadControl)
|
||||||
.build();
|
.build();
|
||||||
player.addListener(self);
|
player.addListener(self);
|
||||||
|
adsLoader.setPlayer(player);
|
||||||
exoPlayerView.setPlayer(player);
|
exoPlayerView.setPlayer(player);
|
||||||
audioBecomingNoisyReceiver.setListener(self);
|
audioBecomingNoisyReceiver.setListener(self);
|
||||||
bandwidthMeter.addEventListener(new Handler(), self);
|
bandwidthMeter.addEventListener(new Handler(), self);
|
||||||
@ -634,11 +653,12 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
private void initializePlayerSource(ReactExoplayerView self, DrmSessionManager drmSessionManager) {
|
private void initializePlayerSource(ReactExoplayerView self, DrmSessionManager drmSessionManager) {
|
||||||
ArrayList<MediaSource> mediaSourceList = buildTextSources();
|
ArrayList<MediaSource> mediaSourceList = buildTextSources();
|
||||||
MediaSource videoSource = buildMediaSource(self.srcUri, self.extension, drmSessionManager);
|
MediaSource videoSource = buildMediaSource(self.srcUri, self.extension, drmSessionManager);
|
||||||
|
MediaSource mediaSourceWithAds = new AdsMediaSource(videoSource, mediaDataSourceFactory, adsLoader, exoPlayerView);
|
||||||
MediaSource mediaSource;
|
MediaSource mediaSource;
|
||||||
if (mediaSourceList.size() == 0) {
|
if (mediaSourceList.size() == 0) {
|
||||||
mediaSource = videoSource;
|
mediaSource = mediaSourceWithAds;
|
||||||
} else {
|
} else {
|
||||||
mediaSourceList.add(0, videoSource);
|
mediaSourceList.add(0, mediaSourceWithAds);
|
||||||
MediaSource[] textSourceArray = mediaSourceList.toArray(
|
MediaSource[] textSourceArray = mediaSourceList.toArray(
|
||||||
new MediaSource[mediaSourceList.size()]
|
new MediaSource[mediaSourceList.size()]
|
||||||
);
|
);
|
||||||
@ -816,6 +836,7 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
trackSelector = null;
|
trackSelector = null;
|
||||||
player = null;
|
player = null;
|
||||||
}
|
}
|
||||||
|
adsLoader.release();
|
||||||
progressHandler.removeMessages(SHOW_PROGRESS);
|
progressHandler.removeMessages(SHOW_PROGRESS);
|
||||||
themedReactContext.removeLifecycleEventListener(this);
|
themedReactContext.removeLifecycleEventListener(this);
|
||||||
audioBecomingNoisyReceiver.removeListener();
|
audioBecomingNoisyReceiver.removeListener();
|
||||||
@ -938,7 +959,6 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
case AudioManager.AUDIOFOCUS_LOSS:
|
case AudioManager.AUDIOFOCUS_LOSS:
|
||||||
this.hasAudioFocus = false;
|
this.hasAudioFocus = false;
|
||||||
eventEmitter.audioFocusChanged(false);
|
eventEmitter.audioFocusChanged(false);
|
||||||
pausePlayback();
|
|
||||||
audioManager.abandonAudioFocus(this);
|
audioManager.abandonAudioFocus(this);
|
||||||
break;
|
break;
|
||||||
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
|
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
|
||||||
@ -1046,7 +1066,7 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void videoLoaded() {
|
private void videoLoaded() {
|
||||||
if (loadVideoStarted) {
|
if (!player.isPlayingAd() && loadVideoStarted) {
|
||||||
loadVideoStarted = false;
|
loadVideoStarted = false;
|
||||||
if (audioTrackType != null) {
|
if (audioTrackType != null) {
|
||||||
setSelectedAudioTrack(audioTrackType, audioTrackValue);
|
setSelectedAudioTrack(audioTrackType, audioTrackValue);
|
||||||
@ -1416,6 +1436,12 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
mReportBandwidth = reportBandwidth;
|
mReportBandwidth = reportBandwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAdTagUrl(final Uri uri) {
|
||||||
|
adTagUrl = uri;
|
||||||
|
adsLoader = new ImaAdsLoader(this.themedReactContext, adTagUrl);
|
||||||
|
adsLoader = new ImaAdsLoader.Builder(this.themedReactContext).setAdEventListener(this).buildForAdTag(adTagUrl);
|
||||||
|
}
|
||||||
|
|
||||||
public void setRawSrc(final Uri uri, final String extension) {
|
public void setRawSrc(final Uri uri, final String extension) {
|
||||||
if (uri != null) {
|
if (uri != null) {
|
||||||
boolean isSourceEqual = uri.equals(srcUri);
|
boolean isSourceEqual = uri.equals(srcUri);
|
||||||
@ -1905,4 +1931,9 @@ class ReactExoplayerView extends FrameLayout implements
|
|||||||
public void setSubtitleStyle(SubtitleStyle style) {
|
public void setSubtitleStyle(SubtitleStyle style) {
|
||||||
exoPlayerView.setSubtitleStyle(style);
|
exoPlayerView.setSubtitleStyle(style);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAdEvent(AdEvent adEvent) {
|
||||||
|
eventEmitter.receiveAdEvent(adEvent.getType().name());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user