// lib/main.dart import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'services/media_service.dart'; import 'screens/player_screen.dart'; import 'screens/permission_screen.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); // Force portrait SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); runApp(const OpenVinylApp()); } class OpenVinylApp extends StatelessWidget { const OpenVinylApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'OpenVinyl', debugShowCheckedModeBanner: false, theme: ThemeData.dark(useMaterial3: true), home: AppEntry(mediaService: MediaService()), ); } } /// Checks notification permission on startup, shows the right screen. class AppEntry extends StatefulWidget { final MediaService mediaService; const AppEntry({super.key, required this.mediaService}); @override State createState() => _AppEntryState(); } class _AppEntryState extends State with WidgetsBindingObserver { bool? _hasPermission; // null = loading @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); _checkPermission(); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } // Re-check permission when the user returns from system settings @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed && _hasPermission == false) { _checkPermission(); } } Future _checkPermission() async { final granted = await widget.mediaService.hasPermission(); setState(() => _hasPermission = granted); } @override Widget build(BuildContext context) { if (_hasPermission == null) { // Still loading return const Scaffold( backgroundColor: Color(0xFF0D0D0D), body: Center( child: CircularProgressIndicator(color: Colors.white30), ), ); } if (!_hasPermission!) { return PermissionScreen( mediaService: widget.mediaService, onPermissionGranted: () => setState(() => _hasPermission = true), ); } return PlayerScreen(mediaService: widget.mediaService); } }