90 lines
2.3 KiB
Dart
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);
|
|
}
|
|
}
|