diff --git a/webrtc/tools/network_tester/BUILD.gn b/webrtc/tools/network_tester/BUILD.gn
index 1ba87ac957..1e290f60cf 100644
--- a/webrtc/tools/network_tester/BUILD.gn
+++ b/webrtc/tools/network_tester/BUILD.gn
@@ -112,3 +112,57 @@ if (rtc_enable_protobuf) {
}
}
}
+
+if (is_android) {
+ android_apk("NetworkTesterMobile") {
+ testonly = true
+ apk_name = "NetworkTesterMobile"
+ android_manifest = "androidapp/AndroidManifest.xml"
+
+ deps = [
+ ":NetworkTesterMobile_javalib",
+ ":NetworkTesterMobile_resources",
+ "//base:base_java",
+ "//webrtc/base:base_java",
+ ]
+
+ shared_libraries = [ "//webrtc/tools/network_tester:network_tester_so" ]
+ }
+
+ android_library("NetworkTesterMobile_javalib") {
+ testonly = true
+ android_manifest = "androidapp/AndroidManifest.xml"
+
+ java_files = [
+ "androidapp/src/com/google/media/networktester/MainActivity.java",
+ "androidapp/src/com/google/media/networktester/NetworkTester.java",
+ ]
+
+ deps = [
+ ":NetworkTesterMobile_resources",
+ "//webrtc/base:base_java",
+ ]
+ }
+
+ android_resources("NetworkTesterMobile_resources") {
+ testonly = true
+ resource_dirs = [ "androidapp/res" ]
+ custom_package = "com.google.media.networktester"
+ }
+
+ rtc_shared_library("network_tester_so") {
+ sources = [
+ "jni.cpp",
+ ]
+
+ deps = [
+ ":network_tester",
+ "../../system_wrappers:field_trial_default",
+ ]
+
+ suppressed_configs += [ "//build/config/android:hide_all_but_jni_onload" ]
+ configs += [ "//build/config/android:hide_all_but_jni" ]
+
+ output_extension = "so"
+ }
+}
diff --git a/webrtc/tools/network_tester/androidapp/AndroidManifest.xml b/webrtc/tools/network_tester/androidapp/AndroidManifest.xml
new file mode 100755
index 0000000000..f391063f6d
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/AndroidManifest.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/webrtc/tools/network_tester/androidapp/res/layout/activity_main.xml b/webrtc/tools/network_tester/androidapp/res/layout/activity_main.xml
new file mode 100755
index 0000000000..8839a31003
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/res/layout/activity_main.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
diff --git a/webrtc/tools/network_tester/androidapp/res/mipmap-hdpi/ic_launcher.png b/webrtc/tools/network_tester/androidapp/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..cde69bccce
Binary files /dev/null and b/webrtc/tools/network_tester/androidapp/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/webrtc/tools/network_tester/androidapp/res/mipmap-mdpi/ic_launcher.png b/webrtc/tools/network_tester/androidapp/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c133a0cbd3
Binary files /dev/null and b/webrtc/tools/network_tester/androidapp/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/webrtc/tools/network_tester/androidapp/res/mipmap-xhdpi/ic_launcher.png b/webrtc/tools/network_tester/androidapp/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bfa42f0e7b
Binary files /dev/null and b/webrtc/tools/network_tester/androidapp/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/webrtc/tools/network_tester/androidapp/res/mipmap-xxhdpi/ic_launcher.png b/webrtc/tools/network_tester/androidapp/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..324e72cdd7
Binary files /dev/null and b/webrtc/tools/network_tester/androidapp/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/webrtc/tools/network_tester/androidapp/res/mipmap-xxxhdpi/ic_launcher.png b/webrtc/tools/network_tester/androidapp/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..aee44e1384
Binary files /dev/null and b/webrtc/tools/network_tester/androidapp/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/webrtc/tools/network_tester/androidapp/res/values-v17/styles.xml b/webrtc/tools/network_tester/androidapp/res/values-v17/styles.xml
new file mode 100755
index 0000000000..ff6c9d2c0f
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/res/values-v17/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/webrtc/tools/network_tester/androidapp/res/values-w820dp/dimens.xml b/webrtc/tools/network_tester/androidapp/res/values-w820dp/dimens.xml
new file mode 100755
index 0000000000..63fc816444
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/webrtc/tools/network_tester/androidapp/res/values/colors.xml b/webrtc/tools/network_tester/androidapp/res/values/colors.xml
new file mode 100755
index 0000000000..3ab3e9cbce
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+
diff --git a/webrtc/tools/network_tester/androidapp/res/values/dimens.xml b/webrtc/tools/network_tester/androidapp/res/values/dimens.xml
new file mode 100755
index 0000000000..47c8224673
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+
+ 16dp
+ 16dp
+
diff --git a/webrtc/tools/network_tester/androidapp/res/values/strings.xml b/webrtc/tools/network_tester/androidapp/res/values/strings.xml
new file mode 100755
index 0000000000..273276d43e
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+ NetworkTester
+ Start test
+ Interrupt test
+ Status
+
diff --git a/webrtc/tools/network_tester/androidapp/src/com/google/media/networktester/MainActivity.java b/webrtc/tools/network_tester/androidapp/src/com/google/media/networktester/MainActivity.java
new file mode 100644
index 0000000000..2a78d6b9f9
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/src/com/google/media/networktester/MainActivity.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2017 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 com.google.media.networktester;
+
+import android.app.Activity;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.ParcelFileDescriptor;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.WindowManager;
+import android.widget.Button;
+
+public class MainActivity extends Activity {
+ Button startButton;
+ Button stopButton;
+ NetworkTester networkTester = null;
+ Handler mainThreadHandler;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ startButton = (Button) findViewById(R.id.start_button);
+ startButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startTest();
+ }
+ });
+ stopButton = (Button) findViewById(R.id.stop_button);
+ stopButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ stopTest();
+ }
+ });
+ mainThreadHandler = new Handler();
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+
+ private void startTest() {
+ if (networkTester == null) {
+ networkTester = new NetworkTester();
+ networkTester.start();
+ }
+ }
+
+ private void stopTest() {
+ if (networkTester != null) {
+ networkTester.interrupt();
+ networkTester = null;
+ }
+ }
+}
diff --git a/webrtc/tools/network_tester/androidapp/src/com/google/media/networktester/NetworkTester.java b/webrtc/tools/network_tester/androidapp/src/com/google/media/networktester/NetworkTester.java
new file mode 100644
index 0000000000..7c08f873bb
--- /dev/null
+++ b/webrtc/tools/network_tester/androidapp/src/com/google/media/networktester/NetworkTester.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 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 com.google.media.networktester;
+
+public class NetworkTester extends Thread {
+ private native static long CreateTestController();
+ private native static void TestControllerConnect(long testController);
+ private native static void TestControllerRun(long testController);
+ private native static boolean TestControllerIsDone(long testController);
+ private native static void DestroyTestController(long testController);
+ static {
+ System.loadLibrary("network_tester_so");
+ }
+
+ @Override
+ public void run() {
+ final long testController = CreateTestController();
+ TestControllerConnect(testController);
+ while (!Thread.interrupted() && !TestControllerIsDone(testController)) {
+ TestControllerRun(testController);
+ }
+ DestroyTestController(testController);
+ }
+}
diff --git a/webrtc/tools/network_tester/jni.cpp b/webrtc/tools/network_tester/jni.cpp
new file mode 100644
index 0000000000..469a1c98ce
--- /dev/null
+++ b/webrtc/tools/network_tester/jni.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017 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
+#undef JNIEXPORT
+#define JNIEXPORT __attribute__((visibility("default")))
+#include
+
+#include "webrtc/tools/network_tester/test_controller.h"
+
+extern "C" JNIEXPORT jlong JNICALL
+Java_com_google_media_networktester_NetworkTester_CreateTestController(
+ JNIEnv* jni,
+ jclass) {
+ return reinterpret_cast(new webrtc::TestController(
+ 0, 0, "/mnt/sdcard/network_tester_client_config.dat",
+ "/mnt/sdcard/network_tester_client_packet_log.dat"));
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_google_media_networktester_NetworkTester_TestControllerConnect(
+ JNIEnv* jni,
+ jclass,
+ jlong native_pointer) {
+ reinterpret_cast(native_pointer)
+ ->SendConnectTo("85.195.237.107", 9090);
+}
+
+extern "C" JNIEXPORT bool JNICALL
+Java_com_google_media_networktester_NetworkTester_TestControllerIsDone(
+ JNIEnv* jni,
+ jclass,
+ jlong native_pointer) {
+ return reinterpret_cast(native_pointer)
+ ->IsTestDone();
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_google_media_networktester_NetworkTester_TestControllerRun(
+ JNIEnv* jni,
+ jclass,
+ jlong native_pointer) {
+ reinterpret_cast(native_pointer)->Run();
+}
+
+extern "C" JNIEXPORT void JNICALL
+Java_com_google_media_networktester_NetworkTester_DestroyTestController(
+ JNIEnv* jni,
+ jclass,
+ jlong native_pointer) {
+ webrtc::TestController* test_controller =
+ reinterpret_cast(native_pointer);
+ if (test_controller) {
+ delete test_controller;
+ }
+}
diff --git a/webrtc/tools/network_tester/test_controller.cc b/webrtc/tools/network_tester/test_controller.cc
index 44a16148b2..51deac7bb7 100644
--- a/webrtc/tools/network_tester/test_controller.cc
+++ b/webrtc/tools/network_tester/test_controller.cc
@@ -16,7 +16,8 @@ TestController::TestController(int min_port,
int max_port,
const std::string& config_file_path,
const std::string& log_file_path)
- : config_file_path_(config_file_path),
+ : socket_factory_(rtc::ThreadManager::Instance()->WrapCurrentThread()),
+ config_file_path_(config_file_path),
packet_logger_(log_file_path),
local_test_done_(false),
remote_test_done_(false) {
@@ -101,6 +102,9 @@ void TestController::OnReadPacket(rtc::AsyncPacketSocket* socket,
case NetworkTesterPacket::TEST_START: {
packet_sender_.reset(new PacketSender(this, config_file_path_));
packet_sender_->StartSending();
+ rtc::CritScope scoped_lock(&local_test_done_lock_);
+ local_test_done_ = false;
+ remote_test_done_ = false;
break;
}
case NetworkTesterPacket::TEST_DATA: {