[mob] Add method to close cast and keep track of active casts

This commit is contained in:
Neeraj Gupta 2024-04-27 12:16:48 +05:30
parent dddbb959b5
commit 4ce6fa790f
5 changed files with 75 additions and 6 deletions

View file

@ -1 +1,2 @@
export 'src/model.dart';
export 'src/service.dart';

View file

@ -0,0 +1,5 @@
// create enum for type of message for cast
enum CastMessageType {
pairCode,
alreadyCasting,
}

View file

@ -1,7 +1,18 @@
import "package:ente_cast/src/model.dart";
import "package:flutter/widgets.dart";
abstract class CastService {
bool get isSupported;
Future<List<(String, Object)>> searchDevices();
Future<void> connectDevice(BuildContext context, Object device);
Future<void> connectDevice(
BuildContext context,
Object device, {
int? collectionID,
// callback that take a map of string, dynamic
void Function(Map<CastMessageType, Map<String, dynamic>>)? onMessage,
});
// returns a map of sessionID to deviceNames
Future<Map<String, String>> getActiveSessions();
Future<void> closeActiveCasts();
}

View file

@ -3,7 +3,12 @@ import "package:flutter/widgets.dart";
class CastServiceImpl extends CastService {
@override
Future<void> connectDevice(BuildContext context, Object device) {
Future<void> connectDevice(
BuildContext context,
Object device, {
int? collectionID,
void Function(Map<CastMessageType, Map<String, dynamic>>)? onMessage,
}) {
throw UnimplementedError();
}
@ -15,4 +20,16 @@ class CastServiceImpl extends CastService {
// TODO: implement searchDevices
throw UnimplementedError();
}
@override
Future<void> closeActiveCasts() {
// TODO: implement closeActiveCasts
throw UnimplementedError();
}
@override
Future<Map<String, String>> getActiveSessions() {
// TODO: implement getActiveSessions
throw UnimplementedError();
}
}

View file

@ -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<String, CastDevice> sessionIDToDeviceID = {};
final Map<int, String> collectionIDToSessions = {};
@override
Future<void> connectDevice(BuildContext context, Object device) async {
Future<void> connectDevice(
BuildContext context,
Object device, {
int? collectionID,
void Function(Map<CastMessageType, Map<String, dynamic>>)? 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<void> closeActiveCasts() {
final sessions = CastSessionManager().sessions;
for (final session in sessions) {
session.sendMessage(
_pairRequestNamespace,
{
"type": "CLOSE",
},
);
session.close();
}
return Future.value();
}
@override
Future<Map<String, String>> getActiveSessions() {
final sessions = CastSessionManager().sessions;
final Map<String, String> result = {};
for (final session in sessions) {
result[session.sessionId] = session.state.toString();
}
return Future.value(result);
}
}