Skip to content

Commit

Permalink
feat(android): allow to disable selected functionalities (#3681)
Browse files Browse the repository at this point in the history
* feat(android): add possibility do disable some of functionalities

* create dump classes

* remove dump files when functionalities are enabled

* add docs

* enable all functionalities in example

* throw error when trying to use disabled functionality

* update docs
  • Loading branch information
KrzysztofMoch authored Apr 16, 2024
1 parent 2285eba commit 64e3191
Show file tree
Hide file tree
Showing 16 changed files with 352 additions and 19 deletions.
75 changes: 61 additions & 14 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,30 @@ def supportsNamespace() {
return major >= 8
}

def useExoplayerIMA = safeExtGet("RNVUseExoplayerIMA")?.toBoolean() ?: false
def ExoplayerDependenciesList = [
"useExoplayerIMA",
"useExoplayerSmoothStreaming",
"useExoplayerDash",
"useExoplayerHls",
"useExoplayerRtsp",
]

def ExoplayerDependencies = ExoplayerDependenciesList.collectEntries { property ->
[(property): safeExtGet(property)?.toBoolean() ?: false]
}

println "useExoplayerIMA:" + useExoplayerIMA
ExoplayerDependenciesList.each { propertyName ->
def propertyValue = ExoplayerDependencies[propertyName]
println "$propertyName: $propertyValue"
}

// This string is used to define build path.
// As react native build output directory is react-native path of the module.
// We need to force a new path on each configuration change.
// If you add a new build parameter, please add the new value in this string
def configStringPath = (
'useExoplayerIMA' + useExoplayerIMA \
).md5()
def configStringPath = ExoplayerDependencies.collect { property, value ->
property + value
}.join('').md5()

if (isNewArchitectureEnabled()) {
apply plugin: "com.facebook.react"
Expand Down Expand Up @@ -83,7 +96,13 @@ android {
targetSdkVersion safeExtGet('targetSdkVersion')
versionCode 1
versionName "1.0"

buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
buildConfigField "boolean", "USE_EXOPLAYER_IMA", ExoplayerDependencies["useExoplayerIMA"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_SMOOTH_STREAMING", ExoplayerDependencies["useExoplayerSmoothStreaming"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_DASH", ExoplayerDependencies["useExoplayerDash"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_HLS", ExoplayerDependencies["useExoplayerHls"].toString()
buildConfigField "boolean", "USE_EXOPLAYER_RTSP", ExoplayerDependencies["useExoplayerRtsp"].toString()

ndk {
abiFilters(*reactNativeArchitectures())
Expand All @@ -103,10 +122,26 @@ android {
sourceSets {
main {
java {
if (useExoplayerIMA) {
if (ExoplayerDependencies["useExoplayerIMA"]) {
exclude 'com/google/ads/interactivemedia/v3/api'
exclude 'androidx/media3/exoplayer/ima'
}

if (ExoplayerDependencies["useExoplayerSmoothStreaming"]) {
exclude 'androidx/media3/exoplayer/smoothstreaming'
}

if (ExoplayerDependencies["useExoplayerDash"]) {
exclude 'androidx/media3/exoplayer/dash'
}

if (ExoplayerDependencies["useExoplayerHls"]) {
exclude 'androidx/media3/exoplayer/hls'
}

if (ExoplayerDependencies["useExoplayerRtsp"]) {
exclude 'androidx/media3/exoplayer/rtsp'
}
}
}
}
Expand Down Expand Up @@ -158,16 +193,28 @@ dependencies {
// For media playback using ExoPlayer
implementation "androidx.media3:media3-exoplayer:$media3_version"

// For Smooth Streaming playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
// For DASH playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
// For HLS playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
if (ExoplayerDependencies["useExoplayerSmoothStreaming"]) {
// For Smooth Streaming playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
}

if (ExoplayerDependencies["useExoplayerDash"]) {
// For DASH playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
}

if (ExoplayerDependencies["useExoplayerHls"]) {
// For HLS playback support with ExoPlayer
implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
}

implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
// For RTSP playback support with ExoPlayer
if (ExoplayerDependencies["useExoplayerRtsp"]) {
implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
}

// For ad insertion using the Interactive Media Ads SDK with ExoPlayer
if (useExoplayerIMA) {
if (ExoplayerDependencies["useExoplayerIMA"]) {
implementation "androidx.media3:media3-exoplayer-ima:$media3_version"
}

Expand Down
6 changes: 5 additions & 1 deletion android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ RNVideo_compileSdkVersion=31
RNVideo_ndkversion=21.4.7075529
RNVideo_buildToolsVersion=30.0.2
RNVideo_media3Version=1.1.1
RNVideo_RNVUseExoplayerIMA=false
RNVideo_useExoplayerIMA=false
RNVideo_useExoplayerRtsp=false
RNVideo_useExoplayerSmoothStreaming=true
RNVideo_useExoplayerDash=true
RNVideo_useExoplayerHls=true
RNVideo_androidxCoreVersion=1.9.0
RNVideo_androidxActivityVersion=1.7.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package androidx.media3.exoplayer.dash;

import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;

public class DashMediaSource {
public static class Factory implements MediaSource.Factory {

public Factory(DefaultDashChunkSource.Factory factory, DataSource.Factory factory1) {
}

@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}

@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}

@Override
public int[] getSupportedTypes() {
return new int[0];
}

@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}

12 changes: 12 additions & 0 deletions android/src/main/java/androidx/media3/exoplayer/dash/DashUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package androidx.media3.exoplayer.dash;

import android.net.Uri;

import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.dash.manifest.DashManifest;

public class DashUtil {
public static DashManifest loadManifest(DataSource ds, Uri uri) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package androidx.media3.exoplayer.dash;

import androidx.media3.datasource.DataSource;

public class DefaultDashChunkSource {
public static final class Factory {
public Factory(DataSource.Factory mediaDataSourceFactory) {
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package androidx.media3.exoplayer.dash.manifest;

import androidx.collection.CircularArray;
import androidx.media3.common.C;

public class AdaptationSet {
public int type = 0;
public CircularArray<Representation> representations;

public AdaptationSet() {
representations = null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package androidx.media3.exoplayer.dash.manifest;

public class DashManifest {
public DashManifest() {

}

public int getPeriodCount() {
return 0;
}

public Period getPeriod(int index) {
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package androidx.media3.exoplayer.dash.manifest;

import androidx.collection.CircularArray;

public class Period {
public CircularArray<AdaptationSet> adaptationSets;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package androidx.media3.exoplayer.dash.manifest;

import androidx.media3.common.Format;

public class Representation {
public Format format;
public long presentationTimeOffsetUs;

public Representation() {
format = null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package androidx.media3.exoplayer.hls;

import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;

public class HlsMediaSource {
public static class Factory implements MediaSource.Factory {
public Factory(DataSource.Factory mediaDataSourceFactory) {
}

@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}

@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}

@Override
public int[] getSupportedTypes() {
return new int[0];
}

@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package androidx.media3.exoplayer.rtsp;

import androidx.media3.common.MediaItem;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;

public class RtspMediaSource {
public RtspMediaSource() {

}

public static class Factory implements MediaSource.Factory {
@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}

@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}

@Override
public int[] getSupportedTypes() {
return new int[0];
}

@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package androidx.media3.exoplayer.smoothstreaming;

import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;

public class DefaultSsChunkSource {
public static class Factory implements MediaSource.Factory {
public Factory(DataSource.Factory mediaDataSourceFactory) {
}

@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}

@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}

@Override
public int[] getSupportedTypes() {
return new int[0];
}

@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package androidx.media3.exoplayer.smoothstreaming;

import androidx.media3.common.MediaItem;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.drm.DrmSessionManagerProvider;
import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy;

public class SsMediaSource {
public static class Factory implements MediaSource.Factory {
public Factory(DefaultSsChunkSource.Factory factory, DataSource.Factory factory1) {
}

@Override
public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) {
return null;
}

@Override
public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) {
return null;
}

@Override
public int[] getSupportedTypes() {
return new int[0];
}

@Override
public MediaSource createMediaSource(MediaItem mediaItem) {
return null;
}
}
}
Loading

0 comments on commit 64e3191

Please sign in to comment.