Files
2026-05-18 09:55:25 +01:00

90 lines
2.3 KiB
Dart

// 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<AppEntry> createState() => _AppEntryState();
}
class _AppEntryState extends State<AppEntry> 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<void> _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);
}
}