mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-04-20 22:13:48 +00:00
formats all dart files using `dart format .` from the root project dir this makes the code style repeatable by new contributors and makes PR review easier
174 lines
5.6 KiB
Dart
174 lines
5.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
import 'l10n/app_localizations.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'connector/meshcore_connector.dart';
|
|
import 'screens/scanner_screen.dart';
|
|
import 'services/storage_service.dart';
|
|
import 'services/message_retry_service.dart';
|
|
import 'services/path_history_service.dart';
|
|
import 'services/app_settings_service.dart';
|
|
import 'services/notification_service.dart';
|
|
import 'services/ble_debug_log_service.dart';
|
|
import 'services/app_debug_log_service.dart';
|
|
import 'services/background_service.dart';
|
|
import 'services/map_tile_cache_service.dart';
|
|
import 'storage/prefs_manager.dart';
|
|
import 'utils/app_logger.dart';
|
|
|
|
void main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
|
|
// Initialize SharedPreferences cache
|
|
await PrefsManager.initialize();
|
|
|
|
// Initialize services
|
|
final storage = StorageService();
|
|
final connector = MeshCoreConnector();
|
|
final pathHistoryService = PathHistoryService(storage);
|
|
final retryService = MessageRetryService();
|
|
final appSettingsService = AppSettingsService();
|
|
final bleDebugLogService = BleDebugLogService();
|
|
final appDebugLogService = AppDebugLogService();
|
|
final backgroundService = BackgroundService();
|
|
final mapTileCacheService = MapTileCacheService();
|
|
|
|
// Load settings
|
|
await appSettingsService.loadSettings();
|
|
|
|
// Initialize app logger
|
|
appLogger.initialize(
|
|
appDebugLogService,
|
|
enabled: appSettingsService.settings.appDebugLogEnabled,
|
|
);
|
|
|
|
// Initialize notification service
|
|
final notificationService = NotificationService();
|
|
await notificationService.initialize();
|
|
await backgroundService.initialize();
|
|
|
|
// Wire up connector with services
|
|
connector.initialize(
|
|
retryService: retryService,
|
|
pathHistoryService: pathHistoryService,
|
|
appSettingsService: appSettingsService,
|
|
bleDebugLogService: bleDebugLogService,
|
|
appDebugLogService: appDebugLogService,
|
|
backgroundService: backgroundService,
|
|
);
|
|
|
|
await connector.loadContactCache();
|
|
await connector.loadChannelSettings();
|
|
|
|
// Load persisted channel messages
|
|
await connector.loadAllChannelMessages();
|
|
await connector.loadUnreadState();
|
|
|
|
runApp(
|
|
MeshCoreApp(
|
|
connector: connector,
|
|
retryService: retryService,
|
|
pathHistoryService: pathHistoryService,
|
|
storage: storage,
|
|
appSettingsService: appSettingsService,
|
|
bleDebugLogService: bleDebugLogService,
|
|
appDebugLogService: appDebugLogService,
|
|
mapTileCacheService: mapTileCacheService,
|
|
),
|
|
);
|
|
}
|
|
|
|
class MeshCoreApp extends StatelessWidget {
|
|
final MeshCoreConnector connector;
|
|
final MessageRetryService retryService;
|
|
final PathHistoryService pathHistoryService;
|
|
final StorageService storage;
|
|
final AppSettingsService appSettingsService;
|
|
final BleDebugLogService bleDebugLogService;
|
|
final AppDebugLogService appDebugLogService;
|
|
final MapTileCacheService mapTileCacheService;
|
|
|
|
const MeshCoreApp({
|
|
super.key,
|
|
required this.connector,
|
|
required this.retryService,
|
|
required this.pathHistoryService,
|
|
required this.storage,
|
|
required this.appSettingsService,
|
|
required this.bleDebugLogService,
|
|
required this.appDebugLogService,
|
|
required this.mapTileCacheService,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MultiProvider(
|
|
providers: [
|
|
ChangeNotifierProvider.value(value: connector),
|
|
ChangeNotifierProvider.value(value: retryService),
|
|
ChangeNotifierProvider.value(value: pathHistoryService),
|
|
ChangeNotifierProvider.value(value: appSettingsService),
|
|
ChangeNotifierProvider.value(value: bleDebugLogService),
|
|
ChangeNotifierProvider.value(value: appDebugLogService),
|
|
Provider.value(value: storage),
|
|
Provider.value(value: mapTileCacheService),
|
|
],
|
|
child: Consumer<AppSettingsService>(
|
|
builder: (context, settingsService, child) {
|
|
return MaterialApp(
|
|
title: 'MeshCore Open',
|
|
debugShowCheckedModeBanner: false,
|
|
localizationsDelegates: const [
|
|
AppLocalizations.delegate,
|
|
GlobalMaterialLocalizations.delegate,
|
|
GlobalWidgetsLocalizations.delegate,
|
|
GlobalCupertinoLocalizations.delegate,
|
|
],
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
locale: _localeFromSetting(
|
|
settingsService.settings.languageOverride,
|
|
),
|
|
theme: ThemeData(
|
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
|
|
useMaterial3: true,
|
|
snackBarTheme: const SnackBarThemeData(
|
|
behavior: SnackBarBehavior.floating,
|
|
),
|
|
),
|
|
darkTheme: ThemeData(
|
|
colorScheme: ColorScheme.fromSeed(
|
|
seedColor: Colors.blue,
|
|
brightness: Brightness.dark,
|
|
),
|
|
useMaterial3: true,
|
|
snackBarTheme: const SnackBarThemeData(
|
|
behavior: SnackBarBehavior.floating,
|
|
),
|
|
),
|
|
themeMode: _themeModeFromSetting(
|
|
settingsService.settings.themeMode,
|
|
),
|
|
home: const ScannerScreen(),
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
|
|
ThemeMode _themeModeFromSetting(String value) {
|
|
switch (value) {
|
|
case 'light':
|
|
return ThemeMode.light;
|
|
case 'dark':
|
|
return ThemeMode.dark;
|
|
default:
|
|
return ThemeMode.system;
|
|
}
|
|
}
|
|
|
|
Locale? _localeFromSetting(String? languageCode) {
|
|
if (languageCode == null) return null;
|
|
return Locale(languageCode);
|
|
}
|
|
}
|