Initial version

This commit is contained in:
2026-09-21 18:03:21 -04:00
commit e8e7dc4a81
83 changed files with 7177 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'screens/scan_screen.dart';
import 'services/ble_client.dart';
import 'services/protocol_log.dart';
import 'settings.dart';
import 'theme.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Future.wait([ProtocolLog.instance.init(), AppSettings.instance.load()]);
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
statusBarIconBrightness: Brightness.light,
systemNavigationBarColor: OsColors.background,
));
runApp(const OpenScooterApp());
}
/// Single BLE client for the whole app (one active connection at a time).
final _ble = FlutterBleClient();
/// Logs route changes into the protocol log for field debugging.
class _RouteLogger extends NavigatorObserver {
@override
void didPush(Route route, Route? previous) =>
ProtocolLog.instance.log('NAV', 'push ${route.settings.name ?? route.runtimeType}');
@override
void didPop(Route route, Route? previous) =>
ProtocolLog.instance.log('NAV', 'pop ${route.settings.name ?? route.runtimeType}');
@override
void didRemove(Route route, Route? previous) =>
ProtocolLog.instance.log('NAV', 'remove ${route.settings.name ?? route.runtimeType}');
}
class OpenScooterApp extends StatelessWidget {
const OpenScooterApp({super.key});
@override
Widget build(BuildContext context) {
final settings = AppSettings.instance;
return ListenableBuilder(
listenable: settings,
builder: (context, _) => MaterialApp(
title: 'OpenMotion',
debugShowCheckedModeBanner: false,
theme: buildOsTheme(settings.accent.color),
navigatorObservers: [_RouteLogger()],
home: ScanScreen(ble: _ble),
),
);
}
}