8000 Move 'dataChannelStateChanged | dataChannelReceiveMessage' event call… · lineCode/flutter-webrtc@4fc6659 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4fc6659

Browse files
committed
Move 'dataChannelStateChanged | dataChannelReceiveMessage' event callback to RTCDataChannel.
1 parent 3eb5706 commit 4fc6659

File tree

9 files changed

+136
-77
lines changed

9 files changed

+136
-77
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/DataChannelObserver.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class DataChannelObserver implements DataChannel.Observer, EventChannel.StreamHa
2323
this.eventChannel =
2424
new EventChannel(
2525
plugin.registrar().messenger(),
26-
"cloudwebrtc.com/WebRTC/peerDataChannelEvent" + dataChannel);
26+
"cloudwebrtc.com/WebRTC/dataChannelEvent" + dataChannel);
2727
eventChannel.setStreamHandler(this);
2828
}
2929

@@ -56,13 +56,6 @@ public void onBufferedAmountChange(long amount) { }
5656

5757
@Override
5858
public void onStateChange() {
59-
if(mDataChannel.state() == DataChannel.State.OPEN){
60-
ConstraintsMap params = new ConstraintsMap();
61-
params.putString("event", "didOpenDataChannel");
62-
params.putInt("id", mDataChannel.id());
63-
params.putString("label", mDataChannel.label());
64-
sendEvent(params);
65-
}
6659
ConstraintsMap params = new ConstraintsMap();
6760
params.putString("event", "dataChannelStateChanged");
6861
params.putInt("id", mDataChannel.id());

android/src/main/java/com/cloudwebrtc/webrtc/FlutterRTCVideoRenderer.java

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public void Dispose(){
3737
*/
3838
private final RendererEvents rendererEvents
3939
= new RendererEvents() {
40+
private int _rotation = 0;
41+
private int _width = 0, _height = 0;
42+
4043
@Override
4144
public void onFirstFrameRendered() {
4245
}
@@ -48,25 +51,31 @@ public void onFrameResolutionChanged(
4851

4952
if(eventSink != null)
5053
{
51-
ConstraintsMap params = new ConstraintsMap();
52-
params.putString("event", "didTextureChangeVideoSize");
53-
params.putInt("id", id);
54-
55-
if(rotation == 90 || rotation == 270){
56-
params.putDouble("width", (double) videoHeight);
57-
params.putDouble("height", (double) videoWidth);
58-
}else {
59-
params.putDouble("width", (double) videoWidth);
60-
params.putDouble("height", (double) videoHeight);
54+
if(_width != videoWidth || _height != videoHeight){
55+
ConstraintsMap params = new ConstraintsMap();
56+
params.putString("event", "didTextureChangeVideoSize");
57+
params.putInt("id", id);
58+
59+
if(rotation == 90 || rotation == 270){
60+
params.putDouble("width", (double) videoHeight);
61+
params.putDouble("height", (double) videoWidth);
62+
}else {
63+
params.putDouble("width", (double) videoWidth);
64+
params.putDouble("height", (double) videoHeight);
65+
}
66+
_width = videoWidth;
67+
_height = videoHeight;
68+
eventSink.success(params.toMap());
6169
}
6270

63-
eventSink.success(params.toMap());
64-
65-
ConstraintsMap params2 = new ConstraintsMap();
66-
params2.putString("event", "didTextureChangeRotation");
67-
params2.putInt("id", id);
68-
params2.putInt("rotation", rotation);
69-
eventSink.success(params2.toMap());
71+
if(_rotation != rotation){
72+
ConstraintsMap params2 = new ConstraintsMap();
73+
params2.putString("event", "didTextureChangeRotation");
74+
params2.putInt("id", id);
75+
params2.putInt("rotation", rotation);
76+
_rotation = rotation;
77+
eventSink.success(params2.toMap());
78+
}
7079
}
7180
}
7281
};

ios/Classes/FlutterRTCDataChannel.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
#import "FlutterWebRTCPlugin.h"
22
#import <WebRTC/RTCDataChannel.h>
33

4-
@interface RTCDataChannel (Flutter)
5-
4+
@interface RTCDataChannel (Flutter) <FlutterStreamHandler>
65
@property (nonatomic, strong) NSString *peerConnectionId;
7-
6+
@property (nonatomic, strong) FlutterEventSink eventSink;
7+
@property (nonatomic, strong) FlutterEventChannel* eventChannel;
88
@end
99

1010
@interface FlutterWebRTCPlugin (RTCDataChannel) <RTCDataChannelDelegate>
1111

1212

1313
-(void)createDataChannel:(nonnull NSString *)peerConnectionId
1414
label:(nonnull NSString *)label
15-
config:(nonnull RTCDataChannelConfiguration *)config;
15+
config:(nonnull RTCDataChannelConfiguration *)config
16+
messenger:(NSObject<FlutterBinaryMessenger>*)messenger;
1617

1718
-(void)dataChannelClose:(nonnull NSString *)peerConnectionId
1819
dataChannelId:(nonnull NSString *)dataChannelId;

ios/Classes/FlutterRTCDataChannel.m

Lines changed: 74 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,47 +14,91 @@ - (void)setPeerConnectionId:(NSString *)peerConnectionId
1414
{
1515
objc_setAssociatedObject(self, @selector(peerConnectionId), peerConnectionId, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
1616
}
17+
18+
- (FlutterEventSink )eventSink
19+
{
20+
return objc_getAssociatedObject(self, _cmd);
21+
}
22+
23+
- (void)setEventSink:(FlutterEventSink)eventSink
24+
{
25+
objc_setAssociatedObject(self, @selector(eventSink), eventSink, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
26+
}
27+
28+
- (FlutterEventChannel *)eventChannel
29+
{
30+
return objc_getAssociatedObject(self, _cmd);
31+
}
32+
33+
- (void)setEventChannel:(FlutterEventChannel *)eventChannel
34+
{
35+
objc_setAssociatedObject(self, @selector(eventChannel), eventChannel, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
36+
}
37+
38+
#pragma mark - FlutterStreamHandler methods
39+
40+
- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {
41+
self.eventSink = nil;
42+
return nil;
43+
}
44+
45+
- (FlutterError* _Nullable)onListenWithArguments:(id _Nullable)arguments
46+
eventSink:(nonnull FlutterEventSink)sink {
47+
self.eventSink = sink;
48+
return nil;
49+
}
1750
@end
1851

1952
@implementation FlutterWebRTCPlugin (RTCDataChannel)
2053

2154
-(void)createDataChannel:(nonnull NSString *)peerConnectionId
2255
label:(NSString *)label
2356
config:(RTCDataChannelConfiguration *)config
57+
messenger:(NSObject<FlutterBinaryMessenger>*)messenger
2458
{
25-
RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId];
26-
RTCDataChannel *dataChannel = [peerConnection dataChannelForLabel:label configuration:config];
59+
RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId];
60+
RTCDataChannel *dataChannel = [peerConnection dataChannelForLabel:label configuration:config];
2761

28-
if (-1 != dataChannel.channelId) {
29-
dataChannel.peerConnectionId = peerConnectionId;
30-
NSNumber *dataChannelId = [NSNumber numberWithInteger:dataChannel.channelId];
31-
peerConnection.dataChannels[dataChannelId] = dataChannel;
32-
dataChannel.delegate = self;
33-
}
62+
if (-1 != dataChannel.channelId) {
63+
dataChannel.peerConnectionId = peerConnectionId;
64+
NSNumber *dataChannelId = [NSNumber numberWithInteger:dataChannel.channelId];
65+
peerConnection.dataChannels[dataChannelId] = dataChannel;
66+
dataChannel.delegate = self;
67+
68+
FlutterEventChannel *eventChannel = [FlutterEventChannel
69+
eventChannelWithName:[NSString stringWithFormat:@"cloudwebrtc.com/WebRTC/dataChannelEvent%d", dataChannel.channelId]
70+
binaryMessenger:messenger];
71+
72+
dataChannel.eventChannel = eventChannel;
73+
[eventChannel setStreamHandler:dataChannel];
74+
}
3475
}
3576

3677
-(void)dataChannelClose:(nonnull NSString *)peerConnectionId
3778
dataChannelId:(nonnull NSString *)dataChannelId
3879
{
39-
RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId];
40-
NSMutableDictionary *dataChannels = peerConnection.dataChannels;
41-
RTCDataChannel *dataChannel = dataChannels[dataChannelId];
42-
[dataChannel close];
43-
[dataChannels removeObjectForKey:dataChannelId];
80+
RTCPeerCon 7802 nection *peerConnection = self.peerConnections[peerConnectionId];
81+
NSMutableDictionary *dataChannels = peerConnection.dataChannels;
82+
RTCDataChannel *dataChannel = dataChannels[dataChannelId];
83+
FlutterEventChannel *eventChannel = dataChannel.eventChannel;
84+
[eventChannel setStreamHandler:nil];
85+
dataChannel.eventChannel = nil;
86+
[dataChannel close];
87+
[dataChannels removeObjectForKey:dataChannelId];
4488
}
4589

4690
-(void)dataChannelSend:(nonnull NSString *)peerConnectionId
4791
dataChannelId:(nonnull NSString *)dataChannelId
4892
data:(NSString *)data
4993
type:(NSString *)type
5094
{
51-
RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId];
52-
RTCDataChannel *dataChannel = peerConnection.dataChannels[dataChannelId];
53-
NSData *bytes = [type isEqualToString:@"binary"] ?
95+
RTCPeerConnection *peerConnection = self.peerConnections[peerConnectionId];
96+
RTCDataChannel *dataChannel = peerConnection.dataChannels[dataChannelId];
97+
NSData *bytes = [type isEqualToString:@"binary"] ?
5498
[[NSData alloc] initWithBase64EncodedString:data options:0] :
5599
[data dataUsingEncoding:NSUTF8StringEncoding];
56-
RTCDataBuffer *buffer = [[RTCDataBuffer alloc] initWithData:bytes isBinary:[type isEqualToString:@"binary"]];
57-
[dataChannel sendData:buffer];
100+
RTCDataBuffer *buffer = [[RTCDataBuffer alloc] initWithData:bytes isBinary:[type isEqualToString:@"binary"]];
101+
[dataChannel sendData:buffer];
58102
}
59103

60104
- (NSString *)stringForDataChannelState:(RTCDataChannelState)state
@@ -74,7 +118,7 @@ - (NSString *)stringForDataChannelState:(RTCDataChannelState)state
74118
- (void)dataChannelDidChangeState:(RTCDataChannel*)channel
75119
{
76120
RTCPeerConnection *peerConnection = self.peerConnections[channel.peerConnectionId];
77-
FlutterEventSink eventSink = peerConnection.eventSink;
121+
FlutterEventSink eventSink = channel.eventSink;
78122
if(eventSink) {
79123
eventSink(@{ @"event" : @"dataChannelStateChanged",
80124
@"id": @(channel.channelId),
@@ -85,18 +129,18 @@ - (void)dataChannelDidChangeState:(RTCDataChannel*)channel
85129
// Called when a data buffer was successfully received.
86130
- (void)dataChannel:(RTCDataChannel *)channel didReceiveMessageWithBuffer:(RTCDataBuffer *)buffer
87131
{
88-
NSString *type;
89-
NSString *data;
90-
if (buffer.isBinary) {
91-
type = @"binary";
92-
data = [buffer.data base64EncodedStringWithOptions:0];
93-
} else {
94-
type = @"text";
95-
data = [[NSString alloc] initWithData:buffer.data
96-
encoding:NSUTF8StringEncoding];
97-
}
132+
NSString *type;
133+
NSString *data;
134+
if (buffer.isBinary) {
135+
type = @"binary";
136+
data = [buffer.data base64EncodedStringWithOptions:0];
137+
} else {
138+
type = @"text";
139+
data = [[NSString alloc] initWithData:buffer.data
140+
encoding:NSUTF8StringEncoding];
141+
}
98142
RTCPeerConnection *peerConnection = self.peerConnections[channel.peerConnectionId];
99-
FlutterEventSink eventSink = peerConnection.eventSink;
143+
FlutterEventSink eventSink = channel.eventSink;
100144
if(eventSink) {
101145
eventSink(@{ @"event" : @"dataChannelReceiveMessage",
102146
@"id": @(channel.channelId),

ios/Classes/FlutterRTCPeerConnection.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,13 @@ - (void)peerConnection:(RTCPeerConnection*)peerConnection didOpenDataChannel:(RT
530530
dataChannel.delegate = self;
531531
peerConnection.dataChannels[dataChannelId] = dataChannel;
532532

533+
FlutterEventChannel *eventChannel = [FlutterEventChannel
534+
eventChannelWithName:[NSString stringWithFormat:@"cloudwebrtc.com/WebRTC/dataChannelEvent%d", dataChannel.channelId]
535+
binaryMessenger:self.messenger];
536+
537+
dataChannel.eventChannel = eventChannel;
538+
[eventChannel setStreamHandler:dataChannel];
539+
533540
FlutterEventSink eventSink = peerConnection.eventSink;
534541
if(eventSink){
535542
eventSink(@{

ios/Classes/FlutterWebRTCPlugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
@property (nonatomic, strong) NSMutableDictionary<NSString *, RTCMediaStreamTrack *> *localTracks;
1818
@property (nonatomic, strong) NSMutableDictionary<NSNumber *, FlutterRTCVideoRenderer *> *renders;
1919
@property (nonatomic, retain) UIViewController *viewController;/*for broadcast or ReplayKit */
20+
@property (nonatomic, strong) NSObject<FlutterBinaryMessenger>* messenger;
2021

2122
- (RTCMediaStream*)streamForId:(NSString*)streamId;
2223

ios/Classes/FlutterWebRTCPlugin.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ @implementation FlutterWebRTCPlugin {
2626
id _textures;
2727
}
2828

29+
@synthesize messenger = _messenger;
30+
2931
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
3032

3133
FlutterMethodChannel* channel = [FlutterMethodChannel
@@ -232,7 +234,8 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
232234
NSDictionary * dataChannelDict = (NSDictionary*)argsMap[@"dataChannelDict"];
233235
[self createDataChannel:peerConnectionId
234236
label:label
235-
config:[self RTCDataChannelConfiguration:dataChannelDict]];
237+
config:[self RTCDataChannelConfiguration:dataChannelDict]
238+
messenger:_messenger];
236239
result(nil);
237240
}else if([@"dataChannelSend" isEqualToString:call.method]){
238241
NSDictionary* argsMap = call.arguments;

lib/rtc_data_channel.dart

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
import 'package:webrtc/webrtc.dart';
2-
import 'package:flutter/services.dart';
31
import 'dart:async';
2+
import 'package:flutter/services.dart';
3+
4+
import 'package:webrtc/webrtc.dart';
5+
import 'package:webrtc/utils.dart';
6+
47

58
class RTCDataChannelInit {
69
bool ordered;
@@ -52,6 +55,19 @@ class RTCDataChannel {
5255
void eventListener(dynamic event) {
5356
final Map<dynamic, dynamic> map = event;
5457
switch (map['event']) {
58+
case 'dataChannelStateChanged':
59+
int dataChannelId = map['id'];
60+
String state = map['state'];
61+
if (this.onDataChannelState != null)
62+
this.onDataChannelState(rtcDataChannelStateForString(state));
63+
break;
64+
case 'dataChannelReceiveMessage':
65+
int dataChannelId = map['id'];
66+
String type = map['type'];
67+
String data = map['data'];
68+
if (this.onMessage != null)
69+
this.onMessage(data);
70+
break;
5571
}
5672
}
5773

lib/rtc_peerconnection.dart

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -148,21 +148,6 @@ class RTCPeerConnection {
148148
new RTCDataChannel(this._peerConnectionId, label, dataChannelId);
149149
if (this.onDataChannel != null) this.onDataChannel(_dataChannel);
150150
break;
151-
case 'dataChannelStateChanged':
152-
int dataChannelId = map['id'];
153-
String state = map['state'];
154-
if (this.onDataChannel != null &&
155-
_dataChannel.onDataChannelState != null)
156-
_dataChannel.onDataChannelState(rtcDataChannelStateForString(state));
157-
break;
158-
case 'dataChannelReceiveMessage':
159-
int dataChannelId = map['id'];
160-
String type = map['type'];
161-
String data = map['data'];
162-
if (this.onDataChannel != null &&
163-
_dataChannel.onMessage != null)
164-
_dataChannel.onMessage(data);
165-
break;
166151
case 'onRenegotiationNeeded':
167152
if (this.onRenegotiationNeeded != null) this.onRenegotiationNeeded();
168153
break;

0 commit comments

Comments
 (0)
0