diff --git a/lib/src/cast/MediaQueue.dart b/lib/src/cast/MediaQueue.dart new file mode 100644 index 0000000..a070af6 --- /dev/null +++ b/lib/src/cast/MediaQueue.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_cast_framework/src/PlatformBridgeApis.dart'; + +typedef MediaQueueItemsInsertedInRangeCallback = void Function( + int insertIndex, int insertCount); +typedef MediaQueueItemsChangedAtIndexesCallback = void Function( + List indexes); +typedef MediaQueueItemsReorderedAtIndexesCallback = void Function( + List indexes, int insertBeforeIndex); + +class MediaQueue { + final CastHostApi _hostApi; + + MediaQueue(this._hostApi); + + /// Called when a contiguous range of queue items have been inserted into the queue. + MediaQueueItemsInsertedInRangeCallback? itemsInsertedInRange; + + /// Called when the queue has been entirely reloaded. + VoidCallback? itemsReloaded; + + /// Called when one or more queue items have been removed from the queue. + MediaQueueItemsChangedAtIndexesCallback? itemsRemovedAtIndexes; + + /// Called when one or more queue items have been reordered in the queue. + MediaQueueItemsReorderedAtIndexesCallback? itemsReorderedAtIndexes; + + /// Called when one or more queue items have been updated in the queue. + MediaQueueItemsChangedAtIndexesCallback? itemsUpdatedAtIndexes; + + /// Called when one or more changes have been made to the queue. + VoidCallback? mediaQueueChanged; + + /// Called when one or more changes are about to be made to the queue. + VoidCallback? mediaQueueWillChange; +} diff --git a/lib/src/cast/RemoteMediaClient.dart b/lib/src/cast/RemoteMediaClient.dart index 44c839f..07db144 100644 --- a/lib/src/cast/RemoteMediaClient.dart +++ b/lib/src/cast/RemoteMediaClient.dart @@ -5,6 +5,7 @@ import 'package:meta/meta.dart'; import '../../cast.dart'; import '../PlatformBridgeApis.dart'; +import './MediaQueue.dart'; typedef ProgressListener = void Function(int progressMs, int durationMs); typedef AdBreakClipProgressListener = void Function( @@ -26,6 +27,7 @@ class ProgressInfo { /// Class for controlling a media player application running on a receiver. class RemoteMediaClient { RemoteMediaClient(this._hostApi) { + this.mediaQueue = MediaQueue(_hostApi); this.mediaStatusStream = this._mediaStatusStreamController.stream; this.progressStream = this._progressStreamController.stream; } @@ -37,6 +39,9 @@ class RemoteMediaClient { final CastHostApi _hostApi; + /// Returns the associated MediaQueue. + late MediaQueue mediaQueue; + /// Listenable state of the remote media player ValueListenable get playerState => _playerStateNotifier; final _playerStateNotifier = ValueNotifier(PlayerState.unknown); diff --git a/lib/src/flutter_cast_framework.dart b/lib/src/flutter_cast_framework.dart index c9028bf..f24079f 100644 --- a/lib/src/flutter_cast_framework.dart +++ b/lib/src/flutter_cast_framework.dart @@ -4,6 +4,7 @@ import 'package:flutter_cast_framework/src/cast/RemoteMediaClient.dart'; import 'PlatformBridgeApis.dart'; import 'cast/CastContext.dart'; +import 'cast/MediaQueue.dart'; /// Entrypoint for the Flutter Cast Framework class FlutterCastFramework { @@ -34,8 +35,8 @@ class _CastFlutterApiImplementor extends CastFlutterApi { final List namespaces = []; SessionManager get sessionManager => castContext.sessionManager; - RemoteMediaClient get remoteMediaClient => - castContext.sessionManager.remoteMediaClient; + RemoteMediaClient get remoteMediaClient => sessionManager.remoteMediaClient; + MediaQueue get mediaQueue => remoteMediaClient.mediaQueue; _CastFlutterApiImplementor({ required this.castContext, @@ -165,4 +166,41 @@ class _CastFlutterApiImplementor extends CastFlutterApi { ); } //endregion + + //region MediaQueueu + @override + void itemsInsertedInRange(int insertIndex, int insertCount) { + mediaQueue.itemsInsertedInRange?.call(insertIndex, insertCount); + } + + @override + void itemsReloaded() { + mediaQueue.itemsReloaded?.call(); + } + + @override + void itemsRemovedAtIndexes(List indexes) { + mediaQueue.itemsRemovedAtIndexes?.call(indexes); + } + + @override + void itemsReorderedAtIndexes(List indexes, int insertBeforeIndex) { + mediaQueue.itemsReorderedAtIndexes?.call(indexes, insertBeforeIndex); + } + + @override + void itemsUpdatedAtIndexes(List indexes) { + mediaQueue.itemsUpdatedAtIndexes?.call(indexes); + } + + @override + void mediaQueueChanged() { + mediaQueue.mediaQueueChanged?.call(); + } + + @override + void mediaQueueWillChange() { + mediaQueue.mediaQueueWillChange?.call(); + } + //endregion }