diff --git a/lib/common/widgets/image_viewer/gallery_viewer.dart b/lib/common/widgets/image_viewer/gallery_viewer.dart index be8479eda..122a3bf51 100644 --- a/lib/common/widgets/image_viewer/gallery_viewer.dart +++ b/lib/common/widgets/image_viewer/gallery_viewer.dart @@ -25,10 +25,13 @@ import 'package:PiliPlus/common/widgets/image_viewer/image.dart'; import 'package:PiliPlus/common/widgets/image_viewer/loading_indicator.dart'; import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; +import 'package:PiliPlus/main.dart' show tmpPadding; import 'package:PiliPlus/models/common/image_preview_type.dart'; +import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; +import 'package:PiliPlus/utils/max_screen_size.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; @@ -76,6 +79,7 @@ class _GalleryViewerState extends State late final int _quality; late final RxInt _currIndex; GlobalKey? _key; + EdgeInsets? _padding; late bool _hasInit = false; Player? _player; @@ -170,6 +174,45 @@ class _GalleryViewerState extends State ); } + late final bool _hideSystemBar; + + void _initHideSystemBar() { + if (Platform.isAndroid) { + if (showSystemBar_) { + final view = WidgetsBinding.instance.platformDispatcher.views.first; + final size = view.physicalSize / view.devicePixelRatio; + _hideSystemBar = !MaxScreenSize.isWindowMode( + width: size.width, + height: size.height, + ); + } else { + _hideSystemBar = false; + } + } else if (Platform.isIOS) { + _hideSystemBar = showSystemBar_; + } else { + _hideSystemBar = false; + } + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + if (_padding == null) { + final padding = MediaQuery.viewPaddingOf(context); + _padding = padding; + _initHideSystemBar(); + if (_hideSystemBar) { + tmpPadding = padding; + hideSystemBar()!.whenComplete( + () => WidgetsBinding.instance.addPostFrameCallback( + (_) => tmpPadding = null, + ), + ); + } + } + } + Matrix4 _onTransform(double val) { final scale = val.lerp(1.0, 0.25); @@ -259,6 +302,9 @@ class _GalleryViewerState extends State } Future.delayed(const Duration(milliseconds: 200), _currIndex.close); super.dispose(); + if (_hideSystemBar) { + showSystemBar(); + } } void _onPointerDown(PointerDownEvent event) { @@ -311,9 +357,7 @@ class _GalleryViewerState extends State right: 0, child: IgnorePointer( child: Container( - padding: - MediaQuery.viewPaddingOf(context) + - const EdgeInsets.fromLTRB(12, 8, 20, 8), + padding: _padding! + const EdgeInsets.fromLTRB(12, 8, 20, 8), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, diff --git a/lib/main.dart b/lib/main.dart index 5af902a2c..3c55517b3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -48,6 +48,8 @@ import 'package:window_manager/window_manager.dart' hide calcWindowPosition; WebViewEnvironment? webViewEnvironment; +EdgeInsets? tmpPadding; + Future _initDownPath() async { if (PlatformUtils.isDesktop) { final customDownPath = Pref.downloadPath; @@ -317,16 +319,20 @@ class MyApp extends StatelessWidget { data: mediaQuery.copyWith( textScaler: textScaler, size: mediaQuery.size / uiScale, - padding: mediaQuery.padding / uiScale, + padding: (tmpPadding ?? mediaQuery.padding) / uiScale, viewInsets: mediaQuery.viewInsets / uiScale, - viewPadding: mediaQuery.viewPadding / uiScale, + viewPadding: (tmpPadding ?? mediaQuery.viewPadding) / uiScale, devicePixelRatio: mediaQuery.devicePixelRatio * uiScale, ), child: child!, ); } else { child = MediaQuery( - data: mediaQuery.copyWith(textScaler: textScaler), + data: mediaQuery.copyWith( + textScaler: textScaler, + padding: tmpPadding, + viewPadding: tmpPadding, + ), child: child!, ); } diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 37d78c54d..95b40fd12 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -86,7 +86,7 @@ class _LiveRoomPageState extends State ..addStatusLister(playerListener); PlPlayerController.setPlayCallBack(plPlayerController.play); if (plPlayerController.removeSafeArea) { - hideStatusBar(); + hideSystemBar(); } } diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index c37eeb016..ebea9a417 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -142,7 +142,7 @@ class _VideoDetailPageVState extends State videoDetailController = Get.put(VideoDetailController(), tag: heroTag); if (videoDetailController.removeSafeArea) { - hideStatusBar(); + hideSystemBar(); } if (videoDetailController.showReply) { @@ -342,7 +342,7 @@ class _VideoDetailPageVState extends State } if (!videoDetailController.removeSafeArea) { - showStatusBar(); + showSystemBar(); } if (!videoDetailController.plPlayerController.isCloseAll) { diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 47ab0d843..7e902ab47 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -1474,7 +1474,7 @@ class PlPlayerController with BlockConfigMixin { try { if (status) { if (PlatformUtils.isMobile) { - hideStatusBar(); + hideSystemBar(); await changeOrientation( isVertical: isVertical, orientation: orientation, @@ -1485,7 +1485,7 @@ class PlPlayerController with BlockConfigMixin { } else { if (PlatformUtils.isMobile) { if (!removeSafeArea) { - showStatusBar(); + showSystemBar(); } if (orientation == null && mode == .none) { return; @@ -1632,7 +1632,7 @@ class PlPlayerController with BlockConfigMixin { _playerCount = 0; if (removeSafeArea) { - showStatusBar(); + showSystemBar(); } danmakuController = null; _stopOrientationListener(); diff --git a/lib/plugin/pl_player/utils/fullscreen.dart b/lib/plugin/pl_player/utils/fullscreen.dart index 3c7065f2f..a04c4a82a 100644 --- a/lib/plugin/pl_player/utils/fullscreen.dart +++ b/lib/plugin/pl_player/utils/fullscreen.dart @@ -62,21 +62,22 @@ Future? fullMode() { ); } -bool _showStatusBar = true; -Future? hideStatusBar() { - if (!_showStatusBar) { +bool _showSystemBar = true; +bool get showSystemBar_ => _showSystemBar; +Future? hideSystemBar() { + if (!_showSystemBar) { return null; } - _showStatusBar = false; + _showSystemBar = false; return SystemChrome.setEnabledSystemUIMode(.immersiveSticky); } //退出全屏显示 -Future? showStatusBar() { - if (_showStatusBar) { +Future? showSystemBar() { + if (_showSystemBar) { return null; } - _showStatusBar = true; + _showSystemBar = true; return SystemChrome.setEnabledSystemUIMode( Platform.isAndroid && Utils.sdkInt < 29 ? .manual : .edgeToEdge, overlays: SystemUiOverlay.values, diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index 3328ef7d1..b7c443afd 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -30,7 +30,6 @@ import 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart'; import 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart'; import 'package:PiliPlus/plugin/pl_player/models/hwdec_type.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; -import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/login_utils.dart'; @@ -599,14 +598,9 @@ abstract final class Pref { _setting.get(SettingBoxKey.horizontalScreen) ?? isTablet; static bool get isTablet { - bool isTablet; - if (Get.context != null) { - isTablet = Get.context!.isTablet; - } else { - final view = WidgetsBinding.instance.platformDispatcher.views.first; - final screenSize = view.physicalSize / view.devicePixelRatio; - isTablet = screenSize.shortestSide >= 600; - } + final view = WidgetsBinding.instance.platformDispatcher.views.first; + final size = view.physicalSize / view.devicePixelRatio; + final isTablet = size.shortestSide >= 600; _setting.put(SettingBoxKey.horizontalScreen, isTablet); return isTablet; }