From 00a6b197366d86e7ef5445bdb6ce8833c97f9829 Mon Sep 17 00:00:00 2001 From: Thibault Capelli <53807506+jiroscripts@users.noreply.github.com> Date: Thu, 18 Dec 2025 13:19:27 +0100 Subject: [PATCH] fix(android): local asset for android in release (#4784) * fix: hermes path for android release * chore: update bun.lock * fix: handle raw ressources in Android release mode * fix: replace custom AppContextHolder logic with NitroModules.applicationContext --- bun.lock | 1 + example/android/app/build.gradle | 2 +- .../HybridVideoPlayerSourceFactory.kt | 33 ++++++++++++++++++- .../java/com/twg/video/react/VideoPackage.kt | 1 - 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index a63375a2..3fa372ae 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "react-native-video-monorepo", diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 8df5af7f..cc7c3cfa 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -45,7 +45,7 @@ react { /* Hermes Commands */ // The hermes compiler command to run. By default it is 'hermesc' - // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + hermesCommand = "$rootDir/../../node_modules/react-native/sdks/hermesc/%OS-BIN%/hermesc" // // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" // hermesFlags = ["-O", "-output-source-map"] diff --git a/packages/react-native-video/android/src/main/java/com/twg/video/hybrids/videoplayersource/HybridVideoPlayerSourceFactory.kt b/packages/react-native-video/android/src/main/java/com/twg/video/hybrids/videoplayersource/HybridVideoPlayerSourceFactory.kt index 090c4683..fb4730f6 100644 --- a/packages/react-native-video/android/src/main/java/com/twg/video/hybrids/videoplayersource/HybridVideoPlayerSourceFactory.kt +++ b/packages/react-native-video/android/src/main/java/com/twg/video/hybrids/videoplayersource/HybridVideoPlayerSourceFactory.kt @@ -1,12 +1,43 @@ package com.margelo.nitro.video +import android.content.Context +import android.net.Uri +import androidx.media3.common.MediaItem +import androidx.media3.datasource.RawResourceDataSource +import com.facebook.react.bridge.ReactApplicationContext import com.facebook.proguard.annotations.DoNotStrip +import com.margelo.nitro.NitroModules @DoNotStrip class HybridVideoPlayerSourceFactory: HybridVideoPlayerSourceFactorySpec() { + private val applicationContext: Context + get() = NitroModules.applicationContext + ?: throw IllegalStateException( + "NitroModules.applicationContext has not been initialized." + ) + + private fun normalizeUri(input: String): String { + val parsedUri = Uri.parse(input) + + if (parsedUri.scheme != null) { + return parsedUri.toString() + } + + val resId = applicationContext.resources + .getIdentifier(input, "raw", applicationContext.packageName) + + if (resId == 0) { + throw IllegalArgumentException("The video resource '$input' could not be found in res/raw") + } + + val mediaUri = RawResourceDataSource.buildRawResourceUri(resId) + + return mediaUri.toString() + } + override fun fromUri(uri: String): HybridVideoPlayerSourceSpec { val config = NativeVideoConfig( - uri = uri, + uri = normalizeUri(uri), externalSubtitles = null, drm = null, headers = null, diff --git a/packages/react-native-video/android/src/main/java/com/twg/video/react/VideoPackage.kt b/packages/react-native-video/android/src/main/java/com/twg/video/react/VideoPackage.kt index 3bb566cb..9960261e 100644 --- a/packages/react-native-video/android/src/main/java/com/twg/video/react/VideoPackage.kt +++ b/packages/react-native-video/android/src/main/java/com/twg/video/react/VideoPackage.kt @@ -7,7 +7,6 @@ import com.facebook.react.bridge.NativeModule import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ViewManager - class VideoPackage : ReactPackage { override fun createNativeModules(reactContext: ReactApplicationContext): List { return emptyList()