diff --git a/mobile/lib/domain/services/device_sync.service.dart b/mobile/lib/domain/services/device_sync.service.dart index 2e524b7a6e..f6049dce34 100644 --- a/mobile/lib/domain/services/device_sync.service.dart +++ b/mobile/lib/domain/services/device_sync.service.dart @@ -16,7 +16,7 @@ class DeviceSyncService { final ILocalAlbumRepository _localAlbumRepository; final Platform _platform; final platform.ImHostService _hostService; - final Logger _log = Logger("SyncService"); + final Logger _log = Logger("DeviceSyncService"); DeviceSyncService({ required IAlbumMediaRepository albumMediaRepository, @@ -29,6 +29,7 @@ class DeviceSyncService { _hostService = hostService; Future sync() async { + final Stopwatch stopwatch = Stopwatch()..start(); try { if (await _hostService.shouldFullSync()) { _log.fine("Cannot use partial sync. Performing full sync"); @@ -57,6 +58,8 @@ class DeviceSyncService { } catch (e, s) { _log.severe("Error performing device sync", e, s); } + stopwatch.stop(); + _log.info("Device sync took - ${stopwatch.elapsedMilliseconds}ms"); } Future fullSync() async { @@ -91,7 +94,7 @@ class DeviceSyncService { Future addAlbum(LocalAlbum newAlbum) async { try { - _log.info("Adding device album ${newAlbum.name}"); + _log.fine("Adding device album ${newAlbum.name}"); final album = await _albumMediaRepository.refresh(newAlbum.id); final assets = album.assetCount > 0 @@ -106,7 +109,7 @@ class DeviceSyncService { } Future removeAlbum(LocalAlbum a) async { - _log.info("Removing device album ${a.name}"); + _log.fine("Removing device album ${a.name}"); try { // Asset deletion is handled in the repository await _localAlbumRepository.delete(a.id); @@ -118,7 +121,7 @@ class DeviceSyncService { // The deviceAlbum is ignored since we are going to refresh it anyways FutureOr updateAlbum(LocalAlbum dbAlbum, LocalAlbum _) async { try { - _log.info("Syncing device album ${dbAlbum.name}"); + _log.fine("Syncing device album ${dbAlbum.name}"); final deviceAlbum = await _albumMediaRepository.refresh(dbAlbum.id); @@ -131,7 +134,7 @@ class DeviceSyncService { return false; } - _log.info("Device album ${dbAlbum.name} has changed. Syncing..."); + _log.fine("Device album ${dbAlbum.name} has changed. Syncing..."); // Faster path - only new assets added if (await checkAddition(dbAlbum, deviceAlbum)) { diff --git a/mobile/lib/platform/messages.g.dart b/mobile/lib/platform/messages.g.dart index c6e593912b..decf8384eb 100644 --- a/mobile/lib/platform/messages.g.dart +++ b/mobile/lib/platform/messages.g.dart @@ -14,21 +14,22 @@ PlatformException _createConnectionError(String channelName) { message: 'Unable to establish connection on channel: "$channelName".', ); } + bool _deepEquals(Object? a, Object? b) { if (a is List && b is List) { return a.length == b.length && a.indexed - .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); + .every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1])); } if (a is Map && b is Map) { - return a.length == b.length && a.entries.every((MapEntry entry) => - (b as Map).containsKey(entry.key) && - _deepEquals(entry.value, b[entry.key])); + return a.length == b.length && + a.entries.every((MapEntry entry) => + (b as Map).containsKey(entry.key) && + _deepEquals(entry.value, b[entry.key])); } return a == b; } - class PlatformAsset { PlatformAsset({ required this.id, @@ -67,7 +68,8 @@ class PlatformAsset { } Object encode() { - return _toList(); } + return _toList(); + } static PlatformAsset decode(Object result) { result as List; @@ -96,8 +98,7 @@ class PlatformAsset { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } class SyncDelta { @@ -122,7 +123,8 @@ class SyncDelta { } Object encode() { - return _toList(); } + return _toList(); + } static SyncDelta decode(Object result) { result as List; @@ -147,11 +149,9 @@ class SyncDelta { @override // ignore: avoid_equals_and_hash_code_on_mutable_classes - int get hashCode => Object.hashAll(_toList()) -; + int get hashCode => Object.hashAll(_toList()); } - class _PigeonCodec extends StandardMessageCodec { const _PigeonCodec(); @override @@ -159,10 +159,10 @@ class _PigeonCodec extends StandardMessageCodec { if (value is int) { buffer.putUint8(4); buffer.putInt64(value); - } else if (value is PlatformAsset) { + } else if (value is PlatformAsset) { buffer.putUint8(129); writeValue(buffer, value.encode()); - } else if (value is SyncDelta) { + } else if (value is SyncDelta) { buffer.putUint8(130); writeValue(buffer, value.encode()); } else { @@ -173,9 +173,9 @@ class _PigeonCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 129: + case 129: return PlatformAsset.decode(readValue(buffer)!); - case 130: + case 130: return SyncDelta.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -187,9 +187,11 @@ class ImHostService { /// Constructor for [ImHostService]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - ImHostService({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + ImHostService( + {BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, - pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; + pigeonVar_messageChannelSuffix = + messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; static const MessageCodec pigeonChannelCodec = _PigeonCodec(); @@ -197,8 +199,10 @@ class ImHostService { final String pigeonVar_messageChannelSuffix; Future shouldFullSync() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.immich_mobile.ImHostService.shouldFullSync$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.immich_mobile.ImHostService.shouldFullSync$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -225,8 +229,10 @@ class ImHostService { } Future getMediaChanges() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.immich_mobile.ImHostService.getMediaChanges$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.immich_mobile.ImHostService.getMediaChanges$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -253,8 +259,10 @@ class ImHostService { } Future checkpointSync() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.immich_mobile.ImHostService.checkpointSync$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.immich_mobile.ImHostService.checkpointSync$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -276,8 +284,10 @@ class ImHostService { } Future clearSyncCheckpoint() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.immich_mobile.ImHostService.clearSyncCheckpoint$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.immich_mobile.ImHostService.clearSyncCheckpoint$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, @@ -299,13 +309,16 @@ class ImHostService { } Future> getAssetIdsForAlbum(String albumId) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.immich_mobile.ImHostService.getAssetIdsForAlbum$pigeonVar_messageChannelSuffix'; - final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + final String pigeonVar_channelName = + 'dev.flutter.pigeon.immich_mobile.ImHostService.getAssetIdsForAlbum$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = + BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); - final Future pigeonVar_sendFuture = pigeonVar_channel.send([albumId]); + final Future pigeonVar_sendFuture = + pigeonVar_channel.send([albumId]); final List? pigeonVar_replyList = await pigeonVar_sendFuture as List?; if (pigeonVar_replyList == null) { diff --git a/mobile/lib/widgets/common/immich_app_bar.dart b/mobile/lib/widgets/common/immich_app_bar.dart index 77081e0f30..09f81b9e1a 100644 --- a/mobile/lib/widgets/common/immich_app_bar.dart +++ b/mobile/lib/widgets/common/immich_app_bar.dart @@ -179,7 +179,7 @@ class ImmichAppBar extends ConsumerWidget implements PreferredSizeWidget { child: action, ), ), - if (kDebugMode) + if (kDebugMode || kProfileMode) IconButton( icon: const Icon(Icons.science_rounded), onPressed: () => context.pushRoute(const FeatInDevRoute()),