import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'core/config/app_config.dart'; import 'core/navigation/app_router.dart'; import 'domain/services/call_service.dart'; import 'domain/services/cryptography/asymmetric_crypto_service.dart'; import 'presentation/common/theme/app_theme.dart'; import 'presentation/features/contacts/contact_state.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // Initialize app configuration await AppConfig.initialize(); // Initialize cryptography service with error handling final AsymmetricCryptoService cryptoService = AsymmetricCryptoService(); try { await cryptoService.initializeDefaultKeyPair(); } catch (e) { debugPrint('Error initializing cryptography: $e'); // Continue app initialization even if crypto fails } // Request permissions before running the app await _requestPermissions(); // Initialize call service CallService(); runApp( MultiProvider( providers: [ Provider( create: (_) => cryptoService, ), ], child: const DialerApp(), ), ); } Future _requestPermissions() async { try { Map statuses = await [ Permission.phone, Permission.contacts, Permission.microphone, ].request(); if (statuses.values.every((status) => status.isGranted)) { debugPrint("All required permissions granted"); const channel = MethodChannel('call_service'); await channel.invokeMethod('permissionsGranted'); } else { debugPrint("Permissions denied: ${statuses.entries.where((e) => !e.value.isGranted).map((e) => e.key).join(', ')}"); } } catch (e) { debugPrint("Error requesting permissions: $e"); } } class DialerApp extends StatelessWidget { const DialerApp({super.key}); @override Widget build(BuildContext context) { return ContactState( child: MaterialApp( title: 'Dialer App', navigatorKey: CallService.navigatorKey, theme: AppTheme.darkTheme, onGenerateRoute: AppRouter.generateRoute, initialRoute: '/', // Add a builder to wrap all routes with SafeArea builder: (context, child) { return SafeArea( child: child ?? const SizedBox.shrink(), ); }, ), ); } }