Bernds Beta-Feedback: - main.dart: edgeToEdge statt immersiveSticky (Statusleiste schob sich ueber den Inhalt); MobileShell mit SafeArea + Statusleisten-Symbolen passend zum Theme, Hintergrund bg1 = Kopfzeilenfarbe. - MediaViewer: Handy randlos auf Schwarz (vorher 24-px-Rand, halbtransparent); Tippen neben das Bild schliesst, aufs Bild blendet Leiste ein/aus; Wischen hoch/runter schliesst (nur ohne Zoom, ueber InteractiveViewer-Callbacks, kein Gestenkonflikt mit Zwei-Finger-Zoom); Doppeltipp zoomt an der Stelle. - Chat: Bilder auf dem Handy bis halbe Bildschirmhoehe statt fest 320 px; Videos im echten Seitenverhaeltnis statt fest 16:9. - UI-Durchlauf integration_test/mobile_ui_screens_test.dart (Handy-Format, Testprofil, Screenshots nach build/ui_screens/) + Testinhalte-Helfer test/live_ui_fixture_test.dart; scripts/test.ps1 -Ui. Co-Authored-By: Claude Opus 5.5 <[email protected]>
72 lines
2.6 KiB
Dart
72 lines
2.6 KiB
Dart
import 'dart:io';
|
||
|
||
import 'package:firebase_core/firebase_core.dart';
|
||
import 'package:firebase_messaging/firebase_messaging.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter/services.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
import 'package:flutter_vodozemac/flutter_vodozemac.dart' as vod;
|
||
import 'package:media_kit/media_kit.dart';
|
||
import 'package:pyramid/core/app.dart';
|
||
import 'package:pyramid/core/background_push.dart';
|
||
import 'package:pyramid/core/matrix_client.dart';
|
||
import 'package:pyramid/features/auth/login_notifier.dart';
|
||
import 'package:pyramid/widgets/pyramid_loader.dart';
|
||
|
||
void main() async {
|
||
WidgetsFlutterBinding.ensureInitialized();
|
||
MediaKit.ensureInitialized();
|
||
|
||
if (Platform.isAndroid) {
|
||
// Firebase must be initialised first, then the background handler registered.
|
||
try { await Firebase.initializeApp(); } catch (_) {}
|
||
FirebaseMessaging.onBackgroundMessage(handleBackgroundMessage);
|
||
// Store the background-engine callback handle so PushService.kt /
|
||
// ReplyReceiver can decrypt + send encrypted replies when the app is killed.
|
||
await registerBgEngineHandle();
|
||
}
|
||
|
||
// Catch unhandled async exceptions to prevent silent crashes
|
||
FlutterError.onError = (details) {
|
||
FlutterError.presentError(details);
|
||
};
|
||
|
||
await vod.init();
|
||
|
||
// Status- und Navigationsleiste bleiben sichtbar (edge-to-edge): die App
|
||
// zeichnet darunter, hält per SafeArea (Handy-Layout in app_shell.dart)
|
||
// aber Abstand. Vorher immersiveSticky – da schob sich die Statusleiste
|
||
// beim Herunterwischen über Kopfzeile und Text (Bernds Feedback 2026-10-07).
|
||
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
||
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
|
||
statusBarColor: Colors.transparent,
|
||
systemNavigationBarColor: Colors.transparent,
|
||
systemNavigationBarContrastEnforced: false,
|
||
));
|
||
|
||
runApp(const ProviderScope(child: PyramidBootstrap()));
|
||
}
|
||
|
||
class PyramidBootstrap extends ConsumerWidget {
|
||
const PyramidBootstrap({super.key});
|
||
|
||
@override
|
||
Widget build(BuildContext context, WidgetRef ref) {
|
||
final clientAsync = ref.watch(matrixClientProvider);
|
||
|
||
return clientAsync.when(
|
||
loading: () => const MaterialApp(
|
||
home: Scaffold(body: Center(child: PyramidLoader(size: 80))),
|
||
),
|
||
error: (e, _) => MaterialApp(
|
||
home: Scaffold(body: Center(child: Text('Fehler: $e'))),
|
||
),
|
||
data: (_) {
|
||
// Homeserver einmalig aus SharedPreferences laden
|
||
initHomeserver(ref);
|
||
return const PyramidApp();
|
||
},
|
||
);
|
||
}
|
||
}
|