diff --git a/mobile/plugins/ente_cast/lib/ente_cast.dart b/mobile/plugins/ente_cast/lib/ente_cast.dart index 66a7132d8..f421a9297 100644 --- a/mobile/plugins/ente_cast/lib/ente_cast.dart +++ b/mobile/plugins/ente_cast/lib/ente_cast.dart @@ -1 +1,2 @@ +export 'src/model.dart'; export 'src/service.dart'; diff --git a/mobile/plugins/ente_cast/lib/src/model.dart b/mobile/plugins/ente_cast/lib/src/model.dart new file mode 100644 index 000000000..e86582f76 --- /dev/null +++ b/mobile/plugins/ente_cast/lib/src/model.dart @@ -0,0 +1,5 @@ +// create enum for type of message for cast +enum CastMessageType { + pairCode, + alreadyCasting, +} diff --git a/mobile/plugins/ente_cast/lib/src/service.dart b/mobile/plugins/ente_cast/lib/src/service.dart index 230269bb3..82d8c5978 100644 --- a/mobile/plugins/ente_cast/lib/src/service.dart +++ b/mobile/plugins/ente_cast/lib/src/service.dart @@ -1,7 +1,18 @@ +import "package:ente_cast/src/model.dart"; import "package:flutter/widgets.dart"; abstract class CastService { bool get isSupported; Future> searchDevices(); - Future connectDevice(BuildContext context, Object device); + Future connectDevice( + BuildContext context, + Object device, { + int? collectionID, + // callback that take a map of string, dynamic + void Function(Map>)? onMessage, + }); + // returns a map of sessionID to deviceNames + Future> getActiveSessions(); + + Future closeActiveCasts(); } diff --git a/mobile/plugins/ente_cast_none/lib/src/service.dart b/mobile/plugins/ente_cast_none/lib/src/service.dart index 166108c52..007a4daaa 100644 --- a/mobile/plugins/ente_cast_none/lib/src/service.dart +++ b/mobile/plugins/ente_cast_none/lib/src/service.dart @@ -3,7 +3,12 @@ import "package:flutter/widgets.dart"; class CastServiceImpl extends CastService { @override - Future connectDevice(BuildContext context, Object device) { + Future connectDevice( + BuildContext context, + Object device, { + int? collectionID, + void Function(Map>)? onMessage, + }) { throw UnimplementedError(); } @@ -15,4 +20,16 @@ class CastServiceImpl extends CastService { // TODO: implement searchDevices throw UnimplementedError(); } + + @override + Future closeActiveCasts() { + // TODO: implement closeActiveCasts + throw UnimplementedError(); + } + + @override + Future> getActiveSessions() { + // TODO: implement getActiveSessions + throw UnimplementedError(); + } } diff --git a/mobile/plugins/ente_cast_normal/lib/src/service.dart b/mobile/plugins/ente_cast_normal/lib/src/service.dart index 4c4624d8c..314194b94 100644 --- a/mobile/plugins/ente_cast_normal/lib/src/service.dart +++ b/mobile/plugins/ente_cast_normal/lib/src/service.dart @@ -7,10 +7,15 @@ import "package:flutter/material.dart"; class CastServiceImpl extends CastService { final String _appId = 'F5BCEC64'; final String _pairRequestNamespace = 'urn:x-cast:pair-request'; - final Map sessionIDToDeviceID = {}; + final Map collectionIDToSessions = {}; @override - Future connectDevice(BuildContext context, Object device) async { + Future connectDevice( + BuildContext context, + Object device, { + int? collectionID, + void Function(Map>)? onMessage, + }) async { final CastDevice castDevice = device as CastDevice; final session = await CastSessionManager().startSession(castDevice); session.messageStream.listen((message) { @@ -21,6 +26,13 @@ class CastServiceImpl extends CastService { ); session.sendMessage(_pairRequestNamespace, {}); } else { + if (onMessage != null && message!.containsKey("code")) { + onMessage( + { + CastMessageType.pairCode: message, + }, + ); + } print('receive message: $message'); } }); @@ -29,12 +41,10 @@ class CastServiceImpl extends CastService { if (state == CastSessionState.connected) { const snackBar = SnackBar(content: Text('Connected')); ScaffoldMessenger.of(context).showSnackBar(snackBar); - sessionIDToDeviceID[session.sessionId] = castDevice; debugPrint("Send request to pair"); session.sendMessage(_pairRequestNamespace, {}); } else if (state == CastSessionState.closed) { dev.log('Session closed', name: 'CastServiceImpl'); - sessionIDToDeviceID.remove(session.sessionId); } }); @@ -55,4 +65,29 @@ class CastServiceImpl extends CastService { @override bool get isSupported => true; + + @override + Future closeActiveCasts() { + final sessions = CastSessionManager().sessions; + for (final session in sessions) { + session.sendMessage( + _pairRequestNamespace, + { + "type": "CLOSE", + }, + ); + session.close(); + } + return Future.value(); + } + + @override + Future> getActiveSessions() { + final sessions = CastSessionManager().sessions; + final Map result = {}; + for (final session in sessions) { + result[session.sessionId] = session.state.toString(); + } + return Future.value(result); + } }