All checks were successful
ci/woodpecker/tag/release Pipeline was successful
Add Android foreground service support for downloads to prevent OS process killing during long operations. Fix multiple error handling issues: foreground service leak on exceptions, polling stuck forever on failure, double-counting chapters on retry, silent retry failures without user feedback, and app crash if background service init fails. Replace inaccurate failed chapter count heuristic with actual data. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
60 lines
1.9 KiB
Dart
60 lines
1.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
import 'package:worldhopper/l10n/app_localizations.dart';
|
|
import 'package:worldhopper/config/router.dart';
|
|
import 'package:worldhopper/config/theme.dart';
|
|
import 'package:worldhopper/config/constants.dart';
|
|
import 'package:worldhopper/providers/theme_provider.dart';
|
|
import 'package:worldhopper/providers/locale_provider.dart';
|
|
import 'package:worldhopper/providers/download_provider.dart';
|
|
|
|
/// Root application widget
|
|
class App extends ConsumerStatefulWidget {
|
|
const App({super.key});
|
|
|
|
@override
|
|
ConsumerState<App> createState() => _AppState();
|
|
}
|
|
|
|
class _AppState extends ConsumerState<App> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_checkIncompleteDownloads();
|
|
}
|
|
|
|
Future<void> _checkIncompleteDownloads() async {
|
|
try {
|
|
final hasActive = await ref.read(hasActiveDownloadsProvider.future);
|
|
if (hasActive) {
|
|
ref.read(downloadPollingActiveProvider.notifier).state = true;
|
|
}
|
|
} catch (e) {
|
|
debugPrint('Failed to check incomplete downloads: $e');
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final themeMode = ref.watch(themeNotifierProvider);
|
|
final locale = ref.watch(localeNotifierProvider);
|
|
|
|
return MaterialApp.router(
|
|
title: AppConstants.appName,
|
|
theme: AppTheme.lightTheme,
|
|
darkTheme: AppTheme.darkTheme,
|
|
themeMode: themeMode,
|
|
locale: locale,
|
|
localizationsDelegates: const [
|
|
AppLocalizations.delegate,
|
|
GlobalMaterialLocalizations.delegate,
|
|
GlobalWidgetsLocalizations.delegate,
|
|
GlobalCupertinoLocalizations.delegate,
|
|
],
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
routerConfig: AppRouter.router,
|
|
debugShowCheckedModeBanner: false,
|
|
);
|
|
}
|
|
}
|