From ae265dd2440aca843c1b070c19310cdf3d64f955 Mon Sep 17 00:00:00 2001 From: Dawid Jenczewski Date: Fri, 13 Mar 2026 12:11:39 +0100 Subject: [PATCH 1/5] refactor(privmx-endpoint-streams/android): cleanup unused variables, remove todos and add nonNull annotation in StreamApi.java --- .../modules/stream/StreamApi.java | 48 ++++--------------- 1 file changed, 10 insertions(+), 38 deletions(-) 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 bf303e44..9d3e03ec 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 @@ -4,7 +4,6 @@ import android.content.Context; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import com.simplito.java.privmx_endpoint.model.ContainerPolicy; import com.simplito.java.privmx_endpoint.model.PagingList; @@ -32,21 +31,11 @@ import org.webrtc.audio.AudioDeviceModule; import org.webrtc.audio.JavaAudioDeviceModule; -import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.function.Consumer; -import java.util.stream.Collectors; -//TODO: Good to remove context from StreamApi public class StreamApi { - public static final String VIDEO_TRACK_ID = "ARDAMSv0"; - public static final String AUDIO_TRACK_ID = "ARDAMSa0"; - public static final String VIDEO_TRACK_TYPE = "video"; - private static final String TAG = "StreamApi"; - - private final Context appContext; - private final EglBase rootEglBase; private final StreamApiLow api; private final PeerConnectionManager pcManager; public final TrackFactory trackFactory; @@ -83,29 +72,13 @@ private static PeerConnectionFactory DefaultPeerConnectionFactory( return factory; } - public StreamApi( - Context appContext, - EglBase rootEglBase, - StreamApiLow api - ) { - this(appContext, rootEglBase, api, null); - } - public StreamApi( @NonNull Context appContext, @NonNull EglBase rootEglBase, - @NonNull StreamApiLow api, - //TODO: remove this parameter - @Nullable PeerConnectionFactory pcFactory + @NonNull StreamApiLow api ) { - this.appContext = appContext; - this.rootEglBase = rootEglBase; this.api = api; - PeerConnectionFactory factory = pcFactory; - if (factory == null) { - //TODO: What should be passed to the options parameter - factory = DefaultPeerConnectionFactory(appContext, rootEglBase, new PeerConnectionFactory.Options()); - } + PeerConnectionFactory factory = DefaultPeerConnectionFactory(appContext, rootEglBase, new PeerConnectionFactory.Options()); pcManager = new PeerConnectionManager( factory, (sessionId, rtcConfiguration) -> { @@ -172,7 +145,6 @@ public List listStreams(String streamRoomId) { public void joinStreamRoom( String streamRoomId ) { - //TODO: Rollback this change, it is do only for run test RoomJanusSession session = pcManager.createSession(streamRoomId); api.joinStreamRoom(streamRoomId, session.webrtc); } @@ -203,7 +175,7 @@ public StreamHandle createStream(String streamRoomId) { * @throws IllegalStateException if call addTrack before call createStream */ public void addTrack( - StreamHandle streamHandle, + @NonNull StreamHandle streamHandle, MediaStreamTrack track ) throws IllegalStateException { Objects.requireNonNull(streamHandle); @@ -226,7 +198,7 @@ public void addTrack( } public void setTrackObserver( - String roomId, + @NonNull String roomId, TrackObserver observer, String streamId ) { @@ -238,7 +210,7 @@ public void setTrackObserver( } public void setConnectionStateObserver( - String roomId, + @NonNull String roomId, Consumer observer ) { Objects.requireNonNull(roomId); @@ -261,8 +233,8 @@ public void setTrackObserver( * @throws IllegalStateException when Stream with this StreamHandle doesn't exist. */ public void removeTrack( - StreamHandle streamHandle, - MediaStreamTrack track + @NonNull StreamHandle streamHandle, + @NonNull MediaStreamTrack track ) throws IllegalStateException { Objects.requireNonNull(streamHandle); RoomJanusSession session = pcManager.getSession(streamHandle); @@ -278,17 +250,17 @@ public void removeTrack( } } - public StreamPublishResult publishStream(StreamHandle streamHandle) { + public StreamPublishResult publishStream(@NonNull StreamHandle streamHandle) { Objects.requireNonNull(streamHandle); return api.publishStream(streamHandle); } - public StreamPublishResult updateStream(StreamHandle streamHandle) { + public StreamPublishResult updateStream(@NonNull StreamHandle streamHandle) { Objects.requireNonNull(streamHandle); return api.updateStream(streamHandle); } - public void unpublishStream(StreamHandle streamHandle) { + public void unpublishStream(@NonNull StreamHandle streamHandle) { Objects.requireNonNull(streamHandle); api.unpublishStream(streamHandle); } From 8c889e0e8f64e79424b550816719ac8288c48a48 Mon Sep 17 00:00:00 2001 From: Dawid Jenczewski Date: Fri, 13 Mar 2026 13:32:29 +0100 Subject: [PATCH 2/5] chore(privmx-endpoint-streams/android): remove todos from TrackFactory.java --- .../privmx_endpoint/modules/stream/TrackFactory.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackFactory.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackFactory.java index f051f6ea..9d102ebd 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackFactory.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackFactory.java @@ -1,11 +1,6 @@ package com.simplito.java.privmx_endpoint.modules.stream; -import org.webrtc.AudioSource; -import org.webrtc.AudioTrack; -import org.webrtc.MediaConstraints; -import org.webrtc.PeerConnectionFactory; -import org.webrtc.VideoSource; -import org.webrtc.VideoTrack; +import org.webrtc.*; public class TrackFactory { private final PeerConnectionFactory factory; @@ -13,17 +8,14 @@ public class TrackFactory { factory = pcManager.pcFactory; } - //TODO: Maybe creating sources should be hidden public VideoSource createVideoSource(boolean isScreenCast){ return factory.createVideoSource(isScreenCast); } - //TODO: Maybe creating sources should be hidden public VideoSource createVideoSource(boolean isScreenCast, boolean alignTimestamps){ return factory.createVideoSource(isScreenCast,alignTimestamps); } - //TODO: Maybe creating sources should be hidden public AudioSource createAudioSource(){ return factory.createAudioSource(new MediaConstraints()); } From e59082d1056ca9abb82e8048e1c473fbfc3e9090 Mon Sep 17 00:00:00 2001 From: Dawid Jenczewski Date: Fri, 13 Mar 2026 13:33:09 +0100 Subject: [PATCH 3/5] fix(privmx-endpoint-streams/android): set correct connection type field in JanusSubscriber class constructor --- .../java/privmx_endpoint/modules/stream/JanusSubscriber.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusSubscriber.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusSubscriber.java index 75a6a519..b528070a 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusSubscriber.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/JanusSubscriber.java @@ -12,7 +12,7 @@ public class JanusSubscriber extends JanusConnection{ public JanusSubscriber(PeerConnectionFactory pcFactory, PmxKeyStore keyStore, TrackObserver observer, BiConsumer onTrickle) { - super(pcFactory, keyStore, ConnectionType.Publisher, observer, onTrickle,null); + super(pcFactory, keyStore, ConnectionType.Subscriber, observer, onTrickle,null); } public String createAnswer(String offerSdp, String type) { From 0b953c3ff103c5f323e4ec7b6d5ea72710ed2d5c Mon Sep 17 00:00:00 2001 From: Dawid Jenczewski Date: Fri, 13 Mar 2026 13:34:47 +0100 Subject: [PATCH 4/5] refactor(privmx-endpoint-streams/android): dispose frameCryptors on remove tracks in PcObserver and make fields private final --- .../modules/stream/PcObserver.java | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) 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 c38f839c..6e50275b 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 @@ -22,20 +22,14 @@ import java.util.function.Consumer; import java.util.stream.Collectors; -//TODO: Fix warnings public class PcObserver implements PeerConnection.Observer { - Map frameCryptorMap = new HashMap<>(); - PmxKeyStore keyStore; - private PeerConnectionFactory peerConnectionFactory; - public TrackObserver trackObserver; - - private BiConsumer, RtpReceiver> onAddTrack; - private Consumer onVideoTrack; - - private Consumer onIceCandidate; - private final Map streamIdsByTracks = new HashMap<>(); + private final Map frameCryptorMap = new HashMap<>(); + private final PmxKeyStore keyStore; + private final PeerConnectionFactory peerConnectionFactory; + private final TrackObserver trackObserver; + private final Consumer onIceCandidate; private final Runnable onRenegotiationNeeded; - Consumer onIceConnectionChange; + private final Consumer onIceConnectionChange; public PcObserver( PeerConnectionFactory peerConnectionFactory, @@ -63,14 +57,6 @@ public PcObserver( this(peerConnectionFactory,store,observer,onIceCandidate,onRenegotiationNeeded,null); } - public void setOnAddTrack(BiConsumer, RtpReceiver> onAddTrack) { - this.onAddTrack = onAddTrack; - } - - public void setOnVideoTrack(Consumer onVideoTrack) { - this.onVideoTrack = onVideoTrack; - } - @Override public void onSignalingChange(PeerConnection.SignalingState signalingState) { @@ -146,9 +132,13 @@ public void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams) { @Override public void onRemoveTrack(RtpReceiver receiver) { - //TODO: cleanup track cryptors (?) -// onRemoveTrack.accept(receiver.track()); - receiver.dispose(); + MediaStreamTrack track = receiver.track(); + if(track != null) { + PmxFrameCryptor removedCryptor = frameCryptorMap.remove(track.id()); + if(removedCryptor != null) { + removedCryptor.dispose(); + } + } } public void setFrameCryptorOptions(PmxFrameCryptor.PmxFrameCryptorOptions options) { From 2dc9baf8cd6c404400422b1ee79044024505021b Mon Sep 17 00:00:00 2001 From: Dawid Jenczewski Date: Fri, 13 Mar 2026 13:35:24 +0100 Subject: [PATCH 5/5] refactor(privmx-endpoint-streams/android): remove video capturers from JanusPublisher and make fields private --- .../modules/stream/JanusPublisher.java | 28 ++++--------------- 1 file changed, 5 insertions(+), 23 deletions(-) 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 982e8cf3..b30c8ab6 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 @@ -26,12 +26,10 @@ import java.util.function.Consumer; public class JanusPublisher extends JanusConnection{ - public final Map audioTracks = new HashMap<>(); - public final Map videoTracks = new HashMap<>(); - //TODO: Add videoCapturer to VideoTrackInfo - public final Map videoCapturers = new HashMap<>(); - public final BiConsumer setNewOfferOnReconfigure; - public final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private final Map audioTracks = new HashMap<>(); + private final Map videoTracks = new HashMap<>(); + private final BiConsumer setNewOfferOnReconfigure; + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); public JanusPublisher( @@ -67,10 +65,7 @@ public void addAudioTrack(org.webrtc.AudioTrack audioTrack) { } } - public void addVideoTrack( - org.webrtc.VideoTrack videoTrack, - VideoCapturer videoCapturer - ) { + public void addVideoTrack(org.webrtc.VideoTrack videoTrack) { if (peerConnectionFactory != null) { synchronized (videoTracks) { RtpSender rtpSender = peerConnection.addTrack(videoTrack); @@ -89,17 +84,10 @@ public void addVideoTrack( frameCryptor ) ); - if (videoCapturer != null) { - videoCapturers.put(videoTrack.id(), videoCapturer); - } } } } - public void addVideoTrack(org.webrtc.VideoTrack videoTrack) { - addVideoTrack(videoTrack,null); - } - public void removeAudioTrack(String id) { synchronized (audioTracks) { AudioTrackInfo audioTrackInfo = audioTracks.get(id); @@ -115,7 +103,6 @@ public void removeVideoTrack(String id) { if (videoTrackInfo == null) return; peerConnection.removeTrack(videoTrackInfo.sender); videoTracks.remove(id); - videoCapturers.remove(id); } } @@ -135,17 +122,12 @@ public void setAnswer(String sdp, String type){ peerConnection.setRemoteDescription(new SdpObserver(null),new SessionDescription(SessionDescription.Type.fromCanonicalForm(type),sdp)); } - @Nullable - public VideoCapturer getVideoCapturer(String trackId){ - return videoCapturers.get(trackId); - } @Override public void close() { super.close(); audioTracks.clear(); videoTracks.clear(); - videoCapturers.clear(); } @Override