From acf475c4b1f8909f409f59f21227c1a533501d27 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 26 Sep 2022 21:22:56 +0200 Subject: [PATCH] minor fixes --- lib/model/entry.dart | 2 ++ lib/widgets/aves_app.dart | 28 +++++++++++++--------- lib/widgets/viewer/info/basic_section.dart | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/model/entry.dart b/lib/model/entry.dart index 65443958b..6f9f3290b 100644 --- a/lib/model/entry.dart +++ b/lib/model/entry.dart @@ -277,6 +277,8 @@ class AvesEntry { bool get isMediaStoreContent => uri.startsWith('content://media/'); + bool get isMediaStoreMediaContent => isMediaStoreContent && {'/external/images/', '/external/video/'}.any(uri.contains); + bool get canEdit => path != null && !trashed && isMediaStoreContent; bool get canEditDate => canEdit && (canEditExif || canEditXmp); diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 86510c002..a81668b2c 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -105,11 +105,11 @@ class AvesApp extends StatefulWidget { class _AvesAppState extends State with WidgetsBindingObserver { final ValueNotifier appModeNotifier = ValueNotifier(AppMode.main); late final Future _appSetup; - late final Size _screenSize; late final Future _dynamicColorPaletteLoader; final CollectionSource _mediaStoreSource = MediaStoreSource(); final Debouncer _mediaStoreChangeDebouncer = Debouncer(delay: Durations.mediaContentChangeDebounceDelay); final Set _changedUris = {}; + Size? _screenSize; // observers are not registered when using the same list object with different items // the list itself needs to be reassigned @@ -119,15 +119,13 @@ class _AvesAppState extends State with WidgetsBindingObserver { final EventChannel _analysisCompletionChannel = const OptionalEventChannel('deckers.thibault/aves/analysis_events'); final EventChannel _errorChannel = const OptionalEventChannel('deckers.thibault/aves/error'); - Widget getFirstPage({Map? intentData}) => settings.hasAcceptedTerms ? HomePage(intentData: intentData) : const WelcomePage(); - @override void initState() { super.initState(); EquatableConfig.stringify = true; _appSetup = _setup(); // remember screen size to use it later, when `context` and `window` are no longer reliable - _screenSize = window.physicalSize / window.devicePixelRatio; + _screenSize = _getScreenSize(); _dynamicColorPaletteLoader = DynamicColorPlugin.getCorePalette(); _mediaStoreChangeChannel.receiveBroadcastStream().listen((event) => _onMediaStoreChange(event as String?)); _newIntentChannel.receiveBroadcastStream().listen((event) => _onNewIntent(event as Map?)); @@ -159,7 +157,7 @@ class _AvesAppState extends State with WidgetsBindingObserver { AvesApp.showSystemUI(); } final home = initialized - ? getFirstPage() + ? _getFirstPage() : Scaffold( body: snapshot.hasError ? _buildError(snapshot.error!) : const SizedBox(), ); @@ -291,23 +289,31 @@ class _AvesAppState extends State with WidgetsBindingObserver { } } + Widget _getFirstPage({Map? intentData}) => settings.hasAcceptedTerms ? HomePage(intentData: intentData) : const WelcomePage(); + + Size? _getScreenSize() { + final physicalSize = window.physicalSize; + final ratio = window.devicePixelRatio; + return physicalSize > Size.zero && ratio > 0 ? physicalSize / ratio : null; + } + // save IDs of entries visible at the top of the collection page with current layout settings void _saveTopEntries() { if (!settings.initialized) return; - final stopwatch = Stopwatch()..start(); + final screenSize = _screenSize ?? _getScreenSize(); + if (screenSize == null) return; var tileExtent = settings.getTileExtent(CollectionPage.routeName); if (tileExtent == 0) { - tileExtent = _screenSize.shortestSide / CollectionGrid.columnCountDefault; + tileExtent = screenSize.shortestSide / CollectionGrid.columnCountDefault; } - final rows = (_screenSize.height / tileExtent).ceil(); - final columns = (_screenSize.width / tileExtent).ceil(); + final rows = (screenSize.height / tileExtent).ceil(); + final columns = (screenSize.width / tileExtent).ceil(); final count = rows * columns; final collection = CollectionLens(source: _mediaStoreSource, listenToSource: false); settings.topEntryIds = collection.sortedEntries.take(count).map((entry) => entry.id).toList(); collection.dispose(); - debugPrint('Saved $count top entries in ${stopwatch.elapsed.inMilliseconds}ms'); } // setup before the first page is displayed. keep it short @@ -389,7 +395,7 @@ class _AvesAppState extends State with WidgetsBindingObserver { reportService.log('New intent'); AvesApp.navigatorKey.currentState!.pushReplacement(DirectMaterialPageRoute( settings: const RouteSettings(name: HomePage.routeName), - builder: (_) => getFirstPage(intentData: intentData), + builder: (_) => _getFirstPage(intentData: intentData), )); } diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart index 5e599b3a6..b5b61a750 100644 --- a/lib/widgets/viewer/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -189,7 +189,7 @@ class _BasicInfoState extends State<_BasicInfo> { @override void initState() { super.initState(); - if (!entry.trashed && entry.isMediaStoreContent) { + if (!entry.trashed && entry.isMediaStoreMediaContent) { _ownerPackageLoader = metadataFetchService.hasContentResolverProp(ownerPackageNamePropKey).then((exists) { return exists ? metadataFetchService.getContentResolverProp(entry, ownerPackageNamePropKey) : SynchronousFuture(null); });