Initial commit
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user