From 4d884601f00412fa064557837222b6d8dcc38fe8 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 20 Jun 2023 17:01:45 +0100 Subject: [PATCH] Check more often, only broadcast status if changed. --- .../bramble/api/network/NetworkStatus.java | 17 ++++++++++++++ .../bramble/network/JavaNetworkManager.java | 23 +++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/network/NetworkStatus.java b/bramble-api/src/main/java/org/briarproject/bramble/api/network/NetworkStatus.java index dbebeab6b..4e1c1222b 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/network/NetworkStatus.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/network/NetworkStatus.java @@ -2,6 +2,7 @@ package org.briarproject.bramble.api.network; import org.briarproject.nullsafety.NotNullByDefault; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @Immutable @@ -27,4 +28,20 @@ public class NetworkStatus { public boolean isIpv6Only() { return ipv6Only; } + + @Override + public int hashCode() { + return (connected ? 1 : 0) | (wifi ? 2 : 0) | (ipv6Only ? 4 : 0); + } + + @Override + public boolean equals(@Nullable Object o) { + if (o instanceof NetworkStatus) { + NetworkStatus s = (NetworkStatus) o; + return connected == s.connected + && wifi == s.wifi + && ipv6Only == s.ipv6Only; + } + return false; + } } diff --git a/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java b/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java index 7d7eb9721..94f5b5703 100644 --- a/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java +++ b/bramble-java/src/main/java/org/briarproject/bramble/network/JavaNetworkManager.java @@ -14,12 +14,14 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Logger; import javax.inject.Inject; import static java.util.Collections.list; -import static java.util.concurrent.TimeUnit.MINUTES; +import static java.util.concurrent.TimeUnit.SECONDS; +import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; import static org.briarproject.bramble.util.LogUtils.logException; @@ -34,6 +36,8 @@ class JavaNetworkManager implements NetworkManager, Service { private final TaskScheduler scheduler; private final Executor ioExecutor; private final EventBus eventBus; + private final AtomicReference lastStatus = + new AtomicReference<>(); @Inject JavaNetworkManager(TaskScheduler scheduler, @@ -62,17 +66,26 @@ class JavaNetworkManager implements NetworkManager, Service { } catch (SocketException e) { logException(LOG, WARNING, e); } + if (LOG.isLoggable(INFO)) { + LOG.info("Connected: " + connected + + ", has IPv4 address: " + hasIpv4 + + ", has IPv6 unicast address: " + hasIpv6Unicast); + } return new NetworkStatus(connected, false, !hasIpv4 && hasIpv6Unicast); } - private void broadcastNetworkStatus() { - eventBus.broadcast(new NetworkStatusEvent(getNetworkStatus())); + private void broadcastNetworkStatusIfChanged() { + NetworkStatus status = getNetworkStatus(); + NetworkStatus old = lastStatus.getAndSet(status); + if (!status.equals(old)) { + eventBus.broadcast(new NetworkStatusEvent(status)); + } } @Override public void startService() { - scheduler.scheduleWithFixedDelay(this::broadcastNetworkStatus, - ioExecutor, 0, 1, MINUTES); + scheduler.scheduleWithFixedDelay(this::broadcastNetworkStatusIfChanged, + ioExecutor, 0, 10, SECONDS); } @Override