Expose setLocalDescription() in SDK for Android.
Parameterless sLD is part of perfect negotiation algo.
Bug: webrtc:12609
Change-Id: I13a6b0bf29db8b4e984da9b2645f9bfdb23e074c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/212605
Reviewed-by: Xavier Lepaul‎ <xalep@webrtc.org>
Commit-Queue: Yura Yaroshevich <yura.yaroshevich@gmail.com>
Cr-Commit-Position: refs/heads/master@{#33641}
diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java
index 97c7e77..d998f00 100644
--- a/sdk/android/api/org/webrtc/PeerConnection.java
+++ b/sdk/android/api/org/webrtc/PeerConnection.java
@@ -883,6 +883,10 @@
nativeCreateAnswer(observer, constraints);
}
+ public void setLocalDescription(SdpObserver observer) {
+ nativeSetLocalDescriptionAutomatically(observer);
+ }
+
public void setLocalDescription(SdpObserver observer, SessionDescription sdp) {
nativeSetLocalDescription(observer, sdp);
}
@@ -1272,6 +1276,7 @@
private native DataChannel nativeCreateDataChannel(String label, DataChannel.Init init);
private native void nativeCreateOffer(SdpObserver observer, MediaConstraints constraints);
private native void nativeCreateAnswer(SdpObserver observer, MediaConstraints constraints);
+ private native void nativeSetLocalDescriptionAutomatically(SdpObserver observer);
private native void nativeSetLocalDescription(SdpObserver observer, SessionDescription sdp);
private native void nativeSetRemoteDescription(SdpObserver observer, SessionDescription sdp);
private native void nativeRestartIce();
diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc
index 106d6d1..be1cddd 100644
--- a/sdk/android/src/jni/pc/peer_connection.cc
+++ b/sdk/android/src/jni/pc/peer_connection.cc
@@ -571,15 +571,24 @@
ExtractNativePC(jni, j_pc)->CreateAnswer(observer, options);
}
+static void JNI_PeerConnection_SetLocalDescriptionAutomatically(
+ JNIEnv* jni,
+ const JavaParamRef<jobject>& j_pc,
+ const JavaParamRef<jobject>& j_observer) {
+ rtc::scoped_refptr<SetLocalSdpObserverJni> observer(
+ new rtc::RefCountedObject<SetLocalSdpObserverJni>(jni, j_observer));
+ ExtractNativePC(jni, j_pc)->SetLocalDescription(observer);
+}
+
static void JNI_PeerConnection_SetLocalDescription(
JNIEnv* jni,
const JavaParamRef<jobject>& j_pc,
const JavaParamRef<jobject>& j_observer,
const JavaParamRef<jobject>& j_sdp) {
- rtc::scoped_refptr<SetSdpObserverJni> observer(
- new rtc::RefCountedObject<SetSdpObserverJni>(jni, j_observer, nullptr));
+ rtc::scoped_refptr<SetLocalSdpObserverJni> observer(
+ new rtc::RefCountedObject<SetLocalSdpObserverJni>(jni, j_observer));
ExtractNativePC(jni, j_pc)->SetLocalDescription(
- observer, JavaToNativeSessionDescription(jni, j_sdp).release());
+ JavaToNativeSessionDescription(jni, j_sdp), observer);
}
static void JNI_PeerConnection_SetRemoteDescription(
@@ -587,10 +596,10 @@
const JavaParamRef<jobject>& j_pc,
const JavaParamRef<jobject>& j_observer,
const JavaParamRef<jobject>& j_sdp) {
- rtc::scoped_refptr<SetSdpObserverJni> observer(
- new rtc::RefCountedObject<SetSdpObserverJni>(jni, j_observer, nullptr));
+ rtc::scoped_refptr<SetRemoteSdpObserverJni> observer(
+ new rtc::RefCountedObject<SetRemoteSdpObserverJni>(jni, j_observer));
ExtractNativePC(jni, j_pc)->SetRemoteDescription(
- observer, JavaToNativeSessionDescription(jni, j_sdp).release());
+ JavaToNativeSessionDescription(jni, j_sdp), observer);
}
static void JNI_PeerConnection_RestartIce(JNIEnv* jni,
diff --git a/sdk/android/src/jni/pc/sdp_observer.cc b/sdk/android/src/jni/pc/sdp_observer.cc
index d1842a3..c8b4345 100644
--- a/sdk/android/src/jni/pc/sdp_observer.cc
+++ b/sdk/android/src/jni/pc/sdp_observer.cc
@@ -47,24 +47,34 @@
NativeToJavaString(env, error.message()));
}
-SetSdpObserverJni::SetSdpObserverJni(
+SetLocalSdpObserverJni::SetLocalSdpObserverJni(
JNIEnv* env,
- const JavaRef<jobject>& j_observer,
- std::unique_ptr<MediaConstraints> constraints)
- : j_observer_global_(env, j_observer),
- constraints_(std::move(constraints)) {}
+ const JavaRef<jobject>& j_observer)
+ : j_observer_global_(env, j_observer) {}
-SetSdpObserverJni::~SetSdpObserverJni() = default;
-
-void SetSdpObserverJni::OnSuccess() {
+void SetLocalSdpObserverJni::OnSetLocalDescriptionComplete(RTCError error) {
JNIEnv* env = AttachCurrentThreadIfNeeded();
- Java_SdpObserver_onSetSuccess(env, j_observer_global_);
+ if (error.ok()) {
+ Java_SdpObserver_onSetSuccess(env, j_observer_global_);
+ } else {
+ Java_SdpObserver_onSetFailure(env, j_observer_global_,
+ NativeToJavaString(env, error.message()));
+ }
}
-void SetSdpObserverJni::OnFailure(webrtc::RTCError error) {
+SetRemoteSdpObserverJni::SetRemoteSdpObserverJni(
+ JNIEnv* env,
+ const JavaRef<jobject>& j_observer)
+ : j_observer_global_(env, j_observer) {}
+
+void SetRemoteSdpObserverJni::OnSetRemoteDescriptionComplete(RTCError error) {
JNIEnv* env = AttachCurrentThreadIfNeeded();
- Java_SdpObserver_onSetFailure(env, j_observer_global_,
- NativeToJavaString(env, error.message()));
+ if (error.ok()) {
+ Java_SdpObserver_onSetSuccess(env, j_observer_global_);
+ } else {
+ Java_SdpObserver_onSetFailure(env, j_observer_global_,
+ NativeToJavaString(env, error.message()));
+ }
}
} // namespace jni
diff --git a/sdk/android/src/jni/pc/sdp_observer.h b/sdk/android/src/jni/pc/sdp_observer.h
index 68ded76..b33a301 100644
--- a/sdk/android/src/jni/pc/sdp_observer.h
+++ b/sdk/android/src/jni/pc/sdp_observer.h
@@ -39,21 +39,28 @@
std::unique_ptr<MediaConstraints> constraints_;
};
-class SetSdpObserverJni : public SetSessionDescriptionObserver {
+class SetLocalSdpObserverJni : public SetLocalDescriptionObserverInterface {
public:
- SetSdpObserverJni(JNIEnv* env,
- const JavaRef<jobject>& j_observer,
- std::unique_ptr<MediaConstraints> constraints);
- ~SetSdpObserverJni() override;
+ SetLocalSdpObserverJni(JNIEnv* env, const JavaRef<jobject>& j_observer);
- MediaConstraints* constraints() { return constraints_.get(); }
+ ~SetLocalSdpObserverJni() override = default;
- void OnSuccess() override;
- void OnFailure(RTCError error) override;
+ virtual void OnSetLocalDescriptionComplete(RTCError error) override;
private:
const ScopedJavaGlobalRef<jobject> j_observer_global_;
- std::unique_ptr<MediaConstraints> constraints_;
+};
+
+class SetRemoteSdpObserverJni : public SetRemoteDescriptionObserverInterface {
+ public:
+ SetRemoteSdpObserverJni(JNIEnv* env, const JavaRef<jobject>& j_observer);
+
+ ~SetRemoteSdpObserverJni() override = default;
+
+ virtual void OnSetRemoteDescriptionComplete(RTCError error) override;
+
+ private:
+ const ScopedJavaGlobalRef<jobject> j_observer_global_;
};
} // namespace jni