diff --git a/lib/model/entry.dart b/lib/model/entry.dart index 7b3f1698b..56885996f 100644 --- a/lib/model/entry.dart +++ b/lib/model/entry.dart @@ -34,7 +34,7 @@ class AvesEntry { // `dateModifiedSecs` can be missing in viewer mode int? _dateModifiedSecs; final int? sourceDateTakenMillis; - int? durationMillis; + int? _durationMillis; int? _catalogDateMillis; CatalogMetadata? _catalogMetadata; AddressDetails? _addressDetails; @@ -63,11 +63,12 @@ class AvesEntry { required String? sourceTitle, required int? dateModifiedSecs, required this.sourceDateTakenMillis, - required this.durationMillis, + required int? durationMillis, }) { this.path = path; this.sourceTitle = sourceTitle; this.dateModifiedSecs = dateModifiedSecs; + this.durationMillis = durationMillis; } bool get canDecode => !undecodable.contains(mimeType); @@ -353,6 +354,13 @@ class AvesEntry { return d == null ? null : DateTime(d.year, d.month, d.day); } + int? get durationMillis => _durationMillis; + + set durationMillis(int? durationMillis) { + _durationMillis = durationMillis; + _durationText = null; + } + String? _durationText; String get durationText { diff --git a/lib/widgets/collection/thumbnail/error.dart b/lib/widgets/collection/thumbnail/error.dart index d55fcb99c..b0fa58e80 100644 --- a/lib/widgets/collection/thumbnail/error.dart +++ b/lib/widgets/collection/thumbnail/error.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:math'; import 'package:aves/model/entry.dart'; import 'package:aves/theme/icons.dart'; @@ -51,14 +52,17 @@ class _ErrorThumbnailState extends State { message: exists ? widget.tooltip : context.l10n.viewerErrorDoesNotExist, preferBelow: false, child: exists - ? Text( - MimeUtils.displayType(entry.mimeType), - style: TextStyle( - color: color, - fontSize: extent / 5, - ), - textAlign: TextAlign.center, - ) + ? LayoutBuilder(builder: (context, constraints) { + final fontSize = min(extent, constraints.biggest.width) / 5; + return Text( + MimeUtils.displayType(entry.mimeType), + style: TextStyle( + color: color, + fontSize: fontSize, + ), + textAlign: TextAlign.center, + ); + }) : Icon( AIcons.broken, size: extent / 2, diff --git a/lib/widgets/common/grid/section_layout.dart b/lib/widgets/common/grid/section_layout.dart index ed8ce5ccb..9b95ceffa 100644 --- a/lib/widgets/common/grid/section_layout.dart +++ b/lib/widgets/common/grid/section_layout.dart @@ -33,11 +33,6 @@ abstract class SectionedListLayoutProvider extends StatelessWidget { Widget build(BuildContext context) { return ProxyProvider0>( update: (context, _) => _updateLayouts(context), - updateShouldNotify: (previous, current) { - final previousLayouts = previous.sectionLayouts; - final currentLayouts = current.sectionLayouts; - return previousLayouts.length != currentLayouts.length || !previousLayouts.every(currentLayouts.contains); - }, child: child, ); } diff --git a/lib/widgets/viewer/video/controller.dart b/lib/widgets/viewer/video/controller.dart index 9eb7fb01d..4b9a32ba8 100644 --- a/lib/widgets/viewer/video/controller.dart +++ b/lib/widgets/viewer/video/controller.dart @@ -35,7 +35,10 @@ abstract class AvesVideoController { int get currentPosition; - double get progress => currentPosition.toDouble() / duration; + double get progress { + final _duration = duration; + return _duration != 0 ? currentPosition.toDouble() / _duration : 0; + } Stream get positionStream; diff --git a/lib/widgets/viewer/video/fijkplayer.dart b/lib/widgets/viewer/video/fijkplayer.dart index b6d592d33..aaae6beb8 100644 --- a/lib/widgets/viewer/video/fijkplayer.dart +++ b/lib/widgets/viewer/video/fijkplayer.dart @@ -118,7 +118,7 @@ class IjkPlayerAvesVideoController extends AvesVideoController { // playing with HW acceleration seems to skip the last frames of some videos // so HW acceleration is always disabled for GIF-like videos where the last frames may be significant - final hwAccelerationEnabled = settings.enableVideoHardwareAcceleration && entry.durationMillis! > gifLikeVideoDurationThreshold.inMilliseconds; + final hwAccelerationEnabled = settings.enableVideoHardwareAcceleration && (entry.durationMillis ?? 0) > gifLikeVideoDurationThreshold.inMilliseconds; // TODO TLAD [video] flaky: HW codecs sometimes fail when seek-starting some videos, e.g. MP2TS/h264(HDPR) if (hwAccelerationEnabled) { @@ -285,7 +285,7 @@ class IjkPlayerAvesVideoController extends AvesVideoController { int get duration { final controllerDuration = _instance.value.duration.inMilliseconds; // use expected duration when controller duration is not set yet - return (controllerDuration == 0) ? entry.durationMillis! : controllerDuration; + return controllerDuration == 0 ? (entry.durationMillis ?? 0) : controllerDuration; } @override