import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; import 'package:integration_test/integration_test.dart'; import 'package:pyramid/core/call_foreground.dart'; /// Android 14+: Bildschirmübertragung darf die App nicht abstürzen lassen /// (Bernds Test 2026-10-07: „Teilen“ → App weg → Anruf verloren). /// /// Ablauf wie im Anruf: Zustimmung → Anruf-Dienst mit mediaProjection → /// Mitschnitt. Der System-Dialog muss bestätigt werden (auf dem Emulator per /// adb, siehe docs/TESTS_UND_BENCHMARKS.md). /// /// flutter test integration_test/android_screen_capture_test.dart -d emulator-5554 /// /// PYRAMID_SCREEN_NEGATIVE=1 (per --dart-define) überspringt den Dienst – /// Gegenprobe: dann stürzt die App wie früher ab. const _negative = bool.fromEnvironment('PYRAMID_SCREEN_NEGATIVE'); void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); testWidgets( 'Bildschirmübertragung startet ohne Absturz', (tester) async { await tester.pumpWidget(const MaterialApp(home: Scaffold())); if (_negative) { expect(await Helper.requestCapturePermission(), isTrue); } else { expect( await CallForeground.prepareScreenCapture('test'), isTrue, reason: 'Zustimmung oder Dienststart fehlgeschlagen', ); } final stream = await navigator.mediaDevices .getDisplayMedia({'video': true, 'audio': false}); expect(stream.getVideoTracks(), isNotEmpty); await Future.delayed(const Duration(seconds: 3)); for (final t in stream.getTracks()) { await t.stop(); } await stream.dispose(); await CallForeground.screenCaptureStopped('test'); await CallForeground.callEnded('test'); }, skip: !Platform.isAndroid, timeout: const Timeout(Duration(minutes: 3)), ); }