diff --git a/CHANGELOG.md b/CHANGELOG.md index d65bdca23..0a4376e2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Fixed + +- wrong window metrics on startup in some cases + ## [v1.6.7] - 2022-05-25 ### Added diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt index 4093ed403..203021676 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt @@ -5,9 +5,7 @@ import android.app.SearchManager import android.content.ClipData import android.content.Intent import android.net.Uri -import android.os.Build -import android.os.Bundle -import android.os.Parcelable +import android.os.* import android.util.Log import androidx.annotation.RequiresApi import androidx.core.content.pm.ShortcutInfoCompat @@ -125,6 +123,15 @@ class MainActivity : FlutterActivity() { Log.i(LOG_TAG, "onStart") super.onStart() analysisHandler.attachToActivity() + + // as of Flutter v3.0.1, the window `viewInsets` and `viewPadding` + // are incorrect on startup in some environments (e.g. API 29 emulator), + // so we manually request to apply the insets to update the window metrics + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { + Handler(Looper.getMainLooper()).postDelayed({ + window.decorView.requestApplyInsets() + }, 10) + } } override fun onStop() { diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 2ea40a119..14a878eac 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -55,6 +55,16 @@ class AvesApp extends StatefulWidget { @override State createState() => _AvesAppState(); + + static void showSystemUI() { + if (device.supportEdgeToEdgeUIMode) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + } else { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); + } + } + + static void hideSystemUI() => SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); } class _AvesAppState extends State with WidgetsBindingObserver { diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index a6fdf3aa1..ed16e8c82 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -2,7 +2,6 @@ import 'dart:math'; import 'package:aves/app_mode.dart'; import 'package:aves/model/actions/move_type.dart'; -import 'package:aves/model/device.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/trash.dart'; @@ -13,6 +12,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/utils/change_notifier.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/basic/insets.dart'; @@ -584,22 +584,10 @@ class _EntryViewerStackState extends State with FeedbackMixin, windowService.keepScreenOn(false); } - _showSystemUI(); + AvesApp.showSystemUI(); windowService.requestOrientation(); } - // system UI - - static void _showSystemUI() { - if (device.supportEdgeToEdgeUIMode) { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - } else { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); - } - } - - static void _hideSystemUI() => SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); - // overlay Future _initOverlay() async { @@ -611,7 +599,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, Future _onOverlayVisibleChange({bool animate = true}) async { if (_overlayVisible.value) { - _showSystemUI(); + AvesApp.showSystemUI(); if (animate) { await _overlayAnimationController.forward(); } else { @@ -623,7 +611,7 @@ class _EntryViewerStackState extends State with FeedbackMixin, _frozenViewInsets = mediaQuery.viewInsets; _frozenViewPadding = mediaQuery.viewPadding; }); - _hideSystemUI(); + AvesApp.hideSystemUI(); if (animate) { await _overlayAnimationController.reverse(); } else { diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart index dabe95efb..5d97c62ea 100644 --- a/lib/widgets/viewer/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -1,10 +1,10 @@ import 'dart:math'; -import 'package:aves/model/device.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/entry_images.dart'; import 'package:aves/model/panorama.dart'; import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/aves_app.dart'; import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; @@ -13,7 +13,6 @@ import 'package:aves/widgets/viewer/overlay/common.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; -import 'package:flutter/services.dart'; import 'package:latlong2/latlong.dart'; import 'package:panorama/panorama.dart'; import 'package:provider/provider.dart'; @@ -164,21 +163,11 @@ class _PanoramaPageState extends State { } void _onLeave() { - _showSystemUI(); + AvesApp.showSystemUI(); } // system UI - static void _showSystemUI() { - if (device.supportEdgeToEdgeUIMode) { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); - } else { - SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); - } - } - - static void _hideSystemUI() => SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); - // overlay Future _initOverlay() async { @@ -190,9 +179,9 @@ class _PanoramaPageState extends State { Future _onOverlayVisibleChange() async { if (_overlayVisible.value) { - _showSystemUI(); + AvesApp.showSystemUI(); } else { - _hideSystemUI(); + AvesApp.hideSystemUI(); } } }