import 'dart:async'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/services/app_service.dart'; import 'package:aves/services/common/services.dart'; import 'package:collection/collection.dart'; import 'package:flutter/services.dart'; import 'package:streams_channel/streams_channel.dart'; class IntentService { static const _platform = MethodChannel('deckers.thibault/aves/intent'); static final _stream = StreamsChannel('deckers.thibault/aves/activity_result_stream'); static Future> getIntentData() async { try { // returns nullable map with 'action' and possibly 'uri' 'mimeType' final result = await _platform.invokeMethod('getIntentData'); if (result != null) return (result as Map).cast(); } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return {}; } static Future submitPickedItems(List uris) async { try { await _platform.invokeMethod('submitPickedItems', { 'uris': uris, }); } on PlatformException catch (e, stack) { if (e.code == 'submitPickedItems-large') { throw TooManyItemsException(); } else { await reportService.recordError(e, stack); } } } static Future submitPickedCollectionFilters(Set? filters) async { try { await _platform.invokeMethod('submitPickedCollectionFilters', { 'filters': filters?.map((filter) => filter.toJson()).toList(), }); } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } } static Future?> pickCollectionFilters(Set? initialFilters) async { try { final completer = Completer?>(); _stream.receiveBroadcastStream({ 'op': 'pickCollectionFilters', 'initialFilters': initialFilters?.map((filter) => filter.toJson()).toList(), }).listen( (data) { final result = (data as List?)?.cast().map(CollectionFilter.fromJson).whereNotNull().toSet(); completer.complete(result); }, onError: completer.completeError, onDone: () { if (!completer.isCompleted) completer.complete(null); }, cancelOnError: true, ); // `await` here, so that `completeError` will be caught below return await completer.future; } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return null; } }