stopScreenCapture method

Future<void> stopScreenCapture()

Implementation

Future<void> stopScreenCapture() async {
  try {
    log('🛑 Iniciando detención de screen capture...');

    // 1. Detener tracks del stream PRIMERO
    if (_localStream != null) {
      log('🛑 Deteniendo ${_localStream!.getTracks().length} tracks...');
      final tracks = _localStream!.getTracks();
      for (var track in tracks) {
        try {
          log('🛑 Deteniendo track: ${track.kind} - ${track.id}');
          track.stop();
          log('✅ Track detenido: ${track.kind}');
        } catch (e) {
          log('⚠️ Error deteniendo track: $e');
        }
      }

      // Esperar que los tracks terminen de detenerse
      await Future.delayed(const Duration(milliseconds: 500));
    }

    // 2. Cerrar PeerConnection
    if (_peerConnection != null) {
      log('🛑 Cerrando PeerConnection (estado: ${_peerConnection!.connectionState})');
      try {
        await _peerConnection!.close();
        log('✅ PeerConnection cerrado');
      } catch (e) {
        log('⚠️ Error cerrando PeerConnection: $e');
      }
      _peerConnection = null;
    }

    // 3. Esperar para que WebRTC libere completamente
    await Future.delayed(const Duration(milliseconds: 800));

    // 4. Dispose del stream (esto debe liberar el Surface)
    if (_localStream != null) {
      try {
        log('🛑 Disposing stream...');
        _localStream!.dispose();
        log('✅ Stream disposed');
      } catch (e) {
        log('⚠️ Error en dispose: $e');
      }
      _localStream = null;
    }

    // 5. Esperar significativamente para asegurar que Flutter liberó el Surface
    log('⏳ Esperando liberación completa del Surface...');
    await Future.delayed(const Duration(milliseconds: 1000));

    // 6. Liberar MediaProjection nativo
    log('🛑 Liberando MediaProjection nativo...');
    await NativeBridge.releaseMediaProjection();
    log('✅ MediaProjection liberado');

    // 7. Esperar antes de detener servicio
    await Future.delayed(const Duration(milliseconds: 500));

    // 8. Finalmente detener servicio nativo
    log('🛑 Deteniendo servicio...');
    final stopped = await NativeBridge.stopScreenCapture();
    if (stopped) {
      log('✅ Servicio nativo detenido');
    }

    // Cancelar timer de inactividad al detener capture
    _cancelInactivityTimer();

    log('✅ Screen capture detenido completamente');
  } catch (e) {
    log('❌ Error al detener screen capture: $e');
    // Intentar limpiar de todos modos con delays largos
    _localStream = null;
    _peerConnection = null;
    try {
      await Future.delayed(const Duration(milliseconds: 1000));
      await NativeBridge.releaseMediaProjection();
      await Future.delayed(const Duration(milliseconds: 500));
      await NativeBridge.stopScreenCapture();
    } catch (e2) {
      log('❌ Error al detener servicio nativo: $e2');
    }
  }
}