p2p_transport_channel: Add estimated disconnected time to CandidatePairChangeEvent

This patch adds a computed estimate on how long the ice stack
was disconnected before switching to a new connection.

The metric is currently computed as now - max(connection->last_data_recevied())
and has resonably good precision.

Bug: webrtc:11862
Change-Id: I8950d55f0eadcf164de089cdb715b4f7eed0a4c3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/182002
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Jonas Oreland <jonaso@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31969}
diff --git a/sdk/android/api/org/webrtc/CandidatePairChangeEvent.java b/sdk/android/api/org/webrtc/CandidatePairChangeEvent.java
index 395b629..b8e6685 100644
--- a/sdk/android/api/org/webrtc/CandidatePairChangeEvent.java
+++ b/sdk/android/api/org/webrtc/CandidatePairChangeEvent.java
@@ -20,12 +20,20 @@
   public final int lastDataReceivedMs;
   public final String reason;
 
+  /**
+   * An estimate from the ICE stack on how long it was disconnected before
+   * changing to the new candidate pair in this event.
+   * The first time an candidate pair is signaled the value will be 0.
+   */
+  public final int estimatedDisconnectedTimeMs;
+
   @CalledByNative
-  CandidatePairChangeEvent(
-      IceCandidate local, IceCandidate remote, int lastDataReceivedMs, String reason) {
+  CandidatePairChangeEvent(IceCandidate local, IceCandidate remote, int lastDataReceivedMs,
+      String reason, int estimatedDisconnectedTimeMs) {
     this.local = local;
     this.remote = remote;
     this.lastDataReceivedMs = lastDataReceivedMs;
     this.reason = reason;
+    this.estimatedDisconnectedTimeMs = estimatedDisconnectedTimeMs;
   }
 }
diff --git a/sdk/android/src/jni/pc/peer_connection.cc b/sdk/android/src/jni/pc/peer_connection.cc
index 1165333..6706782 100644
--- a/sdk/android/src/jni/pc/peer_connection.cc
+++ b/sdk/android/src/jni/pc/peer_connection.cc
@@ -128,7 +128,8 @@
       env, NativeToJavaCandidate(env, selected_pair.local_candidate()),
       NativeToJavaCandidate(env, selected_pair.remote_candidate()),
       static_cast<int>(event.last_data_received_ms),
-      NativeToJavaString(env, event.reason));
+      NativeToJavaString(env, event.reason),
+      static_cast<int>(event.estimated_disconnected_time_ms));
 }
 
 }  // namespace