From 815d677127ae18beeb324e80b8d4aaf8dff9e356 Mon Sep 17 00:00:00 2001 From: Krzysztof Moch Date: Thu, 23 Jan 2025 21:38:26 +0100 Subject: [PATCH] chore(android): refactor & clean codebase --- .../java/com/video/core/utils/Threading.kt | 41 +++++++ .../com/video/core/utils/VideoFileHelper.kt | 50 ++++++++ .../video/core/utils/VideoInformationUtils.kt | 66 ++++++++++ .../video/core/utils/VideoOrientationUtils.kt | 28 +++++ .../{ => videoplayer}/HybridVideoPlayer.kt | 10 +- .../HybridVideoPlayerFactory.kt | 0 .../HybridVideoPlayerSource.kt | 4 +- .../HybridVideoPlayerSourceFactory.kt | 0 .../HybridVideoViewViewManager.kt | 4 +- .../HybridVideoViewViewManagerFactory.kt | 0 .../com/video/{ => react}/VideoPackage.kt | 4 +- .../video/{ => react}/VideoViewViewManager.kt | 3 +- .../main/java/com/video/utils/AssetUtils.kt | 115 ------------------ .../main/java/com/video/utils/Threading.kt | 39 ------ .../java/com/video/{ => view}/VideoView.kt | 2 +- .../react-native-video/react-native.config.js | 22 ++-- 16 files changed, 211 insertions(+), 177 deletions(-) create mode 100644 packages/react-native-video/android/src/main/java/com/video/core/utils/Threading.kt create mode 100644 packages/react-native-video/android/src/main/java/com/video/core/utils/VideoFileHelper.kt create mode 100644 packages/react-native-video/android/src/main/java/com/video/core/utils/VideoInformationUtils.kt create mode 100644 packages/react-native-video/android/src/main/java/com/video/core/utils/VideoOrientationUtils.kt rename packages/react-native-video/android/src/main/java/com/video/hybrids/{ => videoplayer}/HybridVideoPlayer.kt (94%) rename packages/react-native-video/android/src/main/java/com/video/hybrids/{ => videoplayer}/HybridVideoPlayerFactory.kt (100%) rename packages/react-native-video/android/src/main/java/com/video/hybrids/{ => videoplayersource}/HybridVideoPlayerSource.kt (84%) rename packages/react-native-video/android/src/main/java/com/video/hybrids/{ => videoplayersource}/HybridVideoPlayerSourceFactory.kt (100%) rename packages/react-native-video/android/src/main/java/com/video/hybrids/{ => videoviewviewmanager}/HybridVideoViewViewManager.kt (91%) rename packages/react-native-video/android/src/main/java/com/video/hybrids/{ => videoviewviewmanager}/HybridVideoViewViewManagerFactory.kt (100%) rename packages/react-native-video/android/src/main/java/com/video/{ => react}/VideoPackage.kt (90%) rename packages/react-native-video/android/src/main/java/com/video/{ => react}/VideoViewViewManager.kt (97%) delete mode 100644 packages/react-native-video/android/src/main/java/com/video/utils/AssetUtils.kt delete mode 100644 packages/react-native-video/android/src/main/java/com/video/utils/Threading.kt rename packages/react-native-video/android/src/main/java/com/video/{ => view}/VideoView.kt (98%) diff --git a/packages/react-native-video/android/src/main/java/com/video/core/utils/Threading.kt b/packages/react-native-video/android/src/main/java/com/video/core/utils/Threading.kt new file mode 100644 index 00000000..2bf92168 --- /dev/null +++ b/packages/react-native-video/android/src/main/java/com/video/core/utils/Threading.kt @@ -0,0 +1,41 @@ +package com.video.core.utils + +import android.os.Handler +import android.os.Looper +import com.margelo.nitro.NitroModules +import java.util.concurrent.Callable +import java.util.concurrent.FutureTask + +object Threading { + @JvmStatic + fun runOnMainThread(action: () -> Unit) { + // We are already on the main thread, run and return + if (Looper.myLooper() == Looper.getMainLooper()) { + action() + return + } + + // If application context is null, throw an error + if (NitroModules.applicationContext == null) { + throw IllegalStateException("Application context is null") + } + + // Post the action to the main thread + Handler(NitroModules.applicationContext!!.mainLooper).post { + action() + } + } + + @JvmStatic + fun runOnMainThreadSync(action: Callable): T { + return if (Looper.myLooper() == Looper.getMainLooper()) { + // Already on the main thread, run and return the result + action.call() + } else { + // Post the action to the main thread and wait for the result + val futureTask = FutureTask(action) + Handler(Looper.getMainLooper()).post(futureTask) + futureTask.get() + } + } +} diff --git a/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoFileHelper.kt b/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoFileHelper.kt new file mode 100644 index 00000000..2a79605d --- /dev/null +++ b/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoFileHelper.kt @@ -0,0 +1,50 @@ +package com.video.core.utils + +import android.Manifest +import android.content.pm.PackageManager +import android.net.Uri +import android.webkit.URLUtil +import com.margelo.nitro.NitroModules +import java.io.File +import java.net.URL +import java.net.URLConnection + +object VideoFileHelper { + private fun hasReadPermission(): Boolean { + return NitroModules.applicationContext?.checkSelfPermission( + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + } + + fun validateReadPermission(uri: String) { + if (!hasReadPermission()) throw Error("App does not have permission to read file at path: $uri") + + val file = File(Uri.parse(uri).path ?: return) + + // Check if file exists and is readable + if (!file.exists()) throw Error("File does not exist at path: $uri") + + // Check if file is readable + if (!file.canRead()) throw Error("File is not readable at path: $uri") + } + + fun getFileSizeFromUri(uri: String): Long { + return try { + when { + URLUtil.isFileUrl(uri) -> { + validateReadPermission(uri) + val file = File(Uri.parse(uri).path ?: return -1) + if (file.exists()) file.length() else -1 + } + URLUtil.isNetworkUrl(uri) -> { + val connection: URLConnection = URL(uri).openConnection() + connection.connect() + connection.contentLength.toLong() + } + else -> -1 + } + } catch (e: Exception) { + -1 + } + } +} diff --git a/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoInformationUtils.kt b/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoInformationUtils.kt new file mode 100644 index 00000000..32570113 --- /dev/null +++ b/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoInformationUtils.kt @@ -0,0 +1,66 @@ +package com.video.core.utils + +import android.media.MediaFormat +import android.media.MediaMetadataRetriever +import android.net.Uri +import android.os.Build +import android.webkit.URLUtil +import com.margelo.nitro.video.VideoInformation + +object VideoInformationUtils { + fun fromUri(uri: String, headers: Map = emptyMap()): VideoInformation { + val retriever = MediaMetadataRetriever() + + when { + URLUtil.isFileUrl(uri) -> { + retriever.setDataSource(Uri.parse(uri).path) + } + else -> { + retriever.setDataSource(uri, headers) + } + } + + // Get dimensions + val width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toDoubleOrNull() ?: Double.NaN + val height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toDoubleOrNull() ?: Double.NaN + + // Get duration in milliseconds, convert to long + val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLongOrNull() ?: -1L + + // If we have some valid info, but there is no duration it might be live + val isLive = !width.isNaN() && !height.isNaN() && duration <= 0 + + // Get bitrate + val bitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)?.toDoubleOrNull() ?: Double.NaN + + // Get rotation + val rotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION)?.toIntOrNull() ?: 0 + + // Check for HDR by looking at color transfer (API 30+) + val isHDR = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + val colorTransfer = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER)?.toIntOrNull() + colorTransfer == MediaFormat.COLOR_TRANSFER_ST2084 || colorTransfer == MediaFormat.COLOR_TRANSFER_HLG + } else { + false + } + + // Clean up + retriever.release() + + // Get file size + val fileSize = VideoFileHelper.getFileSizeFromUri(uri) + + val videoInfo = VideoInformation( + bitrate = bitrate, + width = width, + height = height, + duration = duration, + fileSize = fileSize, + isHDR = isHDR, + isLive = isLive, + orientation = VideoOrientationUtils.fromWHR(width.toInt(), height.toInt(), rotation) + ) + + return videoInfo + } +} diff --git a/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoOrientationUtils.kt b/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoOrientationUtils.kt new file mode 100644 index 00000000..a77ec6b8 --- /dev/null +++ b/packages/react-native-video/android/src/main/java/com/video/core/utils/VideoOrientationUtils.kt @@ -0,0 +1,28 @@ +package com.video.core.utils + +import com.margelo.nitro.video.VideoOrientation + +object VideoOrientationUtils { + fun fromWHR(width: Int?, height: Int?, rotation: Int?): VideoOrientation { + if (width == 0 || height == 0 || height == null || width == null) return VideoOrientation.UNKNOWN + + // Check if video is portrait or landscape using natural size + val isNaturalSizePortrait = height > width + + // If rotation is not available, use natural size to determine orientation + if (rotation == null) { + return if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT + } + + // Normalize rotation to 0-360 range + val normalizedRotation = ((rotation % 360) + 360) % 360 + + return when (normalizedRotation) { + 0 -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT + 90 -> VideoOrientation.PORTRAIT + 180 -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT_UPSIDE_DOWN else VideoOrientation.LANDSCAPE_LEFT + 270 -> VideoOrientation.PORTRAIT_UPSIDE_DOWN + else -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT + } + } +} diff --git a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayer.kt b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayer/HybridVideoPlayer.kt similarity index 94% rename from packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayer.kt rename to packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayer/HybridVideoPlayer.kt index d3385d3a..9403e49c 100644 --- a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayer.kt +++ b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayer/HybridVideoPlayer.kt @@ -10,12 +10,12 @@ import androidx.media3.exoplayer.upstream.DefaultAllocator import com.facebook.proguard.annotations.DoNotStrip import com.margelo.nitro.NitroModules import com.margelo.nitro.core.Promise -import com.video.utils.Threading.Companion.runOnMainThreadSync -import com.video.utils.Threading.Companion.runOnMainThread +import com.video.core.utils.Threading.runOnMainThread +import com.video.core.utils.Threading.runOnMainThreadSync @UnstableApi @DoNotStrip -class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable { +class HybridVideoPlayer() : HybridVideoPlayerSpec() { override lateinit var source: HybridVideoPlayerSourceSpec private var allocator: DefaultAllocator? = null @@ -129,13 +129,13 @@ class HybridVideoPlayer() : HybridVideoPlayerSpec(), AutoCloseable { } } - fun release() { + private fun release() { runOnMainThread { playerPointer.release() } } - override fun close() { + override fun clean() { release() } diff --git a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayerFactory.kt b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayer/HybridVideoPlayerFactory.kt similarity index 100% rename from packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayerFactory.kt rename to packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayer/HybridVideoPlayerFactory.kt diff --git a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayerSource.kt b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayersource/HybridVideoPlayerSource.kt similarity index 84% rename from packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayerSource.kt rename to packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayersource/HybridVideoPlayerSource.kt index 845aed4a..2062b28f 100644 --- a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayerSource.kt +++ b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayersource/HybridVideoPlayerSource.kt @@ -3,7 +3,7 @@ package com.margelo.nitro.video import androidx.media3.common.MediaItem import com.facebook.proguard.annotations.DoNotStrip import com.margelo.nitro.core.Promise -import com.video.utils.AssetUtils +import com.video.core.utils.VideoInformationUtils @DoNotStrip class HybridVideoPlayerSource(): HybridVideoPlayerSourceSpec() { @@ -18,7 +18,7 @@ class HybridVideoPlayerSource(): HybridVideoPlayerSourceSpec() { override fun getAssetInformationAsync(): Promise { return Promise.async { - return@async AssetUtils.getAssetInformation(uri) + return@async VideoInformationUtils.fromUri(uri) } } diff --git a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayerSourceFactory.kt b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayersource/HybridVideoPlayerSourceFactory.kt similarity index 100% rename from packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoPlayerSourceFactory.kt rename to packages/react-native-video/android/src/main/java/com/video/hybrids/videoplayersource/HybridVideoPlayerSourceFactory.kt diff --git a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoViewViewManager.kt b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoviewviewmanager/HybridVideoViewViewManager.kt similarity index 91% rename from packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoViewViewManager.kt rename to packages/react-native-video/android/src/main/java/com/video/hybrids/videoviewviewmanager/HybridVideoViewViewManager.kt index d58013cd..d998d0c8 100644 --- a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoViewViewManager.kt +++ b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoviewviewmanager/HybridVideoViewViewManager.kt @@ -3,8 +3,8 @@ package com.margelo.nitro.video import androidx.annotation.OptIn import androidx.media3.common.util.UnstableApi import com.facebook.proguard.annotations.DoNotStrip -import com.video.VideoView -import com.video.utils.Threading +import com.video.view.VideoView +import com.video.core.utils.Threading @DoNotStrip @OptIn(UnstableApi::class) diff --git a/packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoViewViewManagerFactory.kt b/packages/react-native-video/android/src/main/java/com/video/hybrids/videoviewviewmanager/HybridVideoViewViewManagerFactory.kt similarity index 100% rename from packages/react-native-video/android/src/main/java/com/video/hybrids/HybridVideoViewViewManagerFactory.kt rename to packages/react-native-video/android/src/main/java/com/video/hybrids/videoviewviewmanager/HybridVideoViewViewManagerFactory.kt diff --git a/packages/react-native-video/android/src/main/java/com/video/VideoPackage.kt b/packages/react-native-video/android/src/main/java/com/video/react/VideoPackage.kt similarity index 90% rename from packages/react-native-video/android/src/main/java/com/video/VideoPackage.kt rename to packages/react-native-video/android/src/main/java/com/video/react/VideoPackage.kt index 0b302df1..837a05cd 100644 --- a/packages/react-native-video/android/src/main/java/com/video/VideoPackage.kt +++ b/packages/react-native-video/android/src/main/java/com/video/react/VideoPackage.kt @@ -1,4 +1,4 @@ -package com.video +package com.video.react import androidx.annotation.OptIn import androidx.media3.common.util.UnstableApi @@ -20,7 +20,7 @@ class VideoPackage : ReactPackage { companion object { init { - System.loadLibrary("ReactNativeVideo") + System.loadLibrary("ReactNativeVideo") } } } diff --git a/packages/react-native-video/android/src/main/java/com/video/VideoViewViewManager.kt b/packages/react-native-video/android/src/main/java/com/video/react/VideoViewViewManager.kt similarity index 97% rename from packages/react-native-video/android/src/main/java/com/video/VideoViewViewManager.kt rename to packages/react-native-video/android/src/main/java/com/video/react/VideoViewViewManager.kt index e1b3a044..c4036bb0 100644 --- a/packages/react-native-video/android/src/main/java/com/video/VideoViewViewManager.kt +++ b/packages/react-native-video/android/src/main/java/com/video/react/VideoViewViewManager.kt @@ -1,4 +1,4 @@ -package com.video +package com.video.react import androidx.media3.common.util.UnstableApi import com.facebook.react.bridge.Arguments @@ -13,6 +13,7 @@ import com.facebook.react.uimanager.annotations.ReactProp import com.facebook.react.uimanager.events.Event import com.facebook.react.viewmanagers.VideoViewManagerDelegate import com.facebook.react.viewmanagers.VideoViewManagerInterface +import com.video.view.VideoView internal class NitroIdChange( surfaceId: Int, diff --git a/packages/react-native-video/android/src/main/java/com/video/utils/AssetUtils.kt b/packages/react-native-video/android/src/main/java/com/video/utils/AssetUtils.kt deleted file mode 100644 index 8effdf2f..00000000 --- a/packages/react-native-video/android/src/main/java/com/video/utils/AssetUtils.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.video.utils - -import android.media.MediaFormat -import android.media.MediaMetadataRetriever -import android.net.Uri -import android.os.Build -import android.webkit.URLUtil -import com.margelo.nitro.video.VideoInformation -import com.margelo.nitro.video.VideoOrientation -import java.io.File -import java.net.URL -import java.net.URLConnection - -class AssetUtils { - companion object { - fun getAssetInformation(uri: String): VideoInformation { - val retriever = MediaMetadataRetriever() - - when { - URLUtil.isFileUrl(uri) -> { - retriever.setDataSource(Uri.parse(uri).path) - } - else -> { - //TODO: pass headers here - retriever.setDataSource(uri, HashMap()) - } - } - - // Get dimensions - val width = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)?.toDoubleOrNull() ?: Double.NaN - val height = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT)?.toDoubleOrNull() ?: Double.NaN - - // Get duration in milliseconds, convert to long - val duration = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLongOrNull() ?: -1L - - // If we have some valid info, but there is no duration it might be live - val isLive = !width.isNaN() && !height.isNaN() && duration <= 0 - - // Get bitrate - val bitrate = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE)?.toDoubleOrNull() ?: Double.NaN - - // Get rotation - val rotation = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION)?.toIntOrNull() ?: 0 - - // Check for HDR by looking at color transfer (API 30+) - val isHDR = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - val colorTransfer = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_COLOR_TRANSFER)?.toIntOrNull() - colorTransfer == MediaFormat.COLOR_TRANSFER_ST2084 || colorTransfer == MediaFormat.COLOR_TRANSFER_HLG - } else { - false - } - - // Clean up - retriever.release() - - // Get file size - val fileSize = getFileSizeFromUri(uri) - - val videoInfo = VideoInformation( - bitrate = bitrate, - width = width, - height = height, - duration = duration, - fileSize = fileSize, - isHDR = isHDR, - isLive = isLive, - orientation = getVideoOrientation(width.toInt(), height.toInt(), rotation) - ) - - return videoInfo - } - - fun getFileSizeFromUri(uri: String): Long { - return try { - when { - URLUtil.isFileUrl(uri) -> { - val file = File(Uri.parse(uri).path ?: return -1) - if (file.exists()) file.length() else -1 - } - URLUtil.isNetworkUrl(uri) -> { - val connection: URLConnection = URL(uri).openConnection() - connection.connect() - connection.contentLength.toLong() - } - else -> -1 - } - } catch (e: Exception) { - -1 - } - } - - fun getVideoOrientation(width: Int?, height: Int?, rotation: Int?): VideoOrientation { - if (width == 0 || height == 0 || height == null || width == null) return VideoOrientation.UNKNOWN - - // Check if video is portrait or landscape using natural size - val isNaturalSizePortrait = height > width - - // If rotation is not available, use natural size to determine orientation - if (rotation == null) { - return if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT - } - - // Normalize rotation to 0-360 range - val normalizedRotation = ((rotation % 360) + 360) % 360 - - return when (normalizedRotation) { - 0 -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT - 90 -> VideoOrientation.PORTRAIT - 180 -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT_UPSIDE_DOWN else VideoOrientation.LANDSCAPE_LEFT - 270 -> VideoOrientation.PORTRAIT_UPSIDE_DOWN - else -> if (isNaturalSizePortrait) VideoOrientation.PORTRAIT else VideoOrientation.LANDSCAPE_RIGHT - } - } - } -} diff --git a/packages/react-native-video/android/src/main/java/com/video/utils/Threading.kt b/packages/react-native-video/android/src/main/java/com/video/utils/Threading.kt deleted file mode 100644 index 75f94931..00000000 --- a/packages/react-native-video/android/src/main/java/com/video/utils/Threading.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.video.utils - -import android.os.Handler -import android.os.Looper -import com.margelo.nitro.NitroModules -import java.util.concurrent.Callable -import java.util.concurrent.FutureTask - -class Threading { - companion object { - @JvmStatic - fun runOnMainThread(action: () -> Unit) { - if (NitroModules.applicationContext == null) { - throw IllegalStateException("Application context is null") - } - - if (Looper.myLooper() == Looper.getMainLooper()) { - action() - } - - Handler(NitroModules.applicationContext!!.mainLooper).post { - action() - } - } - - @JvmStatic - fun runOnMainThreadSync(action: Callable): T { - return if (Looper.myLooper() == Looper.getMainLooper()) { - // Already on the main thread, run and return the result - action.call() - } else { - // Post the action to the main thread and wait for the result - val futureTask = FutureTask(action) - Handler(Looper.getMainLooper()).post(futureTask) - futureTask.get() // This will block until the result is returned - } - } - } -} diff --git a/packages/react-native-video/android/src/main/java/com/video/VideoView.kt b/packages/react-native-video/android/src/main/java/com/video/view/VideoView.kt similarity index 98% rename from packages/react-native-video/android/src/main/java/com/video/VideoView.kt rename to packages/react-native-video/android/src/main/java/com/video/view/VideoView.kt index cf24b04c..b49bea8d 100644 --- a/packages/react-native-video/android/src/main/java/com/video/VideoView.kt +++ b/packages/react-native-video/android/src/main/java/com/video/view/VideoView.kt @@ -1,4 +1,4 @@ -package com.video +package com.video.view import android.content.Context import android.util.AttributeSet diff --git a/packages/react-native-video/react-native.config.js b/packages/react-native-video/react-native.config.js index 457b680c..1b698e9e 100644 --- a/packages/react-native-video/react-native.config.js +++ b/packages/react-native-video/react-native.config.js @@ -1,16 +1,18 @@ // https://github.com/react-native-community/cli/blob/main/docs/dependencies.md module.exports = { - dependency: { - platforms: { - /** - * @type {import('@react-native-community/cli-types').IOSDependencyParams} - */ - ios: {}, - /** - * @type {import('@react-native-community/cli-types').AndroidDependencyParams} - */ - android: {}, + dependency: { + platforms: { + /** + * @type {import('@react-native-community/cli-types').IOSDependencyParams} + */ + ios: {}, + /** + * @type {import('@react-native-community/cli-types').AndroidDependencyParams} + */ + android: { + packageImportPath: "import com.video.react.VideoPackage;" }, + }, }, };