fix(android): catch error when PiP is not supported in activity

This commit is contained in:
Krzysztof Moch
2025-06-25 08:35:58 +02:00
parent f9b241bfba
commit cde3fdb9a4
2 changed files with 22 additions and 7 deletions
@@ -83,4 +83,16 @@ object PictureInPictureUtils {
return visibleRect 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.
}
}
}
} }
@@ -11,6 +11,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageButton import android.widget.ImageButton
import androidx.annotation.RequiresApi
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.media3.common.util.UnstableApi 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.PictureInPictureUtils.createPictureInPictureParams
import com.video.core.utils.Threading.runOnMainThread import com.video.core.utils.Threading.runOnMainThread
import com.video.core.extensions.toAspectRatioFrameLayout import com.video.core.extensions.toAspectRatioFrameLayout
import com.video.core.utils.PictureInPictureUtils
import com.video.core.utils.PictureInPictureUtils.createDisabledPictureInPictureParams import com.video.core.utils.PictureInPictureUtils.createDisabledPictureInPictureParams
@UnstableApi @UnstableApi
@@ -65,11 +67,12 @@ class VideoView @JvmOverloads constructor(
var autoEnterPictureInPicture: Boolean = false var autoEnterPictureInPicture: Boolean = false
set(value) { set(value) {
field = value field = value
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
try { PictureInPictureUtils.safeSetPictureInPictureParams(
val currentActivity = applicationContent.currentActivity if (value) createPictureInPictureParams(this)
currentActivity?.setPictureInPictureParams(createPictureInPictureParams(this)) else createDisabledPictureInPictureParams(this)
} catch (_: Exception) {} )
} }
} }
@@ -347,9 +350,9 @@ class VideoView @JvmOverloads constructor(
VideoManager.unregisterView(this) VideoManager.unregisterView(this)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 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 PictureInPictureUtils.safeSetPictureInPictureParams(
val currentActivity = applicationContent.currentActivity createDisabledPictureInPictureParams(this)
currentActivity?.setPictureInPictureParams(createDisabledPictureInPictureParams(this)) )
} }
super.onDetachedFromWindow() super.onDetachedFromWindow()