import 'dart:typed_data'; import 'package:aves/model/image_entry.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; class AndroidAppService { static const platform = MethodChannel('deckers.thibault/aves/app'); static Future getAppNames() async { try { final result = await platform.invokeMethod('getAppNames'); return result as Map; } on PlatformException catch (e) { debugPrint('getAppNames failed with code=${e.code}, exception=${e.message}, details=${e.details}}'); } return {}; } static Future getAppIcon(String packageName, double size) async { try { final result = await platform.invokeMethod('getAppIcon', { 'packageName': packageName, 'sizeDip': size, }); return result as Uint8List; } on PlatformException catch (e) { debugPrint('getAppIcon failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return null; } static Future edit(String uri, String mimeType) async { try { return await platform.invokeMethod('edit', { 'title': 'Edit with:', 'uri': uri, 'mimeType': mimeType, }); } on PlatformException catch (e) { debugPrint('edit failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return false; } static Future open(String uri, String mimeType) async { try { return await platform.invokeMethod('open', { 'title': 'Open with:', 'uri': uri, 'mimeType': mimeType, }); } on PlatformException catch (e) { debugPrint('open failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return false; } static Future openMap(String geoUri) async { try { return await platform.invokeMethod('openMap', { 'geoUri': geoUri, }); } on PlatformException catch (e) { debugPrint('openMap failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return false; } static Future setAs(String uri, String mimeType) async { try { return await platform.invokeMethod('setAs', { 'title': 'Set as:', 'uri': uri, 'mimeType': mimeType, }); } on PlatformException catch (e) { debugPrint('setAs failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return false; } static Future shareEntries(Iterable entries) async { // loosen mime type to a generic one, so we can share with badly defined apps // e.g. Google Lens declares receiving "image/jpeg" only, but it can actually handle more formats final urisByMimeType = groupBy(entries, (e) => e.mimeTypeAnySubtype).map((k, v) => MapEntry(k, v.map((e) => e.uri).toList())); try { return await platform.invokeMethod('share', { 'title': 'Share via:', 'urisByMimeType': urisByMimeType, }); } on PlatformException catch (e) { debugPrint('shareEntries failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return false; } static Future shareSingle(String uri, String mimeType) async { try { return await platform.invokeMethod('share', { 'title': 'Share via:', 'urisByMimeType': { mimeType: [uri] }, }); } on PlatformException catch (e) { debugPrint('shareSingle failed with code=${e.code}, exception=${e.message}, details=${e.details}'); } return false; } }