diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusConnection.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusConnection.java index e27ba72c..697ebe7e 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusConnection.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusConnection.java @@ -120,9 +120,10 @@ public boolean isEnded(){ peerConnection.connectionState() == PeerConnection.PeerConnectionState.FAILED; } - public void close(){ - if(peerConnection.connectionState() != PeerConnection.PeerConnectionState.CLOSED) { + public void close() { + if (peerConnection.connectionState() != PeerConnection.PeerConnectionState.CLOSED) { peerConnection.dispose(); + pcObserver.dispose(); } } diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusPublisher.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusPublisher.java index 72d5f1d5..2b8a353b 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusPublisher.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusPublisher.java @@ -92,7 +92,11 @@ public void removeAudioTrack(String id) { AudioTrackInfo audioTrackInfo = audioTracks.get(id); if (audioTrackInfo == null) return; peerConnection.removeTrack(audioTrackInfo.sender); - audioTracks.remove(id); + + AudioTrackInfo removedAudioTrackInfo = audioTracks.remove(id); + if (removedAudioTrackInfo != null) { + removedAudioTrackInfo.frameCryptor.dispose(); + } } } @@ -102,6 +106,11 @@ public void removeVideoTrack(String id) { if (videoTrackInfo == null) return; peerConnection.removeTrack(videoTrackInfo.sender); videoTracks.remove(id); + + VideoTrackInfo removedVideoTrackInfo = videoTracks.remove(id); + if (removedVideoTrackInfo != null) { + removedVideoTrackInfo.frameCryptor.dispose(); + } } } @@ -124,9 +133,14 @@ public void setAnswer(String sdp, String type){ @Override public void close() { - super.close(); + try { + audioTracks.values().forEach(track -> track.frameCryptor.dispose()); + videoTracks.values().forEach(track -> track.frameCryptor.dispose()); + } catch (IllegalStateException ignored) {} audioTracks.clear(); videoTracks.clear(); + + super.close(); } @Override diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java index 6e50275b..8cd5fc88 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java @@ -130,15 +130,23 @@ public void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams) { } } + public void dispose() { + frameCryptorMap.forEach((id, cryptor) -> { + if (cryptor != null) cryptor.dispose(); + }); + frameCryptorMap.clear(); + } + @Override public void onRemoveTrack(RtpReceiver receiver) { MediaStreamTrack track = receiver.track(); - if(track != null) { + if (track != null) { PmxFrameCryptor removedCryptor = frameCryptorMap.remove(track.id()); if(removedCryptor != null) { removedCryptor.dispose(); } } + receiver.dispose(); } public void setFrameCryptorOptions(PmxFrameCryptor.PmxFrameCryptorOptions options) { diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java index 033b46d5..11f17e12 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java @@ -16,7 +16,7 @@ import java.util.Optional; import java.util.function.BiConsumer; -class PeerConnectionManager { +class PeerConnectionManager implements AutoCloseable { private final Map sessions = new HashMap<>(); private final Map sessionHandles = new HashMap<>(); protected final PeerConnectionFactory pcFactory; @@ -62,5 +62,12 @@ public void createHandleToRoom( public void leaveStreamRoom(@NonNull String streamRoomId) { sessions.remove(streamRoomId); } + + @Override + public void close() throws Exception { + sessions.clear(); + sessionHandles.clear(); + pcFactory.dispose(); + } } diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index a6c122ad..91204921 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -35,8 +35,9 @@ import java.util.List; import java.util.Objects; import java.util.function.Consumer; +import java.util.stream.Collectors; -public class StreamApi { +public class StreamApi implements AutoCloseable{ private final StreamApiLow api; private final PeerConnectionManager pcManager; public final TrackFactory trackFactory; @@ -386,6 +387,12 @@ public String buildSubscriptionQuery( ); } + @Override + public void close() throws Exception { + pcManager.close(); + api.close(); + } + private List getRTCConfiguration() { return api.getTurnCredentials().stream().map(item -> PeerConnection.IceServer.builder(item.url)