[ANDROID] Fix android after merge
This commit is contained in:
		@@ -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') {
 | 
			
		||||
        exclude group: 'com.squareup.okhttp3', module: 'okhttp'
 | 
			
		||||
    }
 | 
			
		||||
    implementation 'com.google.android.exoplayer:extension-ima:2.11.4'
 | 
			
		||||
 | 
			
		||||
    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.ExoPlayer;
 | 
			
		||||
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.text.Cue;
 | 
			
		||||
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
 | 
			
		||||
import com.google.android.exoplayer2.ui.SubtitleView;
 | 
			
		||||
import com.google.android.exoplayer2.util.Assertions;
 | 
			
		||||
import com.google.android.exoplayer2.video.VideoSize;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
 | 
			
		||||
@TargetApi(16)
 | 
			
		||||
public final class ExoPlayerView extends FrameLayout {
 | 
			
		||||
public final class ExoPlayerView extends FrameLayout implements AdsLoader.AdViewProvider {
 | 
			
		||||
 | 
			
		||||
    private View surfaceView;
 | 
			
		||||
    private final View shutterView;
 | 
			
		||||
@@ -38,6 +41,7 @@ public final class ExoPlayerView extends FrameLayout {
 | 
			
		||||
    private ExoPlayer player;
 | 
			
		||||
    private Context context;
 | 
			
		||||
    private ViewGroup.LayoutParams layoutParams;
 | 
			
		||||
    private final FrameLayout adOverlayFrameLayout;
 | 
			
		||||
 | 
			
		||||
    private boolean useTextureView = true;
 | 
			
		||||
    private boolean useSecureView = false;
 | 
			
		||||
@@ -83,7 +87,10 @@ public final class ExoPlayerView extends FrameLayout {
 | 
			
		||||
        layout.addView(shutterView, 1, layoutParams);
 | 
			
		||||
        layout.addView(subtitleLayout, 2, layoutParams);
 | 
			
		||||
 | 
			
		||||
        adOverlayFrameLayout = new FrameLayout(context);
 | 
			
		||||
 | 
			
		||||
        addViewInLayout(layout, 0, aspectRatioParams);
 | 
			
		||||
        addViewInLayout(adOverlayFrameLayout, 1, layoutParams);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void clearVideoView() {
 | 
			
		||||
@@ -139,6 +146,28 @@ public final class ExoPlayerView extends FrameLayout {
 | 
			
		||||
        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
 | 
			
		||||
     * 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.uimanager.ThemedReactContext;
 | 
			
		||||
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.DefaultLoadControl;
 | 
			
		||||
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.Descriptor;
 | 
			
		||||
 | 
			
		||||
import com.google.android.exoplayer2.ext.ima.ImaAdsLoader;
 | 
			
		||||
import com.google.android.exoplayer2.source.ads.AdsMediaSource;
 | 
			
		||||
 | 
			
		||||
import java.net.CookieHandler;
 | 
			
		||||
import java.net.CookieManager;
 | 
			
		||||
import java.net.CookiePolicy;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Locale;
 | 
			
		||||
@@ -119,7 +124,8 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
        BandwidthMeter.EventListener,
 | 
			
		||||
        BecomingNoisyListener,
 | 
			
		||||
        AudioManager.OnAudioFocusChangeListener,
 | 
			
		||||
        DrmSessionEventListener {
 | 
			
		||||
        DrmSessionEventListener,
 | 
			
		||||
        AdEvent.AdEventListener {
 | 
			
		||||
 | 
			
		||||
    public static final double DEFAULT_MAX_HEAP_ALLOCATION_PERCENT = 1;
 | 
			
		||||
    public static final double DEFAULT_MIN_BACK_BUFFER_MEMORY_RESERVE = 0;
 | 
			
		||||
@@ -144,6 +150,7 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
 | 
			
		||||
    private ExoPlayerView exoPlayerView;
 | 
			
		||||
    private FullScreenPlayerView fullScreenPlayerView;
 | 
			
		||||
    private ImaAdsLoader adsLoader;
 | 
			
		||||
 | 
			
		||||
    private DataSource.Factory mediaDataSourceFactory;
 | 
			
		||||
    private ExoPlayer player;
 | 
			
		||||
@@ -203,6 +210,7 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
    private String drmLicenseUrl = null;
 | 
			
		||||
    private String[] drmLicenseHeader = null;
 | 
			
		||||
    private boolean controls;
 | 
			
		||||
    private Uri adTagUrl;
 | 
			
		||||
    // \ End props
 | 
			
		||||
 | 
			
		||||
    // React
 | 
			
		||||
@@ -221,6 +229,9 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
            switch (msg.what) {
 | 
			
		||||
                case SHOW_PROGRESS:
 | 
			
		||||
                    if (player != null) {
 | 
			
		||||
                        if (isPlayingAd()) {
 | 
			
		||||
                            playerControlView.hide();
 | 
			
		||||
                        }
 | 
			
		||||
                        long pos = player.getCurrentPosition();
 | 
			
		||||
                        long bufferedDuration = player.getBufferedPercentage() * player.getDuration() / 100;
 | 
			
		||||
                        long duration = player.getDuration();
 | 
			
		||||
@@ -256,6 +267,8 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
        this.config = config;
 | 
			
		||||
        this.bandwidthMeter = config.getBandwidthMeter();
 | 
			
		||||
 | 
			
		||||
        adsLoader = new ImaAdsLoader(this.themedReactContext, Uri.EMPTY);
 | 
			
		||||
 | 
			
		||||
        createViews();
 | 
			
		||||
 | 
			
		||||
        audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
 | 
			
		||||
@@ -263,6 +276,9 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
        audioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(themedReactContext);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean isPlayingAd() {
 | 
			
		||||
        return player != null && player.isPlayingAd() && player.getPlayWhenReady();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setId(int id) {
 | 
			
		||||
@@ -380,7 +396,9 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
        exoPlayerView.setOnClickListener(new OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                togglePlayerControlVisibility();
 | 
			
		||||
                if (!isPlayingAd()) {
 | 
			
		||||
                    togglePlayerControlVisibility();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -604,6 +622,7 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
                    .setLoadControl(loadControl)
 | 
			
		||||
                    .build();
 | 
			
		||||
        player.addListener(self);
 | 
			
		||||
        adsLoader.setPlayer(player);
 | 
			
		||||
        exoPlayerView.setPlayer(player);
 | 
			
		||||
        audioBecomingNoisyReceiver.setListener(self);
 | 
			
		||||
        bandwidthMeter.addEventListener(new Handler(), self);
 | 
			
		||||
@@ -634,11 +653,12 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
    private void initializePlayerSource(ReactExoplayerView self, DrmSessionManager drmSessionManager) {
 | 
			
		||||
        ArrayList<MediaSource> mediaSourceList = buildTextSources();
 | 
			
		||||
        MediaSource videoSource = buildMediaSource(self.srcUri, self.extension, drmSessionManager);
 | 
			
		||||
        MediaSource mediaSourceWithAds = new AdsMediaSource(videoSource, mediaDataSourceFactory, adsLoader, exoPlayerView);
 | 
			
		||||
        MediaSource mediaSource;
 | 
			
		||||
        if (mediaSourceList.size() == 0) {
 | 
			
		||||
            mediaSource = videoSource;
 | 
			
		||||
            mediaSource = mediaSourceWithAds;
 | 
			
		||||
        } else {
 | 
			
		||||
            mediaSourceList.add(0, videoSource);
 | 
			
		||||
            mediaSourceList.add(0, mediaSourceWithAds);
 | 
			
		||||
            MediaSource[] textSourceArray = mediaSourceList.toArray(
 | 
			
		||||
                    new MediaSource[mediaSourceList.size()]
 | 
			
		||||
            );
 | 
			
		||||
@@ -816,6 +836,7 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
            trackSelector = null;
 | 
			
		||||
            player = null;
 | 
			
		||||
        }
 | 
			
		||||
        adsLoader.release();
 | 
			
		||||
        progressHandler.removeMessages(SHOW_PROGRESS);
 | 
			
		||||
        themedReactContext.removeLifecycleEventListener(this);
 | 
			
		||||
        audioBecomingNoisyReceiver.removeListener();
 | 
			
		||||
@@ -938,7 +959,6 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
            case AudioManager.AUDIOFOCUS_LOSS:
 | 
			
		||||
                this.hasAudioFocus = false;
 | 
			
		||||
                eventEmitter.audioFocusChanged(false);
 | 
			
		||||
                pausePlayback();
 | 
			
		||||
                audioManager.abandonAudioFocus(this);
 | 
			
		||||
                break;
 | 
			
		||||
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
 | 
			
		||||
@@ -1046,7 +1066,7 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void videoLoaded() {
 | 
			
		||||
        if (loadVideoStarted) {
 | 
			
		||||
        if (!player.isPlayingAd() && loadVideoStarted) {
 | 
			
		||||
            loadVideoStarted = false;
 | 
			
		||||
            if (audioTrackType != null) {
 | 
			
		||||
                setSelectedAudioTrack(audioTrackType, audioTrackValue);
 | 
			
		||||
@@ -1416,6 +1436,12 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
        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) {
 | 
			
		||||
        if (uri != null) {
 | 
			
		||||
            boolean isSourceEqual = uri.equals(srcUri);
 | 
			
		||||
@@ -1905,4 +1931,9 @@ class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
    public void setSubtitleStyle(SubtitleStyle style) {
 | 
			
		||||
        exoPlayerView.setSubtitleStyle(style);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onAdEvent(AdEvent adEvent) {
 | 
			
		||||
        eventEmitter.receiveAdEvent(adEvent.getType().name());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user