mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-04-01 17:40:32 +02:00
- Add advanced filename template placeholders: {track_raw}, {disc_raw}, {date},
formatted numbers {track:N}/{disc:N}, and date formatting {date:%Y-%m-%d}
with strftime-to-Go layout conversion and robust date parser
- Pass date/release_date metadata to filename builder in all providers
(Amazon, Qobuz, Tidal, YouTube, extensions) and Flutter download queue
- Detect ARM32-only / low-RAM Android devices at startup and reduce image
cache size and disable overscroll effects for smoother experience
- Make artist screen selection bar responsive: compact stacked layout on
narrow screens or large text scale; add quality picker before track download
- Add advanced tags toggle in download settings filename format editor
- Fix ICU plural syntax in DE/ES/PT/RU translations (one {}=1{...} -> one {...})
- Add filenameShowAdvancedTags l10n strings (EN, ID) and regenerate dart files
- Fix featured-artist regex: remove '&' from split separators
- Add Go filename template tests (filename_test.go)
- Add GitHub Pages workflow and static project site
91 lines
3.0 KiB
Dart
91 lines
3.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:spotiflac_android/screens/main_shell.dart';
|
|
import 'package:spotiflac_android/screens/setup_screen.dart';
|
|
import 'package:spotiflac_android/screens/tutorial_screen.dart';
|
|
import 'package:spotiflac_android/providers/settings_provider.dart';
|
|
import 'package:spotiflac_android/theme/dynamic_color_wrapper.dart';
|
|
import 'package:spotiflac_android/l10n/app_localizations.dart';
|
|
|
|
final _routerProvider = Provider<GoRouter>((ref) {
|
|
final isFirstLaunch = ref.watch(
|
|
settingsProvider.select((s) => s.isFirstLaunch),
|
|
);
|
|
final hasCompletedTutorial = ref.watch(
|
|
settingsProvider.select((s) => s.hasCompletedTutorial),
|
|
);
|
|
|
|
// Determine initial location based on app state
|
|
String initialLocation;
|
|
if (isFirstLaunch) {
|
|
initialLocation = '/setup';
|
|
} else if (!hasCompletedTutorial) {
|
|
initialLocation = '/tutorial';
|
|
} else {
|
|
initialLocation = '/';
|
|
}
|
|
|
|
return GoRouter(
|
|
initialLocation: initialLocation,
|
|
routes: [
|
|
GoRoute(path: '/', builder: (context, state) => const MainShell()),
|
|
GoRoute(path: '/setup', builder: (context, state) => const SetupScreen()),
|
|
GoRoute(
|
|
path: '/tutorial',
|
|
builder: (context, state) => const TutorialScreen(),
|
|
),
|
|
],
|
|
);
|
|
});
|
|
|
|
class SpotiFLACApp extends ConsumerWidget {
|
|
final bool disableOverscrollEffects;
|
|
|
|
const SpotiFLACApp({super.key, this.disableOverscrollEffects = false});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final router = ref.watch(_routerProvider);
|
|
final localeString = ref.watch(settingsProvider.select((s) => s.locale));
|
|
final scrollBehavior = disableOverscrollEffects
|
|
? const MaterialScrollBehavior().copyWith(overscroll: false)
|
|
: null;
|
|
|
|
Locale? locale;
|
|
if (localeString != 'system') {
|
|
if (localeString.contains('_')) {
|
|
final parts = localeString.split('_');
|
|
locale = Locale(parts[0], parts[1]);
|
|
} else {
|
|
locale = Locale(localeString);
|
|
}
|
|
}
|
|
|
|
return DynamicColorWrapper(
|
|
builder: (lightTheme, darkTheme, themeMode) {
|
|
return MaterialApp.router(
|
|
title: 'SpotiFLAC',
|
|
debugShowCheckedModeBanner: false,
|
|
theme: lightTheme,
|
|
darkTheme: darkTheme,
|
|
themeMode: themeMode,
|
|
scrollBehavior: scrollBehavior,
|
|
themeAnimationDuration: const Duration(milliseconds: 300),
|
|
themeAnimationCurve: Curves.easeInOut,
|
|
routerConfig: router,
|
|
locale: locale,
|
|
localizationsDelegates: const [
|
|
AppLocalizations.delegate,
|
|
GlobalMaterialLocalizations.delegate,
|
|
GlobalWidgetsLocalizations.delegate,
|
|
GlobalCupertinoLocalizations.delegate,
|
|
],
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|