Allow custom metrics implementations on Android.

BUG=webrtc:6499

Review-Url: https://codereview.webrtc.org/2403463002
Cr-Commit-Position: refs/heads/master@{#15169}
diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn
index 17e3c2a..cefe106 100644
--- a/webrtc/BUILD.gn
+++ b/webrtc/BUILD.gn
@@ -708,7 +708,6 @@
       deps = [
         "//base:base_java_test_support",
         "//webrtc/api:libjingle_peerconnection_java",
-        "//webrtc/api:libjingle_peerconnection_jni",
         "//webrtc/examples:AppRTCMobile_javalib",
       ]
     }
diff --git a/webrtc/api/BUILD.gn b/webrtc/api/BUILD.gn
index 01aacb7..ee64e60 100644
--- a/webrtc/api/BUILD.gn
+++ b/webrtc/api/BUILD.gn
@@ -171,12 +171,12 @@
 
   rtc_static_library("libjingle_peerconnection_jni") {
     sources = [
+      "android/jni/androidhistogram_jni.cc",
       "android/jni/androidmediacodeccommon.h",
       "android/jni/androidmediadecoder_jni.cc",
       "android/jni/androidmediadecoder_jni.h",
       "android/jni/androidmediaencoder_jni.cc",
       "android/jni/androidmediaencoder_jni.h",
-      "android/jni/androidmetrics_jni.cc",
       "android/jni/androidnetworkmonitor_jni.cc",
       "android/jni/androidnetworkmonitor_jni.h",
       "android/jni/androidvideotracksource_jni.cc",
@@ -215,8 +215,6 @@
 
     deps = [
       ":libjingle_peerconnection",
-      "../system_wrappers:field_trial_default",
-      "../system_wrappers:metrics_default",
     ]
 
     if (rtc_build_libyuv) {
@@ -230,6 +228,20 @@
     }
   }
 
+  rtc_static_library("libjingle_peerconnection_metrics_default_jni") {
+    sources = [
+      "android/jni/androidmetrics_jni.cc",
+    ]
+
+    configs += [ ":libjingle_peerconnection_jni_warnings_config" ]
+
+    deps = [
+      ":libjingle_peerconnection",
+      "../system_wrappers:field_trial_default",
+      "../system_wrappers:metrics_default",
+    ]
+  }
+
   rtc_shared_library("libjingle_peerconnection_so") {
     sources = [
       "android/jni/jni_onload.cc",
@@ -240,6 +252,7 @@
     deps = [
       ":libjingle_peerconnection",
       ":libjingle_peerconnection_jni",
+      ":libjingle_peerconnection_metrics_default_jni",
     ]
     output_extension = "so"
   }
@@ -279,6 +292,7 @@
       "android/java/src/org/webrtc/GlShader.java",
       "android/java/src/org/webrtc/GlTextureFrameBuffer.java",
       "android/java/src/org/webrtc/GlUtil.java",
+      "android/java/src/org/webrtc/Histogram.java",
       "android/java/src/org/webrtc/IceCandidate.java",
       "android/java/src/org/webrtc/MediaCodecVideoDecoder.java",
       "android/java/src/org/webrtc/MediaCodecVideoEncoder.java",
@@ -286,7 +300,6 @@
       "android/java/src/org/webrtc/MediaSource.java",
       "android/java/src/org/webrtc/MediaStream.java",
       "android/java/src/org/webrtc/MediaStreamTrack.java",
-      "android/java/src/org/webrtc/Metrics.java",
       "android/java/src/org/webrtc/NetworkMonitor.java",
       "android/java/src/org/webrtc/NetworkMonitorAutoDetect.java",
       "android/java/src/org/webrtc/PeerConnection.java",
@@ -316,6 +329,14 @@
       "../base:base_java",
     ]
   }
+
+  android_library("libjingle_peerconnection_metrics_default_java") {
+    java_files = [ "android/java/src/org/webrtc/Metrics.java" ]
+
+    deps = [
+      "//webrtc/base:base_java",
+    ]
+  }
 }
 
 rtc_source_set("rtc_stats_api") {
@@ -485,6 +506,7 @@
 
       deps = [
         ":libjingle_peerconnection_java",
+        ":libjingle_peerconnection_metrics_default_java",
         "../base:base_java",
         "//base:base_java",
       ]
diff --git a/webrtc/api/android/java/src/org/webrtc/Camera1Session.java b/webrtc/api/android/java/src/org/webrtc/Camera1Session.java
index 6ff9c8a..8f29886 100644
--- a/webrtc/api/android/java/src/org/webrtc/Camera1Session.java
+++ b/webrtc/api/android/java/src/org/webrtc/Camera1Session.java
@@ -20,7 +20,6 @@
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Metrics.Histogram;
 
 @SuppressWarnings("deprecation")
 public class Camera1Session implements CameraSession {
diff --git a/webrtc/api/android/java/src/org/webrtc/Camera2Session.java b/webrtc/api/android/java/src/org/webrtc/Camera2Session.java
index 3734860..2552b24 100644
--- a/webrtc/api/android/java/src/org/webrtc/Camera2Session.java
+++ b/webrtc/api/android/java/src/org/webrtc/Camera2Session.java
@@ -29,7 +29,6 @@
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Metrics.Histogram;
 
 @TargetApi(21)
 public class Camera2Session implements CameraSession {
diff --git a/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java b/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java
index c5cdcf7d..de2b919 100644
--- a/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java
+++ b/webrtc/api/android/java/src/org/webrtc/CameraEnumerationAndroid.java
@@ -18,7 +18,6 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import org.webrtc.Metrics.Histogram;
 
 @SuppressWarnings("deprecation")
 public class CameraEnumerationAndroid {
diff --git a/webrtc/api/android/java/src/org/webrtc/Histogram.java b/webrtc/api/android/java/src/org/webrtc/Histogram.java
new file mode 100644
index 0000000..8779861
--- /dev/null
+++ b/webrtc/api/android/java/src/org/webrtc/Histogram.java
@@ -0,0 +1,44 @@
+/*
+ *  Copyright 2016 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;
+
+/**
+ * Class for holding the native pointer of a histogram. Since there is no way to destroy a
+ * histogram, please don't create unnecessary instances of this object. This class is thread safe.
+ *
+ * Usage example:
+ * private static final Histogram someMetricHistogram =
+ *     Histogram.createCounts("WebRTC.Video.SomeMetric", 1, 10000, 50);
+ * someMetricHistogram.addSample(someVariable);
+ */
+class Histogram {
+  private final long handle;
+
+  private Histogram(long handle) {
+    this.handle = handle;
+  }
+
+  static public Histogram createCounts(String name, int min, int max, int bucketCount) {
+    return new Histogram(nativeCreateCounts(name, min, max, bucketCount));
+  }
+
+  static public Histogram createEnumeration(String name, int max) {
+    return new Histogram(nativeCreateEnumeration(name, max));
+  }
+
+  public void addSample(int sample) {
+    nativeAddSample(handle, sample);
+  }
+
+  private static native long nativeCreateCounts(String name, int min, int max, int bucketCount);
+  private static native long nativeCreateEnumeration(String name, int max);
+  private static native void nativeAddSample(long handle, int sample);
+}
diff --git a/webrtc/api/android/java/src/org/webrtc/Metrics.java b/webrtc/api/android/java/src/org/webrtc/Metrics.java
index 7d715fb..ca19489 100644
--- a/webrtc/api/android/java/src/org/webrtc/Metrics.java
+++ b/webrtc/api/android/java/src/org/webrtc/Metrics.java
@@ -59,41 +59,6 @@
     }
   }
 
-  /**
-   * Class for holding the native pointer of a histogram. Since there is no way to destroy a
-   * histogram, please don't create unnecessary instances of this object. This class is thread safe.
-   *
-   * Usage example:
-   * private static final Histogram someMetricHistogram =
-   *     Histogram.createCounts("WebRTC.Video.SomeMetric", 1, 10000, 50);
-   * someMetricHistogram.addSample(someVariable);
-   */
-  static class Histogram {
-    private final long handle;
-    private final String name; // Only used for logging.
-
-    private Histogram(long handle, String name) {
-      this.handle = handle;
-      this.name = name;
-    }
-
-    static public Histogram createCounts(String name, int min, int max, int bucketCount) {
-      return new Histogram(nativeCreateCounts(name, min, max, bucketCount), name);
-    }
-
-    static public Histogram createEnumeration(String name, int max) {
-      return new Histogram(nativeCreateEnumeration(name, max), name);
-    }
-
-    public void addSample(int sample) {
-      nativeAddSample(handle, sample);
-    }
-
-    private static native long nativeCreateCounts(String name, int min, int max, int bucketCount);
-    private static native long nativeCreateEnumeration(String name, int max);
-    private static native void nativeAddSample(long handle, int sample);
-  }
-
   private void add(String name, HistogramInfo info) {
     map.put(name, info);
   }
diff --git a/webrtc/api/android/java/src/org/webrtc/OWNERS b/webrtc/api/android/java/src/org/webrtc/OWNERS
index 38f3f6f..e6ccc2d 100644
--- a/webrtc/api/android/java/src/org/webrtc/OWNERS
+++ b/webrtc/api/android/java/src/org/webrtc/OWNERS
@@ -1,2 +1,3 @@
 per-file Camera*=sakal@webrtc.org
+per-file Histogram.java=sakal@webrtc.org
 per-file Metrics.java=sakal@webrtc.org
diff --git a/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java b/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java
index 08c5c13..da32eb5 100644
--- a/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java
+++ b/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java
@@ -24,7 +24,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.Metrics.Histogram;
 
 // Android specific implementation of VideoCapturer.
 // An instance of this class can be created by an application using
diff --git a/webrtc/api/android/jni/OWNERS b/webrtc/api/android/jni/OWNERS
index 96da1b9..4da3451 100644
--- a/webrtc/api/android/jni/OWNERS
+++ b/webrtc/api/android/jni/OWNERS
@@ -1,2 +1,3 @@
+per-file androidhistogram_jni.cc=sakal@webrtc.org
 per-file androidmetrics_jni.cc=sakal@webrtc.org
 per-file androidvideotracksource_jni.cc=sakal@webrtc.org
diff --git a/webrtc/api/android/jni/androidhistogram_jni.cc b/webrtc/api/android/jni/androidhistogram_jni.cc
new file mode 100644
index 0000000..9ccd2b7
--- /dev/null
+++ b/webrtc/api/android/jni/androidhistogram_jni.cc
@@ -0,0 +1,44 @@
+/*
+ *  Copyright 2016 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.
+ */
+
+#include <map>
+#include <memory>
+
+#include "webrtc/api/android/jni/classreferenceholder.h"
+#include "webrtc/api/android/jni/jni_helpers.h"
+#include "webrtc/api/android/jni/native_handle_impl.h"
+#include "webrtc/system_wrappers/include/metrics.h"
+
+// Enables collection of native histograms and creating them.
+namespace webrtc_jni {
+
+JOW(jlong, Histogram_nativeCreateCounts)
+(JNIEnv* jni, jclass, jstring j_name, jint min, jint max, jint buckets) {
+  std::string name = JavaToStdString(jni, j_name);
+  return jlongFromPointer(
+      webrtc::metrics::HistogramFactoryGetCounts(name, min, max, buckets));
+}
+
+JOW(jlong, Histogram_nativeCreateEnumeration)
+(JNIEnv* jni, jclass, jstring j_name, jint max) {
+  std::string name = JavaToStdString(jni, j_name);
+  return jlongFromPointer(
+      webrtc::metrics::HistogramFactoryGetEnumeration(name, max));
+}
+
+JOW(void, Histogram_nativeAddSample)
+(JNIEnv* jni, jclass, jlong histogram, jint sample) {
+  if (histogram) {
+    HistogramAdd(reinterpret_cast<webrtc::metrics::Histogram*>(histogram),
+                 sample);
+  }
+}
+
+}  // namespace webrtc_jni
diff --git a/webrtc/api/android/jni/androidmetrics_jni.cc b/webrtc/api/android/jni/androidmetrics_jni.cc
index f63e604..62efc1b 100644
--- a/webrtc/api/android/jni/androidmetrics_jni.cc
+++ b/webrtc/api/android/jni/androidmetrics_jni.cc
@@ -13,7 +13,6 @@
 
 #include "webrtc/api/android/jni/classreferenceholder.h"
 #include "webrtc/api/android/jni/jni_helpers.h"
-#include "webrtc/api/android/jni/native_handle_impl.h"
 #include "webrtc/system_wrappers/include/metrics.h"
 #include "webrtc/system_wrappers/include/metrics_default.h"
 
@@ -26,11 +25,11 @@
 
 // Gets and clears native histograms.
 JOW(jobject, Metrics_nativeGetAndReset)(JNIEnv* jni, jclass) {
-  jclass j_metrics_class = FindClass(jni, "org/webrtc/Metrics");
+  jclass j_metrics_class = jni->FindClass("org/webrtc/Metrics");
   jmethodID j_add =
       GetMethodID(jni, j_metrics_class, "add",
                   "(Ljava/lang/String;Lorg/webrtc/Metrics$HistogramInfo;)V");
-  jclass j_info_class = FindClass(jni, "org/webrtc/Metrics$HistogramInfo");
+  jclass j_info_class = jni->FindClass("org/webrtc/Metrics$HistogramInfo");
   jmethodID j_add_sample = GetMethodID(jni, j_info_class, "addSample", "(II)V");
 
   // Create |Metrics|.
@@ -59,26 +58,4 @@
   return j_metrics;
 }
 
-JOW(jlong, Metrics_00024Histogram_nativeCreateCounts)
-(JNIEnv* jni, jclass, jstring j_name, jint min, jint max, jint buckets) {
-  std::string name = JavaToStdString(jni, j_name);
-  return jlongFromPointer(
-      webrtc::metrics::HistogramFactoryGetCounts(name, min, max, buckets));
-}
-
-JOW(jlong, Metrics_00024Histogram_nativeCreateEnumeration)
-(JNIEnv* jni, jclass, jstring j_name, jint max) {
-  std::string name = JavaToStdString(jni, j_name);
-  return jlongFromPointer(
-      webrtc::metrics::HistogramFactoryGetEnumeration(name, max));
-}
-
-JOW(void, Metrics_00024Histogram_nativeAddSample)
-(JNIEnv* jni, jclass, jlong histogram, jint sample) {
-  if (histogram) {
-    HistogramAdd(reinterpret_cast<webrtc::metrics::Histogram*>(histogram),
-                 sample);
-  }
-}
-
 }  // namespace webrtc_jni
diff --git a/webrtc/api/android/jni/classreferenceholder.cc b/webrtc/api/android/jni/classreferenceholder.cc
index bfc03a3..ee68112 100644
--- a/webrtc/api/android/jni/classreferenceholder.cc
+++ b/webrtc/api/android/jni/classreferenceholder.cc
@@ -69,8 +69,6 @@
   LoadClass(jni, "org/webrtc/MediaSource$State");
   LoadClass(jni, "org/webrtc/MediaStream");
   LoadClass(jni, "org/webrtc/MediaStreamTrack$State");
-  LoadClass(jni, "org/webrtc/Metrics");
-  LoadClass(jni, "org/webrtc/Metrics$HistogramInfo");
   LoadClass(jni, "org/webrtc/NetworkMonitor");
   LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$ConnectionType");
   LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$IPAddress");
diff --git a/webrtc/examples/BUILD.gn b/webrtc/examples/BUILD.gn
index 58ae8a4..d419d94 100644
--- a/webrtc/examples/BUILD.gn
+++ b/webrtc/examples/BUILD.gn
@@ -93,6 +93,7 @@
     deps = [
       ":AppRTCMobile_resources",
       "//webrtc/api:libjingle_peerconnection_java",
+      "//webrtc/api:libjingle_peerconnection_metrics_default_java",
       "//webrtc/base:base_java",
       "//webrtc/examples/androidapp/third_party/autobanh:autobanh_java",
     ]