diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index f7b14d5d6..c7eebea8b 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -284,7 +284,7 @@ This change eventually prevents building the app with Flutter v3.3.3.
-
+
diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart
index 7744ca664..546180916 100644
--- a/lib/model/source/media_store_source.dart
+++ b/lib/model/source/media_store_source.dart
@@ -11,6 +11,7 @@ import 'package:aves/model/source/enums/enums.dart';
import 'package:aves/model/vaults/vaults.dart';
import 'package:aves/services/common/services.dart';
import 'package:aves/utils/android_file_utils.dart';
+import 'package:aves/utils/file_utils.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
@@ -201,7 +202,8 @@ class MediaStoreSource extends CollectionSource {
// so we manually notify change for potential home screen filters
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'),
);
diff --git a/lib/widgets/common/map/leaflet/map.dart b/lib/widgets/common/map/leaflet/map.dart
index 1e3f39ca9..ec9a5b0a7 100644
--- a/lib/widgets/common/map/leaflet/map.dart
+++ b/lib/widgets/common/map/leaflet/map.dart
@@ -256,7 +256,10 @@ class _EntryLeafletMapState extends State> with TickerProv
}
Future _resetRotation() async {
- final rotationTween = Tween(begin: _leafletMapController.rotation, end: 0);
+ final rotation = _leafletMapController.rotation;
+ // prevent multiple turns
+ final begin = (rotation.abs() % 360) * rotation.sign;
+ final rotationTween = Tween(begin: begin, end: 0);
await _animateCamera((animation) => _leafletMapController.rotate(rotationTween.evaluate(animation)));
}
diff --git a/lib/widgets/viewer/embedded/embedded_data_opener.dart b/lib/widgets/viewer/embedded/embedded_data_opener.dart
index 2c92fd6ce..40e85db37 100644
--- a/lib/widgets/viewer/embedded/embedded_data_opener.dart
+++ b/lib/widgets/viewer/embedded/embedded_data_opener.dart
@@ -12,11 +12,13 @@ import 'package:aves/widgets/viewer/entry_viewer_page.dart';
import 'package:flutter/material.dart';
class EmbeddedDataOpener extends StatelessWidget with FeedbackMixin {
+ final bool enabled;
final AvesEntry entry;
final Widget child;
const EmbeddedDataOpener({
super.key,
+ required this.enabled,
required this.entry,
required this.child,
});
@@ -25,8 +27,11 @@ class EmbeddedDataOpener extends StatelessWidget with FeedbackMixin {
Widget build(BuildContext context) {
return NotificationListener(
onNotification: (notification) {
- _openEmbeddedData(context, notification);
- return true;
+ if (enabled) {
+ _openEmbeddedData(context, notification);
+ return true;
+ }
+ return false;
},
child: child,
);
diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart
index c306074ee..4e05c0c86 100644
--- a/lib/widgets/viewer/info/info_app_bar.dart
+++ b/lib/widgets/viewer/info/info_app_bar.dart
@@ -1,6 +1,7 @@
import 'package:aves/app_mode.dart';
import 'package:aves/model/actions/entry_actions.dart';
import 'package:aves/model/entry.dart';
+import 'package:aves/model/selection.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/theme/durations.dart';
@@ -104,12 +105,14 @@ class InfoAppBar extends StatelessWidget {
}
void _goToSearch(BuildContext context) {
+ final isSelecting = context.read?>()?.isSelecting ?? false;
showSearch(
context: context,
delegate: InfoSearchDelegate(
searchFieldLabel: context.l10n.viewerInfoSearchFieldLabel,
entry: entry,
metadataNotifier: metadataNotifier,
+ isSelecting: isSelecting,
),
);
}
diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart
index 48519c873..9c9541d6c 100644
--- a/lib/widgets/viewer/info/info_page.dart
+++ b/lib/widgets/viewer/info/info_page.dart
@@ -4,6 +4,7 @@ import 'package:aves/model/actions/entry_actions.dart';
import 'package:aves/model/actions/events.dart';
import 'package:aves/model/entry.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/theme/durations.dart';
import 'package:aves/widgets/common/basic/insets.dart';
@@ -67,9 +68,11 @@ class _InfoPageState extends State {
builder: (context, mainEntry, child) {
if (mainEntry == null) return const SizedBox();
+ final isSelecting = context.select?, bool>((v) => v?.isSelecting ?? false);
Widget _buildContent({AvesEntry? pageEntry}) {
final targetEntry = pageEntry ?? mainEntry;
return EmbeddedDataOpener(
+ enabled: !isSelecting,
entry: targetEntry,
child: _InfoPageContent(
collection: widget.collection,
diff --git a/lib/widgets/viewer/info/info_search.dart b/lib/widgets/viewer/info/info_search.dart
index 3bdba7745..1ed477589 100644
--- a/lib/widgets/viewer/info/info_search.dart
+++ b/lib/widgets/viewer/info/info_search.dart
@@ -12,6 +12,7 @@ import 'package:flutter/material.dart';
class InfoSearchDelegate extends SearchDelegate {
final AvesEntry entry;
final ValueNotifier