import 'dart:async'; import 'package:abawo_bt_app/controller/bluetooth.dart'; import 'package:abawo_bt_app/pages/devices_page.dart'; import 'package:abawo_bt_app/pages/devices_tab_page.dart'; import 'package:abawo_bt_app/src/rust/frb_generated.dart'; import 'package:abawo_bt_app/theme/app_theme.dart'; import 'package:abawo_bt_app/util/sharedPrefs.dart'; import 'package:abawo_bt_app/widgets/app_shell.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:logging/logging.dart'; import 'package:nb_utils/nb_utils.dart'; import 'pages/settings_page.dart'; import 'package:abawo_bt_app/pages/device_details_page.dart'; Future main() async { Logger.root.level = Level.ALL; // defaults to Level.INFO Logger.root.onRecord.listen((record) { debugPrint('${record.level.name}: ${record.time}: ${record.message}'); }); await RustLib.init(); WidgetsFlutterBinding.ensureInitialized(); await initialize(); final prefs = await SharedPreferences.getInstance(); runApp(ProviderScope(overrides: [ // Override the unimplemented provider with the actual instance sharedPreferencesProvider.overrideWithValue(prefs), ], child: const AbawoBtApp())); } class AbawoBtApp extends ConsumerStatefulWidget { const AbawoBtApp({super.key}); @override ConsumerState createState() => _AbawoBtAppState(); } class _AbawoBtAppState extends ConsumerState with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.hidden || state == AppLifecycleState.paused) { if (ref.read(backgroundBluetoothDisconnectSuppressedProvider)) { return; } unawaited(_disconnectBluetoothForBackground()); } } Future _disconnectBluetoothForBackground() async { final bluetooth = ref.read(bluetoothProvider).value; if (bluetooth == null) { return; } await bluetooth.stopScan(); await bluetooth.disconnect(); } @override Widget build(BuildContext context) { final themePreference = ref.watch(appThemePreferenceProvider); return MaterialApp.router( title: 'Abawo BT App', theme: AppTheme.light(), darkTheme: AppTheme.dark(), themeMode: switch (themePreference) { AppThemePreference.light => ThemeMode.light, AppThemePreference.dark => ThemeMode.dark, AppThemePreference.system => ThemeMode.system, }, routerConfig: _router, debugShowCheckedModeBanner: false, ); } } // Configure GoRouter final _router = GoRouter( navigatorKey: navigatorKey, initialLocation: '/devices', routes: [ ShellRoute( builder: (context, state, child) => AppShell( currentLocation: state.uri.path, child: child, ), routes: [ GoRoute( path: '/devices', builder: (context, state) => const DevicesTabPage(), ), GoRoute( path: '/settings', builder: (context, state) => const SettingsPage(), ), ], ), GoRoute( path: '/connect_device', builder: (context, state) => const ConnectDevicePage(), ), GoRoute( path: '/device/:deviceAddress', builder: (context, state) { final deviceAddress = state.pathParameters['deviceAddress']!; return DeviceDetailsPage(deviceAddress: deviceAddress); }, ), ], ); /* import 'package:flutter/material.dart'; import 'package:abawo_bt_app/src/rust/api/simple.dart'; import 'package:abawo_bt_app/src/rust/frb_generated.dart'; Future main() async { await RustLib.init(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('flutter_rust_bridge quickstart')), body: Center( child: Text( 'Action: Call Rust `greet("Tom")`\nResult: `${greet(name: "Tom")}`'), ), ), ); } } */