import 'dart:typed_data'; import 'package:aves/model/image_entry.dart'; import 'package:aves/services/service_policy.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; class ImageFileService { static const platform = MethodChannel('deckers.thibault/aves/image'); static Future getImageEntries() async { try { await platform.invokeMethod('getImageEntries'); } on PlatformException catch (e) { debugPrint('getImageEntries failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } } static Future getImageEntry(String uri, String mimeType) async { debugPrint('getImageEntry for uri=$uri, mimeType=$mimeType'); try { final result = await platform.invokeMethod('getImageEntry', { 'uri': uri, 'mimeType': mimeType, }) as Map; return ImageEntry.fromMap(result); } on PlatformException catch (e) { debugPrint('getImageEntry failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return null; } static Future getImage(String uri, String mimeType) async { try { final result = await platform.invokeMethod('getImage', { 'uri': uri, 'mimeType': mimeType, }); return result as Uint8List; } on PlatformException catch (e) { debugPrint('getImage failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return Uint8List(0); } static Future getThumbnail(ImageEntry entry, int width, int height, {Object cancellationKey}) { return servicePolicy.call( () async { if (width > 0 && height > 0) { // debugPrint('getThumbnail width=$width path=${entry.path}'); try { final result = await platform.invokeMethod('getThumbnail', { 'entry': entry.toMap(), 'width': width, 'height': height, }); return result as Uint8List; } on PlatformException catch (e) { debugPrint('getThumbnail failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } } return Uint8List(0); }, priority: ServiceCallPriority.asap, debugLabel: 'getThumbnail-${entry.path}', cancellationKey: cancellationKey, ); } static Future delete(ImageEntry entry) async { try { await platform.invokeMethod('delete', { 'entry': entry.toMap(), }); return true; } on PlatformException catch (e) { debugPrint('delete failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return false; } static Future rename(ImageEntry entry, String newName) async { try { // return map with: 'contentId' 'path' 'title' 'uri' (all optional) final result = await platform.invokeMethod('rename', { 'entry': entry.toMap(), 'newName': newName, }) as Map; return result; } on PlatformException catch (e) { debugPrint('rename failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return {}; } static Future rotate(ImageEntry entry, {@required bool clockwise}) async { try { // return map with: 'width' 'height' 'orientationDegrees' (all optional) final result = await platform.invokeMethod('rotate', { 'entry': entry.toMap(), 'clockwise': clockwise, }) as Map; return result; } on PlatformException catch (e) { debugPrint('rotate failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return {}; } }