import 'dart:async'; import 'package:aves/model/entry/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); Future> getChangedUris(int sinceGeneration); Future getGeneration(); // knownEntries: map of contentId -> dateModifiedMillis Stream getEntries(Map knownEntries, {String? directory}); // returns media URI Future scanFile(String path, String mimeType); } class PlatformMediaStoreService implements MediaStoreService { static const _platform = MethodChannel('deckers.thibault/aves/media_store'); static final _stream = 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 Future> getChangedUris(int sinceGeneration) async { try { final result = await _platform.invokeMethod('getChangedUris', { 'sinceGeneration': sinceGeneration, }); return (result as List).cast(); } on PlatformException catch (e, stack) { await reportService.recordError(e, stack); } return []; } @override Future getGeneration() async { try { return await _platform.invokeMethod('getGeneration'); } on PlatformException catch (e, stack) { if (e.code != 'getGeneration-primary') { await reportService.recordError(e, stack); } } return null; } @override Stream getEntries(Map knownEntries, {String? directory}) { try { return _stream .receiveBroadcastStream({ 'knownEntries': knownEntries, 'directory': directory, }) .where((event) => event is Map) .map((event) { final fields = event as Map; AvesEntry.normalizeMimeTypeFields(fields); return AvesEntry.fromMap(fields); }); } 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; } }