Kotlin

Gestión de los cambios de modo PiP

1. Actualizar la interfaz de usuario cuando cambie el modo PiP

Anular onPictureInPictureModeChanged para rastrear el estado PiP y ocultar la vista previa local en la ventana flotante (el vídeo de abonado permanece):

override fun onPictureInPictureModeChanged(
    isInPictureInPictureMode: Boolean,
    newConfig: Configuration,
) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
    isInPipMode = isInPictureInPictureMode

    if (isInPictureInPictureMode) {
        publisherViewContainer.visibility = View.GONE
        publisher?.view?.visibility = View.GONE
    } else {
        publisherViewContainer.visibility = View.VISIBLE
        publisher?.view?.visibility = View.VISIBLE
        if (publisher?.view is GLSurfaceView) {
            (publisher?.view as GLSurfaceView).setZOrderOnTop(true)
        }
    }
}

Exponga isInPipMode para componer (por ejemplo, con mutableStateOf) para que el botón PiP se oculte automáticamente.

2. Mantener viva la sesión en PiP

Visite no llame a session.onPause() mientras está en PiP, o la llamada puede pausarse cuando el usuario abandona la actividad a pantalla completa:

override fun onPause() {
    super.onPause()
    if (!isInPictureInPictureMode) {
        session?.onPause()
    }
}

override fun onResume() {
    super.onResume()
    if (!isInPictureInPictureMode) {
        session?.onResume()
    }
}

3. Limpiar vistas en onStop

Elimine las vistas de editor y abonado cuando cese la actividad:

override fun onStop() {
    super.onStop()
    subscriber?.let { subscriberViewContainer.removeView(it.view) }
    publisher?.let { publisherViewContainer.removeView(it.view) }
}