import 'dart:async'; import 'package:desktop_window/desktop_window.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:wonders/common_libs.dart'; import 'package:wonders/logic/common/platform_info.dart'; import 'package:wonders/ui/common/modals/fullscreen_video_viewer.dart'; import 'package:wonders/ui/common/utils/page_routes.dart'; class AppLogic { /// Indicates to the rest of the app that bootstrap has not completed. /// The router will use this to prevent redirects while bootstrapping. bool isBootstrapComplete = false; /// Indicates which orientations the app will allow be default. Affects Android/iOS devices only. /// Defaults to both landscape (hz) and portrait (vt) List supportedOrientations = [Axis.vertical, Axis.horizontal]; /// Allow a view to override the currently supported orientations. For example, [FullscreenVideoViewer] always wants to enable both landscape and portrait. /// If a view sets this override, they are responsible for setting it back to null when finished. List? _supportedOrientationsOverride; set supportedOrientationsOverride(List? value) { if (_supportedOrientationsOverride != value) { _supportedOrientationsOverride = value; _updateSystemOrientation(); } } /// Initialize the app and all main actors. /// Loads settings, sets up services etc. Future bootstrap() async { debugPrint('bootstrap start...'); // Set min-sizes for desktop apps if (PlatformInfo.isDesktop) { await DesktopWindow.setMinWindowSize($styles.sizes.minAppSize); } // Load any bitmaps the views might need await AppBitmaps.init(); // Set preferred refresh rate to the max possible (the OS may ignore this) if (PlatformInfo.isAndroid) { await FlutterDisplayMode.setHighRefreshRate(); } // Settings await settingsLogic.load(); // Localizations await localeLogic.load(); // Wonders Data wondersLogic.init(); // Events timelineLogic.init(); // Collectibles await collectiblesLogic.load(); // Flag bootStrap as complete isBootstrapComplete = true; // Load initial view (replace empty initial view which is covered by a native splash screen) bool showIntro = settingsLogic.hasCompletedOnboarding.value == false; if (showIntro) { appRouter.go(ScreenPaths.intro); } else { appRouter.go(ScreenPaths.home); } } Future showFullscreenDialogRoute(BuildContext context, Widget child, {bool transparent = false}) async { return await Navigator.of(context).push( PageRoutes.dialog(child, duration: $styles.times.pageTransition), ); } /// Called from the UI layer once a MediaQuery has been obtained void handleAppSizeChanged(Size size) { /// Disable landscape layout on smaller form factors bool isSmall = size.shortestSide < 500 && size != Size.zero; supportedOrientations = isSmall ? [Axis.vertical] : [Axis.vertical, Axis.horizontal]; _updateSystemOrientation(); } /// Enable landscape, portrait or both. Views can call this method to override the default settings. /// For example, the [FullscreenVideoViewer] always wants to enable both landscape and portrait. /// If a view overrides this, it is responsible for setting it back to [supportedOrientations] when disposed. void _updateSystemOrientation() { final axisList = _supportedOrientationsOverride ?? supportedOrientations; //debugPrint('updateDeviceOrientation, supportedAxis: $axisList'); final orientations = []; if (axisList.contains(Axis.vertical)) { orientations.addAll([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); } if (axisList.contains(Axis.horizontal)) { orientations.addAll([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); } SystemChrome.setPreferredOrientations(orientations); } } class AppImageCache extends WidgetsFlutterBinding { @override ImageCache createImageCache() { this.imageCache.maximumSizeBytes = 250 << 20; // 250mb return super.createImageCache(); } }