From 1e73f6cb32372811f4c3432e65de36f15bc6c404 Mon Sep 17 00:00:00 2001 From: USAMAWIZARD Date: Tue, 29 Apr 2025 21:30:01 +0530 Subject: [PATCH 1/3] fix callbacks not fired --- .../core/WebRTCClient.java | 41 ++++++++++++++++++- .../websocket/WebSocketConstants.java | 7 ++++ .../websocket/WebSocketHandler.java | 2 - .../WebRTCClientTest.java | 16 ++++++++ 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java index 872f0241..566d8bac 100644 --- a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java +++ b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java @@ -16,7 +16,6 @@ import android.util.DisplayMetrics; import android.util.Log; import android.view.WindowManager; -import android.widget.GridLayout; import android.widget.Toast; import androidx.annotation.NonNull; @@ -64,6 +63,7 @@ import org.webrtc.audio.JavaAudioDeviceModule; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -86,6 +86,7 @@ import io.antmedia.webrtcandroidframework.apprtc.AppRTCAudioManager; import io.antmedia.webrtcandroidframework.websocket.AntMediaSignallingEvents; import io.antmedia.webrtcandroidframework.websocket.Broadcast; +import io.antmedia.webrtcandroidframework.websocket.WebSocketConstants; import io.antmedia.webrtcandroidframework.websocket.WebSocketHandler; public class WebRTCClient implements IWebRTCClient, AntMediaSignallingEvents { @@ -1576,6 +1577,7 @@ public void onJoinedTheRoom(String streamId, String[] streams) { config.webRTCListener.onJoinedTheRoom(streamId, streams); } + @Override public void onRoomInformation(String[] streams) { config.webRTCListener.onRoomInformation(streams); @@ -1787,6 +1789,11 @@ public void onStateChange() { } }); } + protected String toTextMessage(DataChannel.Buffer buffer) { + ByteBuffer data = buffer.data; + String messageText = new String(data.array(), StandardCharsets.UTF_8); + return messageText; + } @Override public void onMessage(final DataChannel.Buffer buffer) { @@ -1799,6 +1806,7 @@ public void onMessage(final DataChannel.Buffer buffer) { handler.post(() -> { if (config.dataChannelObserver == null || dataChannel == null) return; try{ + handleNotification(toTextMessage(bufferCopy)); config.dataChannelObserver.onMessage(bufferCopy, dataChannel.label()); }catch (IllegalStateException e) { Log.e(TAG, "Data channel related error:" + e.getMessage()); @@ -1807,6 +1815,37 @@ public void onMessage(final DataChannel.Buffer buffer) { } } + public void handleNotification(String message) { + if (message == null || !message.contains("eventType")) + return; + + JSONObject jsonMessage; + String streamId; + String eventTyp; + + try { + jsonMessage = new JSONObject(message); + streamId = jsonMessage.getString(WebSocketConstants.STREAM_ID); + eventTyp = jsonMessage.getString("eventType"); + } catch (Exception e) { + return; + } + + switch (eventTyp) { + case WebSocketConstants.CAM_TURNED_OFF: + config.webRTCListener.onCameraTurnOffFor(streamId); + break; + case WebSocketConstants.CAM_TURNED_ON: + config.webRTCListener.onCameraTurnOnFor(streamId); + break; + case WebSocketConstants.MIC_MUTED: + config.webRTCListener.onMutedFor(streamId); + break; + case WebSocketConstants.MIC_UNMUTED: + config.webRTCListener.onUnmutedFor(streamId); + } + } + public void sendMessageViaDataChannel(String streamId, DataChannel.Buffer buffer) { if (isDataChannelEnabled()) { executor.execute(() -> { diff --git a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketConstants.java b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketConstants.java index b8a30604..bb003292 100644 --- a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketConstants.java +++ b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketConstants.java @@ -451,4 +451,11 @@ private WebSocketConstants() { public static final int WEBSOCKET_CONNECTION_TIMEOUT = 10000; //10 sec + public static final String CAM_TURNED_OFF = "CAM_TURNED_OFF"; + + public static final String CAM_TURNED_ON = "CAM_TURNED_ON"; + + public static final String MIC_MUTED = "MIC_MUTED"; + + public static final String MIC_UNMUTED = "MIC_UNMUTED"; } diff --git a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketHandler.java b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketHandler.java index 19c5fcad..5b7be092 100644 --- a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketHandler.java +++ b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/websocket/WebSocketHandler.java @@ -212,7 +212,6 @@ else if (commandText.equals(WebSocketConstants.STREAM_INFORMATION_NOTIFICATION)) signallingListener.onStreamInfoList(streamId, streamInfos); } else if (commandText.equals(NOTIFICATION_COMMAND)) { - String definition = json.getString(DEFINITION); Log.d(TAG, "notification: " + definition); @@ -280,7 +279,6 @@ else if (definition.equals(WebSocketConstants.BROADCAST_OBJECT_NOTIFICATION)) { }else if(definition.equals(WebSocketConstants.RESOLUTION_CHANGE_INFO_COMMAND)){ int resolution = json.getInt(WebSocketConstants.STREAM_HEIGHT); signallingListener.onResolutionChange(streamId, resolution); - } } else if (commandText.equals(WebSocketConstants.TRACK_LIST)) { diff --git a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java index 36dfefa7..02731ef4 100644 --- a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java +++ b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java @@ -1399,5 +1399,21 @@ public void testLeaveP2P() { Mockito.verify(webRTCClient, times(1)).release(true); } + @Test + public void handleNotification(){ + IWebRTCListener listener1 = webRTCClient.getConfig().webRTCListener; + webRTCClient.handleNotification("{\"streamId\":\"test\",\"eventType\":\"CAM_TURNED_OFF\"}"); + verify(listener1).onCameraTurnOffFor("test"); + + webRTCClient.handleNotification("{\"streamId\":\"test\",\"eventType\":\"CAM_TURNED_ON\"}"); + verify(listener1).onCameraTurnOnFor("test"); + + webRTCClient.handleNotification("{\"streamId\":\"test\",\"eventType\":\"MIC_UNMUTED\"}"); + verify(listener1).onUnmutedFor("test"); + + webRTCClient.handleNotification("{\"streamId\":\"test\",\"eventType\":\"MIC_MUTED\"}"); + verify(listener1).onMutedFor("test"); + + } } From 2793900582b132b90dab34cbe673c91de353b8b7 Mon Sep 17 00:00:00 2001 From: USAMAWIZARD Date: Tue, 29 Apr 2025 22:05:43 +0530 Subject: [PATCH 2/3] add more test cases --- .../webrtcandroidframework/core/WebRTCClient.java | 5 ++++- .../webrtcandroidframework/WebRTCClientTest.java | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java index 566d8bac..20ff2476 100644 --- a/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java +++ b/webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java @@ -1749,7 +1749,7 @@ public void forceStreamQuality(String mainTrackStreamId, String subTrackStreamId wsHandler.forceStreamQuality(mainTrackStreamId, subTrackStreamId, height); } - class DataChannelInternalObserver implements DataChannel.Observer { + public class DataChannelInternalObserver implements DataChannel.Observer { private final DataChannel dataChannel; @@ -2136,6 +2136,9 @@ public PCObserver getPCObserver(String streamId) { return new PCObserver(streamId); } + public DataChannelInternalObserver getInternalDataChannelObserver(DataChannel dataChannel){ + return new DataChannelInternalObserver(dataChannel); + } public void initDataChannel(String streamId) { if (config.dataChannelEnabled) { DataChannel.Init init = new DataChannel.Init(); diff --git a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java index 02731ef4..3ba1c4e3 100644 --- a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java +++ b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java @@ -64,6 +64,7 @@ import java.lang.reflect.Field; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -1416,4 +1417,13 @@ public void handleNotification(){ } + @Test + public void testDataChannelOnMessage() throws InterruptedException { + WebRTCClient.DataChannelInternalObserver dataChannelObserver = webRTCClient.getInternalDataChannelObserver(mock(DataChannel.class)); + ByteBuffer buf = ByteBuffer.wrap("hello".getBytes(StandardCharsets.UTF_8)); + DataChannel.Buffer buffer = new DataChannel.Buffer(buf, false); + dataChannelObserver.onMessage(buffer); + Thread.sleep(2000); + verify(webRTCClient).handleNotification("hello"); + } } From 541f4f4aa3fcfc5a2d934dca740f5b526fa57252 Mon Sep 17 00:00:00 2001 From: USAMAWIZARD Date: Tue, 29 Apr 2025 22:11:59 +0530 Subject: [PATCH 3/3] add more test cases --- .../webrtcandroidframework/WebRTCClientTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java index 3ba1c4e3..53f5a196 100644 --- a/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java +++ b/webrtc-android-framework/src/test/java/io/antmedia/webrtcandroidframework/WebRTCClientTest.java @@ -1419,11 +1419,26 @@ public void handleNotification(){ @Test public void testDataChannelOnMessage() throws InterruptedException { + IWebRTCListener listener1 = webRTCClient.getConfig().webRTCListener; WebRTCClient.DataChannelInternalObserver dataChannelObserver = webRTCClient.getInternalDataChannelObserver(mock(DataChannel.class)); ByteBuffer buf = ByteBuffer.wrap("hello".getBytes(StandardCharsets.UTF_8)); DataChannel.Buffer buffer = new DataChannel.Buffer(buf, false); dataChannelObserver.onMessage(buffer); Thread.sleep(2000); verify(webRTCClient).handleNotification("hello"); + + buf = ByteBuffer.wrap("{\"streamId\":\"test\",\"noeventtyp\":\"MIC_MUTED\"}".getBytes(StandardCharsets.UTF_8)); + buffer = new DataChannel.Buffer(buf, false); + dataChannelObserver.onMessage(buffer); + + Thread.sleep(2000); + verify(listener1,times(0)).onMutedFor("test"); + + buf = ByteBuffer.wrap("{\"streamId\":\"test\",\"eventType\":\"MIC_MUTED\"}".getBytes(StandardCharsets.UTF_8)); + buffer = new DataChannel.Buffer(buf, false); + dataChannelObserver.onMessage(buffer); + + Thread.sleep(2000); + verify(listener1).onMutedFor("test"); } }