import 'package:flutter/foundation.dart'; import 'package:flutter_saf/flutter_saf.dart'; import 'package:rhttp/rhttp.dart'; import 'package:venera/foundation/app.dart'; import 'package:venera/foundation/cache_manager.dart'; import 'package:venera/foundation/comic_source/comic_source.dart'; import 'package:venera/foundation/js_engine.dart'; import 'package:venera/foundation/log.dart'; import 'package:venera/network/cookie_jar.dart'; import 'package:venera/pages/comic_source_page.dart'; import 'package:venera/pages/follow_updates_page.dart'; import 'package:venera/pages/settings/settings_page.dart'; import 'package:venera/utils/app_links.dart'; import 'package:venera/utils/tags_translation.dart'; import 'package:venera/utils/translations.dart'; import 'foundation/appdata.dart'; extension _FutureInit on Future { /// Prevent unhandled exception /// /// A unhandled exception occurred in init() will cause the app to crash. Future wait() async { try { await this; } catch (e, s) { Log.error("init", "$e\n$s"); } } } Future init() async { await App.init().wait(); SingleInstanceCookieJar("${App.dataPath}/cookie.db"); var futures = [ Rhttp.init(), SAFTaskWorker().init().wait(), AppTranslation.init().wait(), TagsTranslation.readData().wait(), JsEngine().init().then((_) => ComicSource.init()).wait(), ]; await Future.wait(futures); CacheManager().setLimitSize(appdata.settings['cacheSize']); _checkOldConfigs(); if (App.isAndroid) { handleLinks(); } FlutterError.onError = (details) { Log.error("Unhandled Exception", "${details.exception}\n${details.stack}"); }; } void _checkOldConfigs() { if (appdata.settings['searchSources'] == null) { appdata.settings['searchSources'] = ComicSource.all() .where((e) => e.searchPageData != null) .map((e) => e.key) .toList(); } } Future _checkAppUpdates() async { var lastCheck = appdata.implicitData['lastCheckUpdate'] ?? 0; var now = DateTime.now().millisecondsSinceEpoch; if (now - lastCheck < 24 * 60 * 60 * 1000) { return; } appdata.implicitData['lastCheckUpdate'] = now; appdata.writeImplicitData(); ComicSourcePage.checkComicSourceUpdate(); if (appdata.settings['checkUpdateOnStart']) { await Future.delayed(const Duration(milliseconds: 300)); await checkUpdateUi(false); } } void checkUpdates() { _checkAppUpdates(); FollowUpdatesService.initChecker(); }