diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
index 1d37010ef..d4167576d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java
@@ -56,6 +56,7 @@ import org.briarproject.briar.android.viewmodel.ViewModelModule;
import org.briarproject.briar.api.android.AndroidNotificationManager;
import org.briarproject.briar.api.android.DozeWatchdog;
import org.briarproject.briar.api.android.LockManager;
+import org.briarproject.briar.api.android.NetworkUsageMetrics;
import org.briarproject.briar.api.android.ScreenFilterMonitor;
import org.briarproject.briar.api.test.TestAvatarCreator;
@@ -114,7 +115,7 @@ public class AppModule {
@Inject
ScreenFilterMonitor screenFilterMonitor;
@Inject
- NetworkUsageLogger networkUsageLogger;
+ NetworkUsageMetrics networkUsageMetrics;
@Inject
DozeWatchdog dozeWatchdog;
@Inject
@@ -287,11 +288,12 @@ public class AppModule {
}
@Provides
- NetworkUsageLogger provideNetworkUsageLogger(
+ @Singleton
+ NetworkUsageMetrics provideNetworkUsageMetrics(
LifecycleManager lifecycleManager) {
- NetworkUsageLogger networkUsageLogger = new NetworkUsageLogger();
- lifecycleManager.registerService(networkUsageLogger);
- return networkUsageLogger;
+ NetworkUsageMetrics networkUsageMetrics = new NetworkUsageMetricsImpl();
+ lifecycleManager.registerService(networkUsageMetrics);
+ return networkUsageMetrics;
}
@Provides
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/NetworkUsageLogger.java b/briar-android/src/main/java/org/briarproject/briar/android/NetworkUsageLogger.java
deleted file mode 100644
index 7bba1cf50..000000000
--- a/briar-android/src/main/java/org/briarproject/briar/android/NetworkUsageLogger.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.briarproject.briar.android;
-
-import android.net.TrafficStats;
-import android.os.Process;
-
-import org.briarproject.bramble.api.lifecycle.Service;
-
-import java.util.logging.Logger;
-
-import static java.util.logging.Level.INFO;
-import static org.briarproject.bramble.util.LogUtils.now;
-
-class NetworkUsageLogger implements Service {
-
- private static final Logger LOG =
- Logger.getLogger(NetworkUsageLogger.class.getName());
-
- private volatile long startTime, rxBytes, txBytes;
-
- @Override
- public void startService() {
- startTime = now();
- int uid = Process.myUid();
- rxBytes = TrafficStats.getUidRxBytes(uid);
- txBytes = TrafficStats.getUidTxBytes(uid);
- }
-
- @Override
- public void stopService() {
- if (LOG.isLoggable(INFO)) {
- long sessionDuration = now() - startTime;
- int uid = Process.myUid();
- long rx = TrafficStats.getUidRxBytes(uid) - rxBytes;
- long tx = TrafficStats.getUidTxBytes(uid) - txBytes;
- LOG.info("Duration " + (sessionDuration / 1000) + " seconds");
- LOG.info("Received " + rx + " bytes");
- LOG.info("Sent " + tx + " bytes");
- }
- }
-}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/NetworkUsageMetricsImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/NetworkUsageMetricsImpl.java
new file mode 100644
index 000000000..b1675ecff
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/android/NetworkUsageMetricsImpl.java
@@ -0,0 +1,49 @@
+package org.briarproject.briar.android;
+
+import android.net.TrafficStats;
+import android.os.Process;
+
+import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
+import org.briarproject.briar.api.android.NetworkUsageMetrics;
+
+import java.util.logging.Logger;
+
+import static java.util.logging.Level.INFO;
+import static org.briarproject.bramble.util.LogUtils.now;
+
+@NotNullByDefault
+class NetworkUsageMetricsImpl implements NetworkUsageMetrics {
+
+ private static final Logger LOG =
+ Logger.getLogger(NetworkUsageMetricsImpl.class.getName());
+
+ private volatile long startTime, rxBytes, txBytes;
+
+ @Override
+ public void startService() {
+ startTime = now();
+ int uid = Process.myUid();
+ rxBytes = TrafficStats.getUidRxBytes(uid);
+ txBytes = TrafficStats.getUidTxBytes(uid);
+ }
+
+ @Override
+ public void stopService() {
+ if (LOG.isLoggable(INFO)) {
+ Metrics metrics = getMetrics();
+ LOG.info("Duration " + (metrics.getSessionDurationMs() / 1000)
+ + " seconds");
+ LOG.info("Received " + metrics.getRxBytes() + " bytes");
+ LOG.info("Sent " + metrics.getTxBytes() + " bytes");
+ }
+ }
+
+ @Override
+ public Metrics getMetrics() {
+ long sessionDurationMs = now() - startTime;
+ int uid = Process.myUid();
+ long rx = TrafficStats.getUidRxBytes(uid) - rxBytes;
+ long tx = TrafficStats.getUidTxBytes(uid) - txBytes;
+ return new Metrics(sessionDurationMs, rx, tx);
+ }
+}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportCollector.java b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportCollector.java
index 723edf10a..5befcea98 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportCollector.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/reporting/BriarReportCollector.java
@@ -28,6 +28,8 @@ import org.briarproject.briar.R;
import org.briarproject.briar.android.reporting.ReportData.MultiReportInfo;
import org.briarproject.briar.android.reporting.ReportData.ReportItem;
import org.briarproject.briar.android.reporting.ReportData.SingleReportInfo;
+import org.briarproject.briar.api.android.NetworkUsageMetrics;
+import org.briarproject.briar.api.android.NetworkUsageMetrics.Metrics;
import java.io.File;
import java.io.PrintWriter;
@@ -65,9 +67,11 @@ import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty;
class BriarReportCollector {
private final Context ctx;
+ private final NetworkUsageMetrics networkUsageMetrics;
- BriarReportCollector(Context ctx) {
+ BriarReportCollector(Context ctx, NetworkUsageMetrics networkUsageMetrics) {
this.ctx = ctx;
+ this.networkUsageMetrics = networkUsageMetrics;
}
ReportData collectReportData(@Nullable Throwable t, long appStartTime,
@@ -81,6 +85,7 @@ class BriarReportCollector {
.add(getMemory())
.add(getStorage())
.add(getConnectivity())
+ .add(getNetworkUsage())
.add(getBuildConfig())
.add(getLogcat(logs))
.add(getDeviceFeatures());
@@ -298,6 +303,16 @@ class BriarReportCollector {
connectivityInfo);
}
+ private ReportItem getNetworkUsage() {
+ Metrics metrics = networkUsageMetrics.getMetrics();
+ MultiReportInfo networkUsage = new MultiReportInfo()
+ .add("SessionDuration", metrics.getSessionDurationMs())
+ .add("BytesReceived", metrics.getRxBytes())
+ .add("BytesSent", metrics.getTxBytes());
+ return new ReportItem("NetworkUsage", R.string.dev_report_network_usage,
+ networkUsage);
+ }
+
private ReportItem getBuildConfig() {
MultiReportInfo buildConfig = new MultiReportInfo()
.add("GitHash", BuildConfig.GitHash)
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/reporting/ReportViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/reporting/ReportViewModel.java
index 6e0a898b6..24d71c31e 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/reporting/ReportViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/reporting/ReportViewModel.java
@@ -18,6 +18,7 @@ import org.briarproject.briar.android.reporting.ReportData.MultiReportInfo;
import org.briarproject.briar.android.reporting.ReportData.ReportItem;
import org.briarproject.briar.android.viewmodel.LiveEvent;
import org.briarproject.briar.android.viewmodel.MutableLiveEvent;
+import org.briarproject.briar.api.android.NetworkUsageMetrics;
import org.json.JSONException;
import java.io.File;
@@ -69,12 +70,13 @@ class ReportViewModel extends AndroidViewModel {
@Inject
ReportViewModel(@NonNull Application application,
+ NetworkUsageMetrics networkUsageMetrics,
CachingLogHandler logHandler,
LogDecrypter logDecrypter,
DevReporter reporter,
PluginManager pluginManager) {
super(application);
- collector = new BriarReportCollector(application);
+ collector = new BriarReportCollector(application, networkUsageMetrics);
this.logHandler = logHandler;
this.logDecrypter = logDecrypter;
this.reporter = reporter;
diff --git a/briar-android/src/main/java/org/briarproject/briar/api/android/NetworkUsageMetrics.java b/briar-android/src/main/java/org/briarproject/briar/api/android/NetworkUsageMetrics.java
new file mode 100644
index 000000000..2dc1a115d
--- /dev/null
+++ b/briar-android/src/main/java/org/briarproject/briar/api/android/NetworkUsageMetrics.java
@@ -0,0 +1,34 @@
+package org.briarproject.briar.api.android;
+
+import org.briarproject.bramble.api.lifecycle.Service;
+import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
+
+@NotNullByDefault
+public interface NetworkUsageMetrics extends Service {
+
+ Metrics getMetrics();
+
+ class Metrics {
+
+ private final long sessionDurationMs, rxBytes, txBytes;
+
+ public Metrics(long sessionDurationMs, long rxBytes,
+ long txBytes) {
+ this.sessionDurationMs = sessionDurationMs;
+ this.rxBytes = rxBytes;
+ this.txBytes = txBytes;
+ }
+
+ public long getSessionDurationMs() {
+ return sessionDurationMs;
+ }
+
+ public long getRxBytes() {
+ return rxBytes;
+ }
+
+ public long getTxBytes() {
+ return txBytes;
+ }
+ }
+}
diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml
index 236facc1f..fec1fc495 100644
--- a/briar-android/src/main/res/values/strings.xml
+++ b/briar-android/src/main/res/values/strings.xml
@@ -649,6 +649,7 @@
Memory
Storage
Connectivity
+ Network usage
Build configuration
App log
Device Features