import 'dart:async'; import 'package:aves/model/entry.dart'; import 'package:aves/services/common/services.dart'; import 'package:flutter/services.dart'; import 'package:streams_channel/streams_channel.dart'; abstract class MediaStoreService { Future> checkObsoleteContentIds(List knownContentIds); Future> checkObsoletePaths(Map knownPathById); // knownEntries: map of contentId -> dateModifiedSecs Stream getEntries(Map knownEntries); // returns media URI Future scanFile(String path, String mimeType); } class PlatformMediaStoreService implements MediaStoreService { static const platform = MethodChannel('deckers.thibault/aves/media_store'); static final StreamsChannel _streamChannel = StreamsChannel('deckers.thibault/aves/media_store_stream'); @override Future> checkObsoleteContentIds(List knownContentIds) async { try { final result = await platform.invokeMethod('checkObsoleteContentIds', { 'knownContentIds': knownContentIds, }); return (result as List).cast(); } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return []; } @override Future> checkObsoletePaths(Map knownPathById) async { try { final result = await platform.invokeMethod('checkObsoletePaths', { 'knownPathById': knownPathById, }); return (result as List).cast(); } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return []; } @override Stream getEntries(Map knownEntries) { try { return _streamChannel.receiveBroadcastStream({ 'knownEntries': knownEntries, }).map((event) => AvesEntry.fromMap(event)); } on PlatformException catch (e, stack) { reportService.recordError(e, stack); return Stream.error(e); } } // returns media URI @override Future scanFile(String path, String mimeType) async { try { final result = await platform.invokeMethod('scanFile', { 'path': path, 'mimeType': mimeType, }); if (result != null) return Uri.tryParse(result); } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return null; } }