From cde3fdb9a4ecc4054ad113527881ac4a3b7765c5 Mon Sep 17 00:00:00 2001 From: Krzysztof Moch Date: Wed, 25 Jun 2025 08:35:58 +0200 Subject: [PATCH] fix(android): catch error when PiP is not supported in activity --- .../video/core/utils/PictureInPictureUtils.kt | 12 ++++++++++++ .../src/main/java/com/video/view/VideoView.kt | 17 ++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/react-native-video/android/src/main/java/com/video/core/utils/PictureInPictureUtils.kt b/packages/react-native-video/android/src/main/java/com/video/core/utils/PictureInPictureUtils.kt index 1e7f0a8c..bf8f2d79 100644 --- a/packages/react-native-video/android/src/main/java/com/video/core/utils/PictureInPictureUtils.kt +++ b/packages/react-native-video/android/src/main/java/com/video/core/utils/PictureInPictureUtils.kt @@ -83,4 +83,16 @@ object PictureInPictureUtils { return visibleRect } + + fun safeSetPictureInPictureParams(params: PictureInPictureParams) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + val currentActivity = NitroModules.applicationContext?.currentActivity + currentActivity?.setPictureInPictureParams(params) + } catch (_: Exception) { + // Ignore: We cannot check if user has added support for PIP in manifest + // so we need to catch error if he did not add it. + } + } + } } diff --git a/packages/react-native-video/android/src/main/java/com/video/view/VideoView.kt b/packages/react-native-video/android/src/main/java/com/video/view/VideoView.kt index c41c30f6..aa34934d 100644 --- a/packages/react-native-video/android/src/main/java/com/video/view/VideoView.kt +++ b/packages/react-native-video/android/src/main/java/com/video/view/VideoView.kt @@ -11,6 +11,7 @@ import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageButton +import androidx.annotation.RequiresApi import androidx.core.view.isVisible import androidx.fragment.app.FragmentActivity import androidx.media3.common.util.UnstableApi @@ -29,6 +30,7 @@ import com.video.core.utils.PictureInPictureUtils.canEnterPictureInPicture import com.video.core.utils.PictureInPictureUtils.createPictureInPictureParams import com.video.core.utils.Threading.runOnMainThread import com.video.core.extensions.toAspectRatioFrameLayout +import com.video.core.utils.PictureInPictureUtils import com.video.core.utils.PictureInPictureUtils.createDisabledPictureInPictureParams @UnstableApi @@ -65,11 +67,12 @@ class VideoView @JvmOverloads constructor( var autoEnterPictureInPicture: Boolean = false set(value) { field = value + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - try { - val currentActivity = applicationContent.currentActivity - currentActivity?.setPictureInPictureParams(createPictureInPictureParams(this)) - } catch (_: Exception) {} + PictureInPictureUtils.safeSetPictureInPictureParams( + if (value) createPictureInPictureParams(this) + else createDisabledPictureInPictureParams(this) + ) } } @@ -347,9 +350,9 @@ class VideoView @JvmOverloads constructor( VideoManager.unregisterView(this) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - // We don't want activity to go to PiP Mode when video view is not presented - val currentActivity = applicationContent.currentActivity - currentActivity?.setPictureInPictureParams(createDisabledPictureInPictureParams(this)) + PictureInPictureUtils.safeSetPictureInPictureParams( + createDisabledPictureInPictureParams(this) + ) } super.onDetachedFromWindow()