2022-08-29 20:38:28 -06:00
|
|
|
import 'dart:async';
|
|
|
|
|
2022-10-24 15:42:27 -06:00
|
|
|
import 'package:desktop_window/desktop_window.dart';
|
2022-09-01 09:17:35 -06:00
|
|
|
import 'package:flutter_displaymode/flutter_displaymode.dart';
|
2022-08-29 20:38:28 -06:00
|
|
|
import 'package:wonders/common_libs.dart';
|
2022-11-05 02:06:51 -06:00
|
|
|
import 'package:wonders/logic/common/platform_info.dart';
|
2022-08-29 20:38:28 -06:00
|
|
|
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;
|
|
|
|
|
2022-11-05 02:06:51 -06:00
|
|
|
bool get isDesktopOrTablet => PlatformInfo.isDesktopOrWeb || deviceSize.shortestSide > 500;
|
|
|
|
|
|
|
|
/// Support portrait and landscape on desktop, web and tablets. Stick to portrait for phones.
|
|
|
|
/// A return value of null indicated both orientations are supported.
|
|
|
|
Axis? get supportedOrientations => isDesktopOrTablet ? null : Axis.vertical;
|
|
|
|
|
|
|
|
Size get deviceSize {
|
|
|
|
final w = WidgetsBinding.instance.platformDispatcher.views.first;
|
|
|
|
return w.physicalSize / w.devicePixelRatio;
|
|
|
|
}
|
|
|
|
|
2022-08-29 20:38:28 -06:00
|
|
|
/// Initialize the app and all main actors.
|
|
|
|
/// Loads settings, sets up services etc.
|
|
|
|
Future<void> bootstrap() async {
|
|
|
|
// Default error handler
|
|
|
|
FlutterError.onError = _handleFlutterError;
|
|
|
|
|
2022-10-24 15:42:27 -06:00
|
|
|
// Set min-sizes for desktop apps
|
2022-11-05 02:06:51 -06:00
|
|
|
if (PlatformInfo.isDesktop) {
|
|
|
|
await DesktopWindow.setMinWindowSize($styles.sizes.minAppSize);
|
|
|
|
}
|
2022-10-24 15:42:27 -06:00
|
|
|
|
2022-08-29 20:38:28 -06:00
|
|
|
// Load any bitmaps the views might need
|
|
|
|
await AppBitmaps.init();
|
|
|
|
|
2022-11-05 02:06:51 -06:00
|
|
|
// Set the initial supported orientations
|
|
|
|
setDeviceOrientation(supportedOrientations);
|
2022-08-29 20:38:28 -06:00
|
|
|
|
2022-09-01 20:46:15 -06:00
|
|
|
// Set preferred refresh rate to the max possible (the OS may ignore this)
|
2022-11-05 02:06:51 -06:00
|
|
|
if (PlatformInfo.isAndroid) {
|
2022-09-06 13:35:47 -06:00
|
|
|
await FlutterDisplayMode.setHighRefreshRate();
|
|
|
|
}
|
2022-09-01 09:17:35 -06:00
|
|
|
|
2022-09-08 12:14:28 -06:00
|
|
|
// Settings
|
|
|
|
await settingsLogic.load();
|
|
|
|
|
2022-09-01 20:46:15 -06:00
|
|
|
// Localizations
|
2022-08-29 20:38:28 -06:00
|
|
|
await localeLogic.load();
|
2022-09-01 20:46:15 -06:00
|
|
|
|
2022-09-08 12:14:28 -06:00
|
|
|
// Wonders Data
|
2022-09-01 14:45:55 -06:00
|
|
|
wondersLogic.init();
|
|
|
|
|
2022-09-08 12:14:28 -06:00
|
|
|
// Events
|
2022-09-01 14:45:55 -06:00
|
|
|
timelineLogic.init();
|
2022-09-01 20:46:15 -06:00
|
|
|
|
|
|
|
// Collectibles
|
2022-08-29 20:38:28 -06:00
|
|
|
await collectiblesLogic.load();
|
|
|
|
|
2022-09-08 12:14:28 -06:00
|
|
|
// Flag bootStrap as complete
|
2022-08-29 20:38:28 -06:00
|
|
|
isBootstrapComplete = true;
|
|
|
|
|
2022-09-08 12:14:28 -06:00
|
|
|
// Load initial view (replace empty initial view which is covered by a native splash screen)
|
2022-09-01 20:46:15 -06:00
|
|
|
bool showIntro = settingsLogic.hasCompletedOnboarding.value == false;
|
2022-12-01 23:12:15 -07:00
|
|
|
if (showIntro) {
|
2022-08-29 20:38:28 -06:00
|
|
|
appRouter.go(ScreenPaths.intro);
|
2022-09-01 20:46:15 -06:00
|
|
|
} else {
|
|
|
|
appRouter.go(ScreenPaths.home);
|
2022-08-29 20:38:28 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void setDeviceOrientation(Axis? axis) {
|
|
|
|
final orientations = <DeviceOrientation>[];
|
|
|
|
if (axis == null || axis == Axis.vertical) {
|
|
|
|
orientations.addAll([
|
|
|
|
DeviceOrientation.portraitUp,
|
|
|
|
DeviceOrientation.portraitDown,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
if (axis == null || axis == Axis.horizontal) {
|
|
|
|
orientations.addAll([
|
|
|
|
DeviceOrientation.landscapeLeft,
|
|
|
|
DeviceOrientation.landscapeRight,
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
SystemChrome.setPreferredOrientations(orientations);
|
|
|
|
}
|
|
|
|
|
|
|
|
void _handleFlutterError(FlutterErrorDetails details) {
|
|
|
|
FlutterError.dumpErrorToConsole(details);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<T?> showFullscreenDialogRoute<T>(BuildContext context, Widget child) async {
|
|
|
|
return await Navigator.of(context).push<T>(
|
|
|
|
PageRoutes.dialog<T>(child, $styles.times.pageTransition),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|