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');
}
}
}