This commit is contained in:
Thibault Deckers 2023-03-10 11:46:36 +01:00
parent 1374b8d492
commit beb65a8d51
7 changed files with 24 additions and 5 deletions

View file

@ -284,7 +284,7 @@ This change eventually prevents building the app with Flutter v3.3.3.
<meta-data <meta-data
android:name="flutterEmbedding" android:name="flutterEmbedding"
android:value="2" /> android:value="2" />
<!-- as of Flutter v3.3.0, background blur & icon shading fail with Impeller --> <!-- as of Flutter v3.7.7, background blur yields black screen with Impeller -->
<meta-data <meta-data
android:name="io.flutter.embedding.android.EnableImpeller" android:name="io.flutter.embedding.android.EnableImpeller"
android:value="false" /> android:value="false" />

View file

@ -11,6 +11,7 @@ import 'package:aves/model/source/enums/enums.dart';
import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/model/vaults/vaults.dart';
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/android_file_utils.dart';
import 'package:aves/utils/file_utils.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -201,7 +202,8 @@ class MediaStoreSource extends CollectionSource {
// so we manually notify change for potential home screen filters // so we manually notify change for potential home screen filters
notifyAlbumsChanged(); notifyAlbumsChanged();
debugPrint('$runtimeType refresh ${stopwatch.elapsed} done for ${knownEntries.length} known, ${allNewEntries.length} new, ${removedEntries.length} removed'); debugPrint('$runtimeType refresh ${stopwatch.elapsed} done');
unawaited(reportService.log('Source refresh complete in ${stopwatch.elapsed.inSeconds}s for ${knownEntries.length} known, ${allNewEntries.length} new, ${removedEntries.length} removed'));
}, },
onError: (error) => debugPrint('$runtimeType stream error=$error'), onError: (error) => debugPrint('$runtimeType stream error=$error'),
); );

View file

@ -256,7 +256,10 @@ class _EntryLeafletMapState<T> extends State<EntryLeafletMap<T>> with TickerProv
} }
Future<void> _resetRotation() async { Future<void> _resetRotation() async {
final rotationTween = Tween<double>(begin: _leafletMapController.rotation, end: 0); final rotation = _leafletMapController.rotation;
// prevent multiple turns
final begin = (rotation.abs() % 360) * rotation.sign;
final rotationTween = Tween<double>(begin: begin, end: 0);
await _animateCamera((animation) => _leafletMapController.rotate(rotationTween.evaluate(animation))); await _animateCamera((animation) => _leafletMapController.rotate(rotationTween.evaluate(animation)));
} }

View file

@ -12,11 +12,13 @@ import 'package:aves/widgets/viewer/entry_viewer_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class EmbeddedDataOpener extends StatelessWidget with FeedbackMixin { class EmbeddedDataOpener extends StatelessWidget with FeedbackMixin {
final bool enabled;
final AvesEntry entry; final AvesEntry entry;
final Widget child; final Widget child;
const EmbeddedDataOpener({ const EmbeddedDataOpener({
super.key, super.key,
required this.enabled,
required this.entry, required this.entry,
required this.child, required this.child,
}); });
@ -25,8 +27,11 @@ class EmbeddedDataOpener extends StatelessWidget with FeedbackMixin {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return NotificationListener<OpenEmbeddedDataNotification>( return NotificationListener<OpenEmbeddedDataNotification>(
onNotification: (notification) { onNotification: (notification) {
if (enabled) {
_openEmbeddedData(context, notification); _openEmbeddedData(context, notification);
return true; return true;
}
return false;
}, },
child: child, child: child,
); );

View file

@ -1,6 +1,7 @@
import 'package:aves/app_mode.dart'; import 'package:aves/app_mode.dart';
import 'package:aves/model/actions/entry_actions.dart'; import 'package:aves/model/actions/entry_actions.dart';
import 'package:aves/model/entry.dart'; import 'package:aves/model/entry.dart';
import 'package:aves/model/selection.dart';
import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/theme/durations.dart'; import 'package:aves/theme/durations.dart';
@ -104,12 +105,14 @@ class InfoAppBar extends StatelessWidget {
} }
void _goToSearch(BuildContext context) { void _goToSearch(BuildContext context) {
final isSelecting = context.read<Selection<AvesEntry>?>()?.isSelecting ?? false;
showSearch( showSearch(
context: context, context: context,
delegate: InfoSearchDelegate( delegate: InfoSearchDelegate(
searchFieldLabel: context.l10n.viewerInfoSearchFieldLabel, searchFieldLabel: context.l10n.viewerInfoSearchFieldLabel,
entry: entry, entry: entry,
metadataNotifier: metadataNotifier, metadataNotifier: metadataNotifier,
isSelecting: isSelecting,
), ),
); );
} }

View file

@ -4,6 +4,7 @@ import 'package:aves/model/actions/entry_actions.dart';
import 'package:aves/model/actions/events.dart'; import 'package:aves/model/actions/events.dart';
import 'package:aves/model/entry.dart'; import 'package:aves/model/entry.dart';
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/selection.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/theme/durations.dart'; import 'package:aves/theme/durations.dart';
import 'package:aves/widgets/common/basic/insets.dart'; import 'package:aves/widgets/common/basic/insets.dart';
@ -67,9 +68,11 @@ class _InfoPageState extends State<InfoPage> {
builder: (context, mainEntry, child) { builder: (context, mainEntry, child) {
if (mainEntry == null) return const SizedBox(); if (mainEntry == null) return const SizedBox();
final isSelecting = context.select<Selection<AvesEntry>?, bool>((v) => v?.isSelecting ?? false);
Widget _buildContent({AvesEntry? pageEntry}) { Widget _buildContent({AvesEntry? pageEntry}) {
final targetEntry = pageEntry ?? mainEntry; final targetEntry = pageEntry ?? mainEntry;
return EmbeddedDataOpener( return EmbeddedDataOpener(
enabled: !isSelecting,
entry: targetEntry, entry: targetEntry,
child: _InfoPageContent( child: _InfoPageContent(
collection: widget.collection, collection: widget.collection,

View file

@ -12,6 +12,7 @@ import 'package:flutter/material.dart';
class InfoSearchDelegate extends SearchDelegate { class InfoSearchDelegate extends SearchDelegate {
final AvesEntry entry; final AvesEntry entry;
final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier; final ValueNotifier<Map<String, MetadataDirectory>> metadataNotifier;
final bool isSelecting;
Map<String, MetadataDirectory> get metadata => metadataNotifier.value; Map<String, MetadataDirectory> get metadata => metadataNotifier.value;
@ -19,6 +20,7 @@ class InfoSearchDelegate extends SearchDelegate {
required String searchFieldLabel, required String searchFieldLabel,
required this.entry, required this.entry,
required this.metadataNotifier, required this.metadataNotifier,
required this.isSelecting,
}) : super( }) : super(
searchFieldLabel: searchFieldLabel, searchFieldLabel: searchFieldLabel,
); );
@ -113,6 +115,7 @@ class InfoSearchDelegate extends SearchDelegate {
text: context.l10n.viewerInfoSearchEmpty, text: context.l10n.viewerInfoSearchEmpty,
) )
: EmbeddedDataOpener( : EmbeddedDataOpener(
enabled: !isSelecting,
entry: entry, entry: entry,
child: ListView.builder( child: ListView.builder(
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),