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