add tor status indicator to status bar

This commit is contained in:
Craig Raw 2021-09-21 11:22:09 +02:00
parent ca1f934138
commit e12f7a634a
6 changed files with 131 additions and 0 deletions

View file

@ -1602,6 +1602,29 @@ public class AppController implements Initializable {
tabLabel.getGraphic().getStyleClass().remove("failure");
}
private void setTorIcon() {
TorStatusLabel torStatusLabel = null;
for(Node node : statusBar.getRightItems()) {
if(node instanceof TorStatusLabel) {
torStatusLabel = (TorStatusLabel)node;
}
}
if(!AppServices.isUsingProxy()) {
if(torStatusLabel != null) {
torStatusLabel.update();
statusBar.getRightItems().removeAll(torStatusLabel);
}
} else {
if(torStatusLabel == null) {
torStatusLabel = new TorStatusLabel();
statusBar.getRightItems().add(Math.max(statusBar.getRightItems().size() - 2, 0), torStatusLabel);
} else {
torStatusLabel.update();
}
}
}
@Subscribe
public void themeChanged(ThemeChangedEvent event) {
String darkCss = getClass().getResource("darktheme.css").toExternalForm();
@ -1859,6 +1882,7 @@ public class AppController implements Initializable {
String status = CONNECTION_FAILED_PREFIX + event.getMessage();
statusUpdated(new StatusEvent(status));
serverToggleStopAnimation();
setTorIcon();
}
@Subscribe
@ -1867,6 +1891,7 @@ public class AppController implements Initializable {
statusUpdated(new StatusEvent(status));
setServerToggleTooltip(event.getBlockHeight());
serverToggleStopAnimation();
setTorIcon();
}
@Subscribe
@ -1993,18 +2018,21 @@ public class AppController implements Initializable {
public void torBootStatus(TorBootStatusEvent event) {
serverToggle.setDisable(true);
statusUpdated(new StatusEvent(event.getStatus(), 120));
setTorIcon();
}
@Subscribe
public void torFailedStatus(TorFailedStatusEvent event) {
serverToggle.setDisable(false);
statusUpdated(new StatusEvent(event.getStatus()));
setTorIcon();
}
@Subscribe
public void torReadyStatus(TorReadyStatusEvent event) {
serverToggle.setDisable(false);
statusUpdated(new StatusEvent(event.getStatus()));
setTorIcon();
}
@Subscribe

View file

@ -119,6 +119,11 @@ public class AppServices {
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean online) {
if(online) {
if(Config.get().requiresInternalTor() && !isTorRunning()) {
if(torService.getState() == Worker.State.SCHEDULED) {
torService.cancel();
torService.reset();
}
torService.start();
} else {
restartServices();

View file

@ -0,0 +1,88 @@
package com.sparrowwallet.sparrow.control;
import com.google.common.net.HostAndPort;
import com.sparrowwallet.sparrow.AppServices;
import com.sparrowwallet.sparrow.glyphfont.FontAwesome5;
import com.sparrowwallet.sparrow.io.Config;
import javafx.concurrent.ScheduledService;
import javafx.concurrent.Task;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.Tooltip;
import javafx.util.Duration;
import org.controlsfx.glyphfont.Glyph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.Socket;
public class TorStatusLabel extends Label {
private static final Logger log = LoggerFactory.getLogger(TorStatusLabel.class);
private final TorConnectionTest torConnectionTest = new TorConnectionTest();
public TorStatusLabel() {
getStyleClass().add("tor-status");
setPadding(new Insets(1, 0, 0, 3));
setGraphic(getIcon());
update();
}
public void update() {
boolean proxyInUse = AppServices.isUsingProxy();
boolean internal = AppServices.isTorRunning();
if(!proxyInUse || internal) {
torConnectionTest.cancel();
if(internal) {
setTooltip(new Tooltip("Internal Tor proxy enabled"));
}
} else if(!torConnectionTest.isRunning()) {
torConnectionTest.setPeriod(Duration.seconds(20.0));
torConnectionTest.setOnSucceeded(workerStateEvent -> {
getStyleClass().remove("failure");
setTooltip(new Tooltip("External Tor proxy enabled"));
});
torConnectionTest.setOnFailed(workerStateEvent -> {
if(!getStyleClass().contains("failure")) {
getStyleClass().add("failure");
}
setTooltip(new Tooltip("External Tor proxy error: " + workerStateEvent.getSource().getException().getMessage()));
log.warn("Failed to connect to external Tor proxy: " + workerStateEvent.getSource().getException().getMessage());
});
torConnectionTest.start();
}
}
private Node getIcon() {
Glyph adjust = new Glyph(FontAwesome5.FONT_NAME, FontAwesome5.Glyph.ADJUST);
adjust.setFontSize(15);
adjust.setRotate(180);
Glyph bullseye = new Glyph(FontAwesome5.FONT_NAME, FontAwesome5.Glyph.BULLSEYE);
bullseye.setFontSize(14);
Group group = new Group();
group.getChildren().addAll(adjust, bullseye);
return group;
}
private static class TorConnectionTest extends ScheduledService<Void> {
@Override
protected Task<Void> createTask() {
return new Task<>() {
protected Void call() throws IOException {
HostAndPort proxyHostAndPort = HostAndPort.fromString(Config.get().getProxyServer());
Socket socket = new Socket(proxyHostAndPort.getHost(), proxyHostAndPort.getPort());
socket.close();
return null;
}
};
}
}
}

View file

@ -15,6 +15,7 @@ public class FontAwesome5 extends GlyphFont {
* The individual glyphs offered by the FontAwesome5 font.
*/
public static enum Glyph implements INamedCharacter {
ADJUST('\uf042'),
ARROW_CIRCLE_DOWN('\uf0ab'),
ANGLE_DOUBLE_RIGHT('\uf101'),
ARROW_DOWN('\uf063'),
@ -22,6 +23,7 @@ public class FontAwesome5 extends GlyphFont {
BAN('\uf05e'),
BIOHAZARD('\uf780'),
BTC('\uf15a'),
BULLSEYE('\uf140'),
CAMERA('\uf030'),
CHECK_CIRCLE('\uf058'),
CIRCLE('\uf111'),

View file

@ -24,6 +24,10 @@
-fx-text-fill: rgb(202, 18, 67);
}
.tor-status.failure .glyph-font {
-fx-text-fill: rgb(202, 18, 67);
}
.master-only {
-fx-tab-max-height: 0;
}

View file

@ -87,6 +87,10 @@
-fx-fill: #e06c75;
}
.status-bar .tor-status.failure .glyph-font {
-fx-text-fill: #e06c75;
}
.root .titled-description-pane .status-error .text, .root .titled-description-pane .description-error .text {
-fx-fill: #e06c75;
}