Add new PeerConnection APIs to the Java SDK.

This adds wrappers to the following native APIs:
- SdpSemantics enum added to the RTCConfiguration
- RtpTransceiver
- PeerConnection.addTrack
- PeerConnection.removeTrack
- PeerConnection.addTransceiver
- PeerConnection.getTransceivers
These APIs are used with the new Unified Plan semantics.

Bug: webrtc:8869
Change-Id: I19443f3ff7ffc91a139ad8276331f09e57cec554
Reviewed-on: https://webrtc-review.googlesource.com/57800
Commit-Queue: Seth Hampson <shampson@webrtc.org>
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22317}
diff --git a/sdk/android/api/org/webrtc/RtpTransceiver.java b/sdk/android/api/org/webrtc/RtpTransceiver.java
new file mode 100644
index 0000000..d77ecb4
--- /dev/null
+++ b/sdk/android/api/org/webrtc/RtpTransceiver.java
@@ -0,0 +1,215 @@
+/*
+ *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+package org.webrtc;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.webrtc.RtpParameters.Encoding;
+
+/**
+ * Java wrapper for a C++ RtpTransceiverInterface.
+ *
+ * <p>The RTCRtpTransceiver maps to the RTCRtpTransceiver defined by the WebRTC
+ * specification. A transceiver represents a combination of an RTCRtpSender
+ * and an RTCRtpReceiver that share a common mid. As defined in JSEP, an
+ * RTCRtpTransceiver is said to be associated with a media description if its
+ * mid property is non-nil; otherwise, it is said to be disassociated.
+ * JSEP: https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-24
+ *
+ * <p>Note that RTCRtpTransceivers are only supported when using
+ * RTCPeerConnection with Unified Plan SDP.
+ *
+ * <p>WebRTC specification for RTCRtpTransceiver, the JavaScript analog:
+ * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver
+ */
+@JNINamespace("webrtc::jni")
+public class RtpTransceiver {
+  /** Java version of webrtc::RtpTransceiverDirection - the ordering must be kept in sync. */
+  public enum RtpTransceiverDirection {
+    SEND_RECV(0),
+    SEND_ONLY(1),
+    RECV_ONLY(2),
+    INACTIVE(3);
+
+    private final int nativeIndex;
+
+    private RtpTransceiverDirection(int nativeIndex) {
+      this.nativeIndex = nativeIndex;
+    }
+
+    @CalledByNative("RtpTransceiverDirection")
+    int getNativeIndex() {
+      return nativeIndex;
+    }
+
+    @CalledByNative("RtpTransceiverDirection")
+    static RtpTransceiverDirection fromNativeIndex(int nativeIndex) {
+      for (RtpTransceiverDirection type : RtpTransceiverDirection.values()) {
+        if (type.getNativeIndex() == nativeIndex) {
+          return type;
+        }
+      }
+      throw new IllegalArgumentException(
+          "Uknown native RtpTransceiverDirection type" + nativeIndex);
+    }
+  }
+
+  /**
+   * Tracks webrtc::RtpTransceiverInit. https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiverinit
+   * A structure for initializing an RtpTransceiver in a call to addTransceiver.
+   * Note: This does not contain a list of encoding parameters, because they are currently
+   * not being used natively.
+   */
+  public static final class RtpTransceiverInit {
+    private final RtpTransceiverDirection direction;
+    private final List<String> streamIds;
+
+    public RtpTransceiverInit() {
+      this(RtpTransceiverDirection.SEND_RECV);
+    }
+
+    public RtpTransceiverInit(RtpTransceiverDirection direction) {
+      this(direction, Collections.emptyList());
+    }
+
+    public RtpTransceiverInit(RtpTransceiverDirection direction, List<String> streamIds) {
+      this.direction = direction;
+      this.streamIds = new ArrayList<String>(streamIds);
+    }
+
+    @CalledByNative("RtpTransceiverInit")
+    int getDirectionNativeIndex() {
+      return direction.getNativeIndex();
+    }
+
+    @CalledByNative("RtpTransceiverInit")
+    List<String> getStreamIds() {
+      return new ArrayList<String>(this.streamIds);
+    }
+  }
+
+  private final long nativeRtpTransceiver;
+  private RtpSender cachedSender;
+  private RtpReceiver cachedReceiver;
+
+  @CalledByNative
+  protected RtpTransceiver(long nativeRtpTransceiver) {
+    this.nativeRtpTransceiver = nativeRtpTransceiver;
+    cachedSender = nativeGetSender(nativeRtpTransceiver);
+    cachedReceiver = nativeGetReceiver(nativeRtpTransceiver);
+  }
+
+  /**
+   * Media type of the transceiver. Any sender(s)/receiver(s) will have this
+   * type as well.
+   */
+  public MediaStreamTrack.MediaType getMediaType() {
+    return nativeGetMediaType(nativeRtpTransceiver);
+  }
+
+  /**
+   * The mid attribute is the mid negotiated and present in the local and
+   * remote descriptions. Before negotiation is complete, the mid value may be
+   * null. After rollbacks, the value may change from a non-null value to null.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-mid
+   */
+  public String getMid() {
+    return nativeGetMid(nativeRtpTransceiver);
+  }
+
+  /**
+   * The sender attribute exposes the RtpSender corresponding to the RTP media
+   * that may be sent with the transceiver's mid. The sender is always present,
+   * regardless of the direction of media.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-sender
+   */
+  public RtpSender getSender() {
+    return cachedSender;
+  }
+
+  /**
+   * The receiver attribute exposes the RtpReceiver corresponding to the RTP
+   * media that may be received with the transceiver's mid. The receiver is
+   * always present, regardless of the direction of media.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-receiver
+   */
+  public RtpReceiver getReceiver() {
+    return cachedReceiver;
+  }
+
+  /**
+   * The stopped attribute indicates that the sender of this transceiver will no
+   * longer send, and that the receiver will no longer receive. It is true if
+   * either stop has been called or if setting the local or remote description
+   * has caused the RtpTransceiver to be stopped.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-stopped
+   */
+  public boolean isStopped() {
+    return nativeStopped(nativeRtpTransceiver);
+  }
+
+  /**
+   * The direction attribute indicates the preferred direction of this
+   * transceiver, which will be used in calls to CreateOffer and CreateAnswer.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-direction
+   */
+  public RtpTransceiverDirection getDirection() {
+    return nativeDirection(nativeRtpTransceiver);
+  }
+
+  /**
+   * The current_direction attribute indicates the current direction negotiated
+   * for this transceiver. If this transceiver has never been represented in an
+   * offer/answer exchange, or if the transceiver is stopped, the value is null.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-currentdirection
+   */
+  public RtpTransceiverDirection getCurrentDirection() {
+    return nativeCurrentDirection(nativeRtpTransceiver);
+  }
+
+  /**
+   * Sets the preferred direction of this transceiver. An update of
+   * directionality does not take effect immediately. Instead, future calls to
+   * CreateOffer and CreateAnswer mark the corresponding media descriptions as
+   * sendrecv, sendonly, recvonly, or inactive.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-direction
+   */
+  public void setDirection(RtpTransceiverDirection rtpTransceiverDirection) {
+    nativeSetDirection(nativeRtpTransceiver, rtpTransceiverDirection);
+  }
+
+  /**
+   * The Stop method irreversibly stops the RtpTransceiver. The sender of this
+   * transceiver will no longer send, the receiver will no longer receive.
+   * https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-stop
+   */
+  public void stop() {
+    nativeStop(nativeRtpTransceiver);
+  }
+
+  public void dispose() {
+    cachedSender.dispose();
+    cachedReceiver.dispose();
+    JniCommon.nativeReleaseRef(nativeRtpTransceiver);
+  }
+
+  private static native MediaStreamTrack.MediaType nativeGetMediaType(long rtpTransceiver);
+  private static native String nativeGetMid(long rtpTransceiver);
+  private static native RtpSender nativeGetSender(long rtpTransceiver);
+  private static native RtpReceiver nativeGetReceiver(long rtpTransceiver);
+  private static native boolean nativeStopped(long rtpTransceiver);
+  private static native RtpTransceiverDirection nativeDirection(long rtpTransceiver);
+  private static native RtpTransceiverDirection nativeCurrentDirection(long rtpTransceiver);
+  private static native void nativeStop(long rtpTransceiver);
+  private static native void nativeSetDirection(
+      long rtpTransceiver, RtpTransceiverDirection rtpTransceiverDirection);
+}