From 8f8b083a5677343896bbd16a6993d94a9aaf1de8 Mon Sep 17 00:00:00 2001 From: Luke McCarthy Date: Tue, 27 Jun 2023 09:26:53 -0400 Subject: [PATCH] change thumbhash to List from String --- mobile/lib/routing/router.gr.dart | 8 +- mobile/lib/shared/models/asset.dart | 9 +- mobile/lib/shared/models/asset.g.dart | 192 +++++++++++-------------- mobile/lib/shared/ui/immich_image.dart | 2 +- 4 files changed, 101 insertions(+), 110 deletions(-) diff --git a/mobile/lib/routing/router.gr.dart b/mobile/lib/routing/router.gr.dart index d79aac5f5..1fb3ecb19 100644 --- a/mobile/lib/routing/router.gr.dart +++ b/mobile/lib/routing/router.gr.dart @@ -84,6 +84,7 @@ class _$AppRouter extends RootStackRouter { onVideoEnded: args.onVideoEnded, onPlaying: args.onPlaying, onPaused: args.onPaused, + placeholder: args.placeholder, ), ); }, @@ -673,6 +674,7 @@ class VideoViewerRoute extends PageRouteInfo { required dynamic onVideoEnded, dynamic onPlaying, dynamic onPaused, + Widget? placeholder, }) : super( VideoViewerRoute.name, path: '/video-viewer-page', @@ -683,6 +685,7 @@ class VideoViewerRoute extends PageRouteInfo { onVideoEnded: onVideoEnded, onPlaying: onPlaying, onPaused: onPaused, + placeholder: placeholder, ), ); @@ -697,6 +700,7 @@ class VideoViewerRouteArgs { required this.onVideoEnded, this.onPlaying, this.onPaused, + this.placeholder, }); final Key? key; @@ -711,9 +715,11 @@ class VideoViewerRouteArgs { final dynamic onPaused; + final Widget? placeholder; + @override String toString() { - return 'VideoViewerRouteArgs{key: $key, asset: $asset, isMotionVideo: $isMotionVideo, onVideoEnded: $onVideoEnded, onPlaying: $onPlaying, onPaused: $onPaused}'; + return 'VideoViewerRouteArgs{key: $key, asset: $asset, isMotionVideo: $isMotionVideo, onVideoEnded: $onVideoEnded, onPlaying: $onPlaying, onPaused: $onPaused, placeholder: $placeholder}'; } } diff --git a/mobile/lib/shared/models/asset.dart b/mobile/lib/shared/models/asset.dart index a43a88616..451695545 100644 --- a/mobile/lib/shared/models/asset.dart +++ b/mobile/lib/shared/models/asset.dart @@ -1,4 +1,6 @@ import 'dart:convert'; +import 'dart:ffi'; +import 'dart:typed_data'; import 'package:immich_mobile/shared/models/exif_info.dart'; import 'package:immich_mobile/shared/models/store.dart'; @@ -31,7 +33,8 @@ class Asset { remote.exifInfo != null ? ExifInfo.fromDto(remote.exifInfo!) : null, isFavorite = remote.isFavorite, isArchived = remote.isArchived, - thumbhash = remote.thumbhash; + thumbhash = + remote.thumbhash != null ? base64.decode(remote.thumbhash!) : null; Asset.local(AssetEntity local, List hash) : localId = local.id, @@ -110,7 +113,7 @@ class Asset { ) String checksum; - String? thumbhash; + List? thumbhash; @Index(unique: false, replace: false, type: IndexType.hash) String? remoteId; @@ -301,7 +304,7 @@ class Asset { Asset _copyWith({ Id? id, String? checksum, - String? thumbhash, + List? thumbhash, String? remoteId, String? localId, int? ownerId, diff --git a/mobile/lib/shared/models/asset.g.dart b/mobile/lib/shared/models/asset.g.dart index 63af72840..4984e10b6 100644 --- a/mobile/lib/shared/models/asset.g.dart +++ b/mobile/lib/shared/models/asset.g.dart @@ -80,7 +80,7 @@ const AssetSchema = CollectionSchema( r'thumbhash': PropertySchema( id: 12, name: r'thumbhash', - type: IsarType.string, + type: IsarType.byteList, ), r'type': PropertySchema( id: 13, @@ -187,7 +187,7 @@ int _assetEstimateSize( { final value = object.thumbhash; if (value != null) { - bytesCount += 3 + value.length * 3; + bytesCount += 3 + value.length; } } return bytesCount; @@ -211,7 +211,7 @@ void _assetSerialize( writer.writeString(offsets[9], object.localId); writer.writeLong(offsets[10], object.ownerId); writer.writeString(offsets[11], object.remoteId); - writer.writeString(offsets[12], object.thumbhash); + writer.writeByteList(offsets[12], object.thumbhash); writer.writeByte(offsets[13], object.type.index); writer.writeDateTime(offsets[14], object.updatedAt); writer.writeInt(offsets[15], object.width); @@ -237,7 +237,7 @@ Asset _assetDeserialize( localId: reader.readStringOrNull(offsets[9]), ownerId: reader.readLong(offsets[10]), remoteId: reader.readStringOrNull(offsets[11]), - thumbhash: reader.readStringOrNull(offsets[12]), + thumbhash: reader.readByteList(offsets[12]), type: _AssettypeValueEnumMap[reader.readByteOrNull(offsets[13])] ?? AssetType.other, updatedAt: reader.readDateTime(offsets[14]), @@ -278,7 +278,7 @@ P _assetDeserializeProp

( case 11: return (reader.readStringOrNull(offset)) as P; case 12: - return (reader.readStringOrNull(offset)) as P; + return (reader.readByteList(offset)) as P; case 13: return (_AssettypeValueEnumMap[reader.readByteOrNull(offset)] ?? AssetType.other) as P; @@ -1817,55 +1817,47 @@ extension AssetQueryFilter on QueryBuilder { }); } - QueryBuilder thumbhashEqualTo( - String? value, { - bool caseSensitive = true, - }) { + QueryBuilder thumbhashElementEqualTo( + int value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( property: r'thumbhash', value: value, - caseSensitive: caseSensitive, )); }); } - QueryBuilder thumbhashGreaterThan( - String? value, { + QueryBuilder thumbhashElementGreaterThan( + int value, { bool include = false, - bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.greaterThan( include: include, property: r'thumbhash', value: value, - caseSensitive: caseSensitive, )); }); } - QueryBuilder thumbhashLessThan( - String? value, { + QueryBuilder thumbhashElementLessThan( + int value, { bool include = false, - bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.lessThan( include: include, property: r'thumbhash', value: value, - caseSensitive: caseSensitive, )); }); } - QueryBuilder thumbhashBetween( - String? lower, - String? upper, { + QueryBuilder thumbhashElementBetween( + int lower, + int upper, { bool includeLower = true, bool includeUpper = true, - bool caseSensitive = true, }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.between( @@ -1874,76 +1866,91 @@ extension AssetQueryFilter on QueryBuilder { includeLower: includeLower, upper: upper, includeUpper: includeUpper, - caseSensitive: caseSensitive, )); }); } - QueryBuilder thumbhashStartsWith( - String value, { - bool caseSensitive = true, - }) { + QueryBuilder thumbhashLengthEqualTo( + int length) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'thumbhash', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder thumbhashEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'thumbhash', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder thumbhashContains( - String value, - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'thumbhash', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder thumbhashMatches( - String pattern, - {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'thumbhash', - wildcard: pattern, - caseSensitive: caseSensitive, - )); + return query.listLength( + r'thumbhash', + length, + true, + length, + true, + ); }); } QueryBuilder thumbhashIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'thumbhash', - value: '', - )); + return query.listLength( + r'thumbhash', + 0, + true, + 0, + true, + ); }); } QueryBuilder thumbhashIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'thumbhash', - value: '', - )); + return query.listLength( + r'thumbhash', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder thumbhashLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'thumbhash', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder thumbhashLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'thumbhash', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder thumbhashLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'thumbhash', + lower, + includeLower, + upper, + includeUpper, + ); }); } @@ -2271,18 +2278,6 @@ extension AssetQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByThumbhash() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'thumbhash', Sort.asc); - }); - } - - QueryBuilder sortByThumbhashDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'thumbhash', Sort.desc); - }); - } - QueryBuilder sortByType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'type', Sort.asc); @@ -2477,18 +2472,6 @@ extension AssetQuerySortThenBy on QueryBuilder { }); } - QueryBuilder thenByThumbhash() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'thumbhash', Sort.asc); - }); - } - - QueryBuilder thenByThumbhashDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'thumbhash', Sort.desc); - }); - } - QueryBuilder thenByType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'type', Sort.asc); @@ -2605,10 +2588,9 @@ extension AssetQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByThumbhash( - {bool caseSensitive = true}) { + QueryBuilder distinctByThumbhash() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'thumbhash', caseSensitive: caseSensitive); + return query.addDistinctBy(r'thumbhash'); }); } @@ -2710,7 +2692,7 @@ extension AssetQueryProperty on QueryBuilder { }); } - QueryBuilder thumbhashProperty() { + QueryBuilder?, QQueryOperations> thumbhashProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'thumbhash'); }); diff --git a/mobile/lib/shared/ui/immich_image.dart b/mobile/lib/shared/ui/immich_image.dart index d62d251b4..4025c680b 100644 --- a/mobile/lib/shared/ui/immich_image.dart +++ b/mobile/lib/shared/ui/immich_image.dart @@ -104,7 +104,7 @@ class ImmichImage extends StatelessWidget { return FittedBox( fit: BoxFit.fill, child: Image( - image: ThumbHash.fromBase64(asset.thumbhash!).toImage(), + image: ThumbHash.fromIntList(asset.thumbhash!).toImage(), ), ); } else if (useGrayBoxPlaceholder) {