diff --git a/mobile/lib/entities/asset.entity.dart b/mobile/lib/entities/asset.entity.dart index 17f107f3cf..e47a4a24db 100644 --- a/mobile/lib/entities/asset.entity.dart +++ b/mobile/lib/entities/asset.entity.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:immich_mobile/entities/exif_info.entity.dart'; import 'package:immich_mobile/utils/hash.dart'; @@ -92,27 +93,19 @@ class Asset { @ignore bool _didUpdateLocal = false; - @ignore - bool get didUpdateLocal => _didUpdateLocal; - Future get localAsync async { - final currentLocal = local; - if (currentLocal == null) { + final local = this.local; + if (local == null) { throw Exception('Asset $fileName has no local data'); } - if (_didUpdateLocal) { - return currentLocal; - } - - final updatedLocal = _didUpdateLocal - ? currentLocal - : await currentLocal.obtainForNewProperties(); + final updatedLocal = + _didUpdateLocal ? local : await local.obtainForNewProperties(); if (updatedLocal == null) { throw Exception('Could not fetch local data for $fileName'); } - local = updatedLocal; + this.local = updatedLocal; _didUpdateLocal = true; return updatedLocal; } @@ -242,7 +235,7 @@ class Asset { return exifInfo.isFlipped; } - if (didUpdateLocal) { + if (_didUpdateLocal && Platform.isAndroid) { final local = this.local; if (local == null) { throw Exception('Asset $fileName has no local data'); diff --git a/mobile/lib/services/asset.service.dart b/mobile/lib/services/asset.service.dart index 3d2dac892b..7d27d1b27b 100644 --- a/mobile/lib/services/asset.service.dart +++ b/mobile/lib/services/asset.service.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; @@ -404,12 +405,27 @@ class AssetService { } Future getAspectRatio(Asset asset) async { - if (asset.isLocal) { + // platform_manager always returns 0 for orientation on iOS, so only prefer it on Android + if (asset.isLocal && Platform.isAndroid) { await asset.localAsync; } else if (asset.isRemote) { asset = await loadExif(asset); + } else if (asset.isLocal) { + await asset.localAsync; } - return asset.aspectRatio ?? 1.0; + final aspectRatio = asset.aspectRatio; + if (aspectRatio != null) { + return aspectRatio; + } + + final width = asset.width; + final height = asset.height; + if (width != null && height != null) { + // we don't know the orientation, so assume it's normal + return width / height; + } + + return 1.0; } }