Skip to content

Commit bedfd27

Browse files
feat: bridge OnIceSelectedCandidatePairChanged to Java observers (#247)
1 parent f531fa6 commit bedfd27

3 files changed

Lines changed: 41 additions & 0 deletions

File tree

‎webrtc-jni/src/main/cpp/include/api/PeerConnectionObserver.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ namespace jni
4747
void OnIceCandidateError(const std::string & address, int port, const std::string & url, int error_code, const std::string & error_text) override;
4848
void OnIceCandidatesRemoved(const std::vector<webrtc::Candidate> & candidates) override;
4949
void OnIceConnectionReceivingChange(bool receiving) override;
50+
void OnIceSelectedCandidatePairChanged(const webrtc::CandidatePairChangeEvent & event) override;
5051

5152
private:
5253
class JavaPeerConnectionObserverClass : public JavaClass
@@ -67,6 +68,7 @@ namespace jni
6768
jmethodID onIceCandidateError;
6869
jmethodID onIceCandidatesRemoved;
6970
jmethodID onIceConnectionReceivingChange;
71+
jmethodID onSelectedCandidatePairChanged;
7072
};
7173

7274
private:

‎webrtc-jni/src/main/cpp/src/api/PeerConnectionObserver.cpp‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "JavaEnums.h"
2525
#include "JavaFactories.h"
2626
#include "JavaRuntimeException.h"
27+
#include "JavaString.h"
2728
#include "JavaUtils.h"
2829
#include "JNI_WebRTC.h"
2930

@@ -193,6 +194,27 @@ namespace jni
193194
ExceptionCheck(env);
194195
}
195196

197+
void PeerConnectionObserver::OnIceSelectedCandidatePairChanged(const webrtc::CandidatePairChangeEvent & event)
198+
{
199+
JNIEnv * env = AttachCurrentThread();
200+
201+
const webrtc::Candidate & remote = event.selected_candidate_pair.remote_candidate();
202+
203+
std::string ip = remote.address().ipaddr().ToString();
204+
int port = remote.address().port();
205+
206+
const auto typeName = remote.type_name();
207+
std::string type(typeName.data(), typeName.size());
208+
209+
JavaLocalRef<jstring> jAddress = JavaString::toJava(env, ip);
210+
JavaLocalRef<jstring> jType = JavaString::toJava(env, type);
211+
212+
env->CallVoidMethod(observer, javaClass->onSelectedCandidatePairChanged,
213+
jAddress.get(), static_cast<jint>(port), jType.get());
214+
215+
ExceptionCheck(env);
216+
}
217+
196218
PeerConnectionObserver::JavaPeerConnectionObserverClass::JavaPeerConnectionObserverClass(JNIEnv * env)
197219
{
198220
jclass cls = FindClass(env, PKG"PeerConnectionObserver");
@@ -210,5 +232,6 @@ namespace jni
210232
onIceCandidateError = GetMethod(env, cls, "onIceCandidateError", "(L" PKG "RTCPeerConnectionIceErrorEvent;)V");
211233
onIceCandidatesRemoved = GetMethod(env, cls, "onIceCandidatesRemoved", "([L" PKG "RTCIceCandidate;)V");
212234
onIceConnectionReceivingChange = GetMethod(env, cls, "onIceConnectionReceivingChange", "(Z)V");
235+
onSelectedCandidatePairChanged = GetMethod(env, cls, "onSelectedCandidatePairChanged", "(Ljava/lang/String;ILjava/lang/String;)V");
213236
}
214237
}

‎webrtc/src/main/java/dev/onvoid/webrtc/PeerConnectionObserver.java‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,20 @@ default void onRemoveTrack(RTCRtpReceiver receiver) {
170170
default void onTrack(RTCRtpTransceiver transceiver) {
171171
}
172172

173+
/**
174+
* ICE has selected (or later re-selected) a candidate pair for this
175+
* connection. Fires once connectivity checks nominate a pair, which is
176+
* before DTLS and SCTP are established and before data channels open, so
177+
* the remote transport address is known before the connection becomes
178+
* usable. May fire again if ICE re-nominates mid session.
179+
*
180+
* @param remoteAddress The remote candidate's IP address. For a relayed
181+
* connection this is the TURN relay's address.
182+
* @param remotePort The remote candidate's port.
183+
* @param candidateType The remote candidate type: "host", "srflx",
184+
* "prflx", or "relay".
185+
*/
186+
default void onSelectedCandidatePairChanged(String remoteAddress, int remotePort, String candidateType) {
187+
}
188+
173189
}

0 commit comments

Comments
 (0)