From a346efd0d634ef03b9204fe0742829a885a8a47f Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 18 Jun 2022 10:33:59 +0900 Subject: [PATCH] minor fixes --- lib/model/filters/query.dart | 27 ++++++++++++++++--- lib/ref/mime_types.dart | 5 +++- lib/services/geocoding_service.dart | 6 ++++- lib/widgets/collection/collection_grid.dart | 1 + .../common/identity/aves_filter_chip.dart | 1 + .../filter_grids/common/filter_tile.dart | 1 + 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/model/filters/query.dart b/lib/model/filters/query.dart index e8ae39914..376e07b4f 100644 --- a/lib/model/filters/query.dart +++ b/lib/model/filters/query.dart @@ -19,12 +19,31 @@ class QueryFilter extends CollectionFilter { @override List get props => [query, live]; + static final _fieldPattern = RegExp(r'(.+)([=<>])(.+)'); + static const keyContentId = 'ID'; + static const opEqual = '='; + QueryFilter(this.query, {this.colorful = true, this.live = false}) { var upQuery = query.toUpperCase(); - if (upQuery.startsWith('ID:')) { - final contentId = int.tryParse(upQuery.substring(3)); - _test = (entry) => entry.contentId == contentId; - return; + + final match = _fieldPattern.firstMatch(upQuery); + if (match != null) { + final key = match.group(1)?.trim(); + final op = match.group(2)?.trim(); + final value = match.group(3)?.trim(); + if (key != null && op != null && value != null) { + switch (key) { + case keyContentId: + if (op == opEqual) { + final contentId = int.tryParse(value); + if (contentId != null) { + _test = (entry) => entry.contentId == contentId; + return; + } + } + break; + } + } } // allow NOT queries starting with `-` diff --git a/lib/ref/mime_types.dart b/lib/ref/mime_types.dart index cec770cae..63ac92ee7 100644 --- a/lib/ref/mime_types.dart +++ b/lib/ref/mime_types.dart @@ -44,6 +44,8 @@ class MimeTypes { static const anyVideo = 'video/*'; + static const v3gpp = 'video/3gpp'; + static const asf = 'video/x-ms-asf'; static const avi = 'video/avi'; static const aviVnd = 'video/vnd.avi'; static const flv = 'video/flv'; @@ -56,6 +58,7 @@ class MimeTypes { static const mpeg = 'video/mpeg'; static const ogv = 'video/ogg'; static const webm = 'video/webm'; + static const wmv = 'video/x-ms-wmv'; static const json = 'application/json'; static const plainText = 'text/plain'; @@ -76,7 +79,7 @@ class MimeTypes { static const Set _knownOpaqueImages = {jpeg}; - static const Set _knownVideos = {avi, aviVnd, flv, flvX, mkv, mov, mp2t, mp2ts, mp4, mpeg, ogv, webm}; + static const Set _knownVideos = {v3gpp, asf, avi, aviVnd, flv, flvX, mkv, mov, mp2t, mp2ts, mp4, mpeg, ogv, webm, wmv}; static final Set knownMediaTypes = { anyImage, diff --git a/lib/services/geocoding_service.dart b/lib/services/geocoding_service.dart index 28f6990d3..41512449e 100644 --- a/lib/services/geocoding_service.dart +++ b/lib/services/geocoding_service.dart @@ -22,7 +22,11 @@ class GeocodingService { }); return (result as List).cast().map(Address.fromMap).toList(); } on PlatformException catch (e, stack) { - if (e.code != 'getAddress-empty' && e.code != 'getAddress-network') { + if (!{ + 'getAddress-empty', + 'getAddress-network', + 'getAddress-unavailable', + }.contains(e.code)) { await reportService.recordError(e, stack); } } diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index e49737312..30005f025 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -99,6 +99,7 @@ class _CollectionGridContent extends StatelessWidget { final sectionedListLayoutProvider = ValueListenableBuilder( valueListenable: context.select>((controller) => controller.extentNotifier), builder: (context, thumbnailExtent, child) { + assert(thumbnailExtent > 0); return Selector>( selector: (context, c) => Tuple4(c.viewportSize.width, c.columnCount, c.spacing, c.horizontalPadding), builder: (context, c, child) { diff --git a/lib/widgets/common/identity/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart index 21dfe3297..637cca171 100644 --- a/lib/widgets/common/identity/aves_filter_chip.dart +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -140,6 +140,7 @@ class _AvesFilterChipState extends State { _subscriptions.add(settings.updateStream.where((event) => event.key == Settings.themeColorModeKey).listen((_) { // delay so that contextual colors reflect the new settings WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; _onCoverColorChange(null); }); })); diff --git a/lib/widgets/filter_grids/common/filter_tile.dart b/lib/widgets/filter_grids/common/filter_tile.dart index 906fd1400..60a165d51 100644 --- a/lib/widgets/filter_grids/common/filter_tile.dart +++ b/lib/widgets/filter_grids/common/filter_tile.dart @@ -92,6 +92,7 @@ class _InteractiveFilterTileState extends State _heroTypeOverride = HeroType.always); } WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; Navigator.push( context, MaterialPageRoute(