[mob] Add method to close cast and keep track of active casts
This commit is contained in:
parent
dddbb959b5
commit
4ce6fa790f
5 changed files with 75 additions and 6 deletions
|
@ -1 +1,2 @@
|
|||
export 'src/model.dart';
|
||||
export 'src/service.dart';
|
||||
|
|
5
mobile/plugins/ente_cast/lib/src/model.dart
Normal file
5
mobile/plugins/ente_cast/lib/src/model.dart
Normal file
|
@ -0,0 +1,5 @@
|
|||
// create enum for type of message for cast
|
||||
enum CastMessageType {
|
||||
pairCode,
|
||||
alreadyCasting,
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue