diff --git a/lib/logic/app_logic.dart b/lib/logic/app_logic.dart index 1f939f22..48900654 100644 --- a/lib/logic/app_logic.dart +++ b/lib/logic/app_logic.dart @@ -1,9 +1,9 @@ import 'dart:async'; import 'package:desktop_window/desktop_window.dart'; -import 'package:flutter/foundation.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/utils/page_routes.dart'; class AppLogic { @@ -11,6 +11,17 @@ class AppLogic { /// The router will use this to prevent redirects while bootstrapping. bool isBootstrapComplete = false; + 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; + } + /// Initialize the app and all main actors. /// Loads settings, sets up services etc. Future bootstrap() async { @@ -18,16 +29,18 @@ class AppLogic { FlutterError.onError = _handleFlutterError; // Set min-sizes for desktop apps - await DesktopWindow.setMinWindowSize($styles.sizes.minAppSize); + if (PlatformInfo.isDesktop) { + await DesktopWindow.setMinWindowSize($styles.sizes.minAppSize); + } // Load any bitmaps the views might need await AppBitmaps.init(); - // Default to only allowing portrait mode - setDeviceOrientation(Axis.vertical); + // Set the initial supported orientations + setDeviceOrientation(supportedOrientations); // Set preferred refresh rate to the max possible (the OS may ignore this) - if (defaultTargetPlatform == TargetPlatform.android) { + if (PlatformInfo.isAndroid) { await FlutterDisplayMode.setHighRefreshRate(); } diff --git a/lib/logic/common/platform_info.dart b/lib/logic/common/platform_info.dart index b3d0fb8d..940eb8a1 100644 --- a/lib/logic/common/platform_info.dart +++ b/lib/logic/common/platform_info.dart @@ -9,6 +9,7 @@ class PlatformInfo { static const _mobilePlatforms = [TargetPlatform.android, TargetPlatform.iOS]; static bool get isDesktop => _desktopPlatforms.contains(defaultTargetPlatform); + static bool get isDesktopOrWeb => isDesktop || kIsWeb; static bool get isMobile => _mobilePlatforms.contains(defaultTargetPlatform); static double get pixelRatio => WidgetsBinding.instance.window.devicePixelRatio; diff --git a/lib/logic/data/unsplash_photo_data.dart b/lib/logic/data/unsplash_photo_data.dart index 5f7bde58..b5390e2e 100644 --- a/lib/logic/data/unsplash_photo_data.dart +++ b/lib/logic/data/unsplash_photo_data.dart @@ -1,4 +1,3 @@ -import 'package:flutter/foundation.dart'; import 'package:wonders/_tools/unsplash_download_service.dart'; import 'package:wonders/logic/common/platform_info.dart'; @@ -27,10 +26,7 @@ class UnsplashPhotoData { size = 1200; break; } - bool isDesktop = defaultTargetPlatform == TargetPlatform.windows || - defaultTargetPlatform == TargetPlatform.macOS || - defaultTargetPlatform == TargetPlatform.linux; - if (PlatformInfo.pixelRatio >= 1.5 || isDesktop) { + if (PlatformInfo.pixelRatio >= 1.5 || PlatformInfo.isDesktop) { size *= 2; } return 'https://wonderous.info/unsplash/$id-$size.jpg'; diff --git a/lib/logic/settings_logic.dart b/lib/logic/settings_logic.dart index 3a08c31a..f425cb26 100644 --- a/lib/logic/settings_logic.dart +++ b/lib/logic/settings_logic.dart @@ -1,5 +1,5 @@ -import 'package:flutter/foundation.dart'; import 'package:wonders/common_libs.dart'; +import 'package:wonders/logic/common/platform_info.dart'; import 'package:wonders/logic/common/save_load_mixin.dart'; class SettingsLogic with ThrottledSaveLoadMixin { @@ -10,7 +10,7 @@ class SettingsLogic with ThrottledSaveLoadMixin { late final hasDismissedSearchMessage = ValueNotifier(false)..addListener(scheduleSave); late final currentLocale = ValueNotifier(null)..addListener(scheduleSave); - final bool useBlurs = defaultTargetPlatform != TargetPlatform.android; + final bool useBlurs = !PlatformInfo.isAndroid; @override void copyFromJson(Map value) { diff --git a/lib/ui/common/app_scroll_behavior.dart b/lib/ui/common/app_scroll_behavior.dart index 11ab06e5..883c15ff 100644 --- a/lib/ui/common/app_scroll_behavior.dart +++ b/lib/ui/common/app_scroll_behavior.dart @@ -1,6 +1,6 @@ import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; +import 'package:wonders/logic/common/platform_info.dart'; /// Add mouse drag on desktop for easier responsive testing class AppScrollBehavior extends ScrollBehavior { @@ -15,7 +15,7 @@ class AppScrollBehavior extends ScrollBehavior { @override Widget buildScrollbar(BuildContext context, Widget child, ScrollableDetails details) { return child; - return defaultTargetPlatform == TargetPlatform.android + return PlatformInfo.isAndroid ? RawScrollbar(controller: details.controller, child: child) : CupertinoScrollbar(controller: details.controller, child: child); } diff --git a/lib/ui/common/modals/fullscreen_video_viewer.dart b/lib/ui/common/modals/fullscreen_video_viewer.dart index ce4d02c5..4caa64d5 100644 --- a/lib/ui/common/modals/fullscreen_video_viewer.dart +++ b/lib/ui/common/modals/fullscreen_video_viewer.dart @@ -24,7 +24,8 @@ class _FullscreenVideoPageState extends State { @override void dispose() { - appLogic.setDeviceOrientation(Axis.vertical); + // when view closes, restore the supported orientations + appLogic.setDeviceOrientation(appLogic.supportedOrientations); super.dispose(); } diff --git a/lib/ui/common/utils/app_haptics.dart b/lib/ui/common/utils/app_haptics.dart index 84bbbfdc..908bb523 100644 --- a/lib/ui/common/utils/app_haptics.dart +++ b/lib/ui/common/utils/app_haptics.dart @@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:wonders/common_libs.dart'; +import 'package:wonders/logic/common/platform_info.dart'; class AppHaptics { // note: system sounds are pretty buggy on Android: https://github.com/flutter/flutter/issues/57531 @@ -11,7 +12,7 @@ class AppHaptics { static void buttonPress() { // Android/Fuchsia expect haptics on all button presses, iOS does not. - if (defaultTargetPlatform != TargetPlatform.android || defaultTargetPlatform != TargetPlatform.fuchsia) { + if (PlatformInfo.isAndroid) { lightImpact(); } } diff --git a/lib/ui/screens/wallpaper_photo/wallpaper_photo_screen.dart b/lib/ui/screens/wallpaper_photo/wallpaper_photo_screen.dart index ce44d3cc..4a8fae95 100644 --- a/lib/ui/screens/wallpaper_photo/wallpaper_photo_screen.dart +++ b/lib/ui/screens/wallpaper_photo/wallpaper_photo_screen.dart @@ -1,8 +1,8 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:wonders/common_libs.dart'; +import 'package:wonders/logic/common/platform_info.dart'; import 'package:wonders/logic/data/wonder_data.dart'; import 'package:wonders/ui/common/app_icons.dart'; import 'package:wonders/ui/common/controls/checkbox.dart'; @@ -142,7 +142,7 @@ class _WallpaperPhotoScreenState extends State { Padding( padding: const EdgeInsets.only(top: 10.0, bottom: 10.0, right: 16.0), child: CircleIconBtn( - icon: defaultTargetPlatform == TargetPlatform.iOS ? AppIcons.share_ios : AppIcons.share_android, + icon: PlatformInfo.isIOS ? AppIcons.share_ios : AppIcons.share_android, bgColor: $styles.colors.offWhite, color: $styles.colors.black, onPressed: () => _handleSharePhoto(context, wonderData.title),