import 'dart:ui' as ui; import 'package:aves/model/entry/entry.dart'; import 'package:aves/services/common/decoding.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/theme/text.dart'; import 'package:flutter/services.dart'; abstract class EmbeddedDataService { Future> getExifThumbnails(AvesEntry entry); Future extractGoogleDeviceItem(AvesEntry entry, String dataUri); Future extractMotionPhotoImage(AvesEntry entry); Future extractMotionPhotoVideo(AvesEntry entry); Future extractJpegMpfItem(AvesEntry entry, int index); Future extractVideoEmbeddedPicture(AvesEntry entry); Future extractXmpDataProp(AvesEntry entry, List? props, String? propMimeType); } class PlatformEmbeddedDataService implements EmbeddedDataService { static const _platform = MethodChannel('deckers.thibault/aves/embedded'); @override Future> getExifThumbnails(AvesEntry entry) async { try { final result = await _platform.invokeMethod('getExifThumbnails', { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, }); if (result != null) { final descriptors = []; await Future.forEach((result as List).cast(), (bytes) async { descriptors.add(await InteropDecoding.bytesToCodec(bytes)); }); return descriptors; } } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return []; } @override Future extractGoogleDeviceItem(AvesEntry entry, String dataUri) async { try { final result = await _platform.invokeMethod('extractGoogleDeviceItem', { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, 'displayName': ['${entry.bestTitle}', dataUri].join(AText.separator), 'dataUri': dataUri, }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return {}; } @override Future extractMotionPhotoImage(AvesEntry entry) async { try { final result = await _platform.invokeMethod('extractMotionPhotoImage', { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, 'displayName': ['${entry.bestTitle}', 'Image'].join(AText.separator), }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return {}; } @override Future extractMotionPhotoVideo(AvesEntry entry) async { try { final result = await _platform.invokeMethod('extractMotionPhotoVideo', { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, 'displayName': ['${entry.bestTitle}', 'Video'].join(AText.separator), }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return {}; } @override Future extractJpegMpfItem(AvesEntry entry, int id) async { try { final result = await _platform.invokeMethod('extractJpegMpfItem', { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, 'displayName': ['${entry.bestTitle}', 'MPF #$id'].join(AText.separator), 'id': id, }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return {}; } @override Future extractVideoEmbeddedPicture(AvesEntry entry) async { try { final result = await _platform.invokeMethod('extractVideoEmbeddedPicture', { 'uri': entry.uri, 'displayName': ['${entry.bestTitle}', 'Cover'].join(AText.separator), }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return {}; } @override Future extractXmpDataProp(AvesEntry entry, List? props, String? propMimeType) async { try { final result = await _platform.invokeMethod('extractXmpDataProp', { 'mimeType': entry.mimeType, 'uri': entry.uri, 'sizeBytes': entry.sizeBytes, 'displayName': ['${entry.bestTitle}', '$props'].join(AText.separator), 'propPath': props, 'propMimeType': propMimeType, }); if (result != null) return result as Map; } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return {}; } }