25ed765a03
6 Wochen uncommittete Arbeit (Voice-Channels, LiveKit-Manager, Settings-Modal u.v.m.) als ein WIP-Commit gesichert, damit nichts verloren geht und der Pi den aktuellen Stand klonen kann. Thematische Aufarbeitung: siehe ROADMAP M0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPrAGBxBT6GfPXzeWQ4AXb
64 lines
2.1 KiB
Dart
64 lines
2.1 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();
|
|
|
|
// Hide status bar and navigation bar for immersive feel
|
|
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
|
|
|
|
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();
|
|
},
|
|
);
|
|
}
|
|
}
|