mirror of
https://github.com/RetGal/Dayon.git
synced 2024-10-04 10:27:37 +03:00
Add compatibility mode
This commit is contained in:
parent
59553414a3
commit
aa85074edc
@ -29,9 +29,9 @@ I also moved the code base to GitHub, where it can easier be maintained.
|
||||
|
||||
## Releases
|
||||
|
||||
The ![latest version](https://github.com/RetGal/Dayon/releases) is v11.0 (Ballsy Beaver) - released more than ten years after the initial release.
|
||||
The ![latest version](https://github.com/RetGal/Dayon/releases) is v12.0 (Adorable Asteroid) - released more than ten years after the initial release.
|
||||
|
||||
This version comes with a new, access token based network configuration of the assisted.
|
||||
This version comes with UPnP support for the assistant side. If enabled, the port forwarding rules will be created automatically.
|
||||
|
||||
The app is available directly from the <a href="https://www.microsoft.com/store/apps/9PBM5KW0C790">Microsoft Store</a>:
|
||||
|
||||
@ -90,6 +90,6 @@ You don't have to be a programmer!
|
||||
|
||||
For example translations for additional languages would make this app more useful for more earthlings - see: [src/main/resources/Babylon.properties](https://github.com/RetGal/Dayon/blob/master/src/main/resources/Babylon.properties) or [docs](https://github.com/RetGal/Dayon/tree/master/docs)
|
||||
|
||||
Also improvements of the existing translations and documentation are very welcome! For example, my current knowledge of Chinese is far below zero - and my knowledge of Russian or Turkish just fractions better..
|
||||
Also, improvements of the existing translations and documentation are very welcome! For example, my current knowledge of Chinese is far below zero - and my knowledge of Russian or Turkish just fractions better..
|
||||
|
||||
Some additional testing, especially on macOS would also be highly appreciated.
|
||||
|
@ -99,6 +99,8 @@ public class Assistant implements ClipboardOwner {
|
||||
|
||||
private Boolean upnpEnabled;
|
||||
|
||||
private final AtomicBoolean compatibilityModeActive = new AtomicBoolean(false);
|
||||
|
||||
public Assistant() {
|
||||
receivedBitCounter = new BitCounter("receivedBits", translate("networkBandwidth"));
|
||||
receivedBitCounter.start(1000);
|
||||
@ -179,6 +181,7 @@ public class Assistant implements ClipboardOwner {
|
||||
assistantActions.setRemoteClipboardSetAction(createRemoteClipboardUpdateAction());
|
||||
assistantActions.setStartAction(createStartAction());
|
||||
assistantActions.setStopAction(createStopAction());
|
||||
assistantActions.setToggleCompatibilityModeAction(createToggleCompatibilityModeAction());
|
||||
return assistantActions;
|
||||
}
|
||||
|
||||
@ -208,7 +211,7 @@ public class Assistant implements ClipboardOwner {
|
||||
frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
try {
|
||||
publicIp = UPnP.getExternalIP();
|
||||
if (publicIp == null) {
|
||||
if (publicIp == null || publicIp.startsWith("192.168") || publicIp.startsWith("10.")) {
|
||||
final URL url = new URL(WHATSMYIP_SERVER_URL);
|
||||
try (final BufferedReader lines = new BufferedReader(new InputStreamReader(url.openStream()))) {
|
||||
publicIp = lines.readLine();
|
||||
@ -223,7 +226,6 @@ public class Assistant implements ClipboardOwner {
|
||||
}
|
||||
if (publicIp != null) {
|
||||
button.setText(publicIp);
|
||||
button.setFont(new Font("Sans Serif", Font.PLAIN, 18));
|
||||
}
|
||||
});
|
||||
choices.add(menuItem);
|
||||
@ -263,8 +265,6 @@ public class Assistant implements ClipboardOwner {
|
||||
choices.setLocation(choicesLocation.x - xOffset, choicesLocation.y + yOffset);
|
||||
}
|
||||
};
|
||||
|
||||
ip.putValue(Action.NAME, "whatIsMyIpAddress");
|
||||
ip.putValue("DISPLAY_NAME", "127.0.0.1"); // always a selection
|
||||
// ...
|
||||
ip.putValue(Action.SHORT_DESCRIPTION, translate("ipAddress.msg1"));
|
||||
@ -304,7 +304,7 @@ public class Assistant implements ClipboardOwner {
|
||||
}
|
||||
|
||||
private Action createNetworkAssistantConfigurationAction(Assistant assistant) {
|
||||
final Action exit = new AbstractAction() {
|
||||
final Action conf = new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ev) {
|
||||
JFrame networkFrame = (JFrame) SwingUtilities.getRoot((Component) ev.getSource());
|
||||
@ -347,11 +347,10 @@ public class Assistant implements ClipboardOwner {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
exit.putValue(Action.NAME, margin(translate("connection.network")));
|
||||
exit.putValue(Action.SHORT_DESCRIPTION, translate("connection.settings"));
|
||||
exit.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.NETWORK_SETTINGS));
|
||||
return exit;
|
||||
conf.putValue(Action.NAME, margin(translate("connection.network")));
|
||||
conf.putValue(Action.SHORT_DESCRIPTION, translate("connection.settings"));
|
||||
conf.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.NETWORK_SETTINGS));
|
||||
return conf;
|
||||
}
|
||||
|
||||
private Action createRemoteClipboardRequestAction() {
|
||||
@ -361,8 +360,6 @@ public class Assistant implements ClipboardOwner {
|
||||
sendRemoteClipboardRequest();
|
||||
}
|
||||
};
|
||||
|
||||
getRemoteClipboard.putValue(Action.NAME, "getClipboard");
|
||||
getRemoteClipboard.putValue(Action.SHORT_DESCRIPTION, translate("clipboard.getRemote"));
|
||||
getRemoteClipboard.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.DOWN));
|
||||
return getRemoteClipboard;
|
||||
@ -375,8 +372,6 @@ public class Assistant implements ClipboardOwner {
|
||||
sendLocalClipboard();
|
||||
}
|
||||
};
|
||||
|
||||
setRemoteClipboard.putValue(Action.NAME, "setClipboard");
|
||||
setRemoteClipboard.putValue(Action.SHORT_DESCRIPTION, translate("clipboard.setRemote"));
|
||||
setRemoteClipboard.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.UP));
|
||||
return setRemoteClipboard;
|
||||
@ -468,13 +463,11 @@ public class Assistant implements ClipboardOwner {
|
||||
if (!newCaptureEngineConfiguration.equals(captureEngineConfiguration)) {
|
||||
captureEngineConfiguration = newCaptureEngineConfiguration;
|
||||
captureEngineConfiguration.persist();
|
||||
|
||||
sendCaptureConfiguration(captureEngineConfiguration);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
configure.putValue(Action.NAME, margin(translate("capture")));
|
||||
configure.putValue(Action.SHORT_DESCRIPTION, translate("capture.settings"));
|
||||
configure.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.CAPTURE_SETTINGS));
|
||||
@ -565,7 +558,6 @@ public class Assistant implements ClipboardOwner {
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
configure.putValue(Action.NAME, margin(translate("compression")));
|
||||
configure.putValue(Action.SHORT_DESCRIPTION, translate("compression.settings"));
|
||||
configure.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.COMPRESSION_SETTINGS));
|
||||
@ -608,8 +600,6 @@ public class Assistant implements ClipboardOwner {
|
||||
sendCaptureConfiguration(captureEngineConfiguration);
|
||||
}
|
||||
};
|
||||
|
||||
configure.putValue(Action.NAME, "resetCapture");
|
||||
configure.putValue(Action.SHORT_DESCRIPTION, translate("capture.reset"));
|
||||
configure.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.RESET_CAPTURE));
|
||||
return configure;
|
||||
@ -628,8 +618,6 @@ public class Assistant implements ClipboardOwner {
|
||||
frame.repaint();
|
||||
}
|
||||
};
|
||||
|
||||
fitScreen.putValue(Action.NAME, "toggleScreenMode");
|
||||
fitScreen.putValue(Action.SHORT_DESCRIPTION, translate("toggle.screen.mode"));
|
||||
fitScreen.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.FIT));
|
||||
return fitScreen;
|
||||
@ -650,8 +638,6 @@ public class Assistant implements ClipboardOwner {
|
||||
choices.show(caller, 0, caller.getHeight());
|
||||
}
|
||||
};
|
||||
|
||||
settings.putValue(Action.NAME, translate("settings"));
|
||||
settings.putValue(Action.SHORT_DESCRIPTION, translate("settings"));
|
||||
settings.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.SETTINGS));
|
||||
return settings;
|
||||
@ -690,8 +676,6 @@ public class Assistant implements ClipboardOwner {
|
||||
clipboard.setContents(value, value);
|
||||
}
|
||||
};
|
||||
|
||||
tokenAction.putValue(Action.NAME, "createToken");
|
||||
tokenAction.putValue(Action.SHORT_DESCRIPTION, translate("token.create.msg"));
|
||||
tokenAction.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.KEY));
|
||||
return tokenAction;
|
||||
@ -704,7 +688,6 @@ public class Assistant implements ClipboardOwner {
|
||||
new Assistant.NetWorker().execute();
|
||||
}
|
||||
};
|
||||
startAction.putValue(Action.NAME, "start");
|
||||
startAction.putValue(Action.SHORT_DESCRIPTION, translate("start.session"));
|
||||
startAction.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.START));
|
||||
return startAction;
|
||||
@ -718,7 +701,6 @@ public class Assistant implements ClipboardOwner {
|
||||
}
|
||||
};
|
||||
stopAction.setEnabled(false);
|
||||
stopAction.putValue(Action.NAME, "stop");
|
||||
stopAction.putValue(Action.SHORT_DESCRIPTION, translate("stop.session"));
|
||||
stopAction.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.STOP));
|
||||
return stopAction;
|
||||
@ -758,6 +740,19 @@ public class Assistant implements ClipboardOwner {
|
||||
}
|
||||
}
|
||||
|
||||
private Action createToggleCompatibilityModeAction() {
|
||||
final Action compatibilityMode = new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ev) {
|
||||
compatibilityModeActive.set(!compatibilityModeActive.get());
|
||||
frame.repaint();
|
||||
}
|
||||
};
|
||||
compatibilityMode.putValue(Action.SHORT_DESCRIPTION, translate("compatibility.mode"));
|
||||
compatibilityMode.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.COMPATIBILITY));
|
||||
return compatibilityMode;
|
||||
}
|
||||
|
||||
private class NetWorker extends SwingWorker<String, String> {
|
||||
@Override
|
||||
protected String doInBackground() {
|
||||
@ -769,7 +764,7 @@ public class Assistant implements ClipboardOwner {
|
||||
|
||||
private void startNetwork() {
|
||||
frame.onGettingReady();
|
||||
network.start();
|
||||
network.start(compatibilityModeActive.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -788,14 +783,14 @@ public class Assistant implements ClipboardOwner {
|
||||
|
||||
private void initUpnp() {
|
||||
CompletableFuture.supplyAsync(() -> {
|
||||
upnpEnabled = Boolean.valueOf(UPnP.isUPnPAvailable());
|
||||
upnpEnabled = UPnP.isUPnPAvailable();
|
||||
Log.info(format("UPnP is %s", isUpnpEnabled() ? "enabled" : "disabled"));
|
||||
return upnpEnabled;
|
||||
});
|
||||
}
|
||||
|
||||
private String margin(String in) {
|
||||
return " " + in;
|
||||
return format(" %s", in);
|
||||
}
|
||||
|
||||
private class MyDeCompressorEngineListener implements DeCompressorEngineListener {
|
||||
@ -879,6 +874,14 @@ public class Assistant implements ClipboardOwner {
|
||||
frame.onSessionStarted();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFingerprinted(String fingerprints) {
|
||||
if (null == fingerprints) {
|
||||
fingerprints = translate("compatibility.mode.enable");
|
||||
}
|
||||
frame.setFingerprints(fingerprints);
|
||||
}
|
||||
|
||||
/**
|
||||
* Should not block as called from the network receiving thread (!)
|
||||
*/
|
||||
@ -924,9 +927,5 @@ public class Assistant implements ClipboardOwner {
|
||||
frame.onIOError(error);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUntrustedConnection(String fingerprint) {
|
||||
frame.onUntrustedConnection(fingerprint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ class AssistantActions {
|
||||
private Action stopAction;
|
||||
private Action settingsAction;
|
||||
private Action tokenAction;
|
||||
private Action toggleCompatibilityModeAction;
|
||||
|
||||
public Action getIpAddressAction() {
|
||||
return ipAddressAction;
|
||||
@ -112,4 +113,12 @@ class AssistantActions {
|
||||
public void setTokenAction(Action tokenAction) {
|
||||
this.tokenAction = tokenAction;
|
||||
}
|
||||
|
||||
public Action getToggleCompatibilityModeAction() {
|
||||
return toggleCompatibilityModeAction;
|
||||
}
|
||||
|
||||
public void setToggleCompatibilityModeAction(Action toggleCompatibilityModeAction) {
|
||||
this.toggleCompatibilityModeAction = toggleCompatibilityModeAction;
|
||||
}
|
||||
}
|
||||
|
@ -196,18 +196,15 @@ class AssistantFrame extends BaseFrame {
|
||||
toolbar.addToggleAction(actions.getToggleFitScreenAction());
|
||||
toolbar.addAction(actions.getResetAction());
|
||||
toolbar.addSeparator();
|
||||
toolbar.addToggleAction(actions.getToggleCompatibilityModeAction());
|
||||
toolbar.addAction(actions.getSettingsAction());
|
||||
toolbar.addSeparator();
|
||||
toolbar.addAction(createShowInfoAction());
|
||||
toolbar.addAction(createShowHelpAction());
|
||||
toolbar.addSeparator();
|
||||
toolbar.addAction(actions.getTokenAction());
|
||||
toolbar.addSeparator();
|
||||
toolbar.add(toolbar.getMessage());
|
||||
toolbar.add(toolbar.getFingerprints());
|
||||
toolbar.addGlue();
|
||||
toolbar.addAction(actions.getIpAddressAction());
|
||||
toolbar.addSeparator();
|
||||
toolbar.addAction(createExitAction());
|
||||
return toolbar;
|
||||
}
|
||||
|
||||
@ -234,7 +231,6 @@ class AssistantFrame extends BaseFrame {
|
||||
windowsKeyToggleButton.setEnabled(controlActivated.get());
|
||||
}
|
||||
};
|
||||
remoteControl.putValue(Action.NAME, "toggleControlMode");
|
||||
remoteControl.putValue(Action.SHORT_DESCRIPTION, translate("control.mode"));
|
||||
remoteControl.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.CONTROL));
|
||||
return remoteControl;
|
||||
@ -252,7 +248,6 @@ class AssistantFrame extends BaseFrame {
|
||||
windowsKeyActivated.set(!windowsKeyActivated.get());
|
||||
}
|
||||
};
|
||||
sendWindowsKey.putValue(Action.NAME, "sendWindowsKey");
|
||||
sendWindowsKey.putValue(Action.SHORT_DESCRIPTION, translate("send.windowsKey"));
|
||||
sendWindowsKey.putValue(Action.SMALL_ICON, getOrCreateIcon(ImageNames.WIN));
|
||||
return sendWindowsKey;
|
||||
@ -265,6 +260,7 @@ class AssistantFrame extends BaseFrame {
|
||||
actions.getStartAction().setEnabled(true);
|
||||
actions.getStopAction().setEnabled(false);
|
||||
actions.getNetworkConfigurationAction().setEnabled(true);
|
||||
actions.getToggleCompatibilityModeAction().setEnabled(true);
|
||||
actions.getIpAddressAction().setEnabled(true);
|
||||
actions.getCaptureEngineConfigurationAction().setEnabled(true);
|
||||
actions.getResetAction().setEnabled(false);
|
||||
@ -275,7 +271,9 @@ class AssistantFrame extends BaseFrame {
|
||||
void onHttpStarting(int port) {
|
||||
actions.getStopAction().setEnabled(true);
|
||||
actions.getNetworkConfigurationAction().setEnabled(false);
|
||||
actions.getToggleCompatibilityModeAction().setEnabled(false);
|
||||
actions.getIpAddressAction().setEnabled(false);
|
||||
toolbar.clearFingerprints();
|
||||
getStatusBar().setMessage(translate("listening", port));
|
||||
}
|
||||
|
||||
@ -333,14 +331,12 @@ class AssistantFrame extends BaseFrame {
|
||||
|
||||
void onDisconnecting() {
|
||||
stopSessionTimer();
|
||||
toolbar.clearMessage();
|
||||
}
|
||||
|
||||
void onIOError(IOException error) {
|
||||
actions.getStartAction().setEnabled(false);
|
||||
actions.getStopAction().setEnabled(false);
|
||||
actions.getResetAction().setEnabled(false);
|
||||
toolbar.clearMessage();
|
||||
disableControls();
|
||||
stopSessionTimer();
|
||||
hideSpinner();
|
||||
|
@ -22,9 +22,6 @@ import static mpo.dayon.common.utils.SystemUtilities.*;
|
||||
|
||||
public abstract class BaseFrame extends JFrame {
|
||||
|
||||
private static final int MIN_WIDTH = 550;
|
||||
private static final int MIN_HEIGHT = 300;
|
||||
|
||||
private transient FrameConfiguration configuration;
|
||||
|
||||
private transient Position position;
|
||||
@ -42,7 +39,6 @@ public abstract class BaseFrame extends JFrame {
|
||||
protected BaseFrame() {
|
||||
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
|
||||
setIconImage(ImageUtilities.getOrCreateIcon(ImageNames.APP).getImage());
|
||||
|
||||
addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent ev) {
|
||||
@ -66,8 +62,8 @@ public abstract class BaseFrame extends JFrame {
|
||||
this.configuration = new FrameConfiguration(frameType);
|
||||
this.position = new Position(configuration.getX(), configuration.getY());
|
||||
this.setLocation(position.getX(), position.getY());
|
||||
this.dimension = new Dimension(Math.max(configuration.getWidth(), MIN_WIDTH),
|
||||
Math.max(configuration.getHeight(), MIN_HEIGHT));
|
||||
this.dimension = new Dimension(Math.max(configuration.getWidth(), frameType.getMinWidth()),
|
||||
Math.max(configuration.getHeight(), frameType.getMinHeight()));
|
||||
this.setSize(dimension.width, dimension.height);
|
||||
updateTitle(translate(frameType.getPrefix()), Version.get());
|
||||
}
|
||||
@ -83,16 +79,20 @@ public abstract class BaseFrame extends JFrame {
|
||||
}
|
||||
|
||||
protected void setupToolBar(ToolBar toolBar) {
|
||||
this.toolBar = toolBar;
|
||||
toolBar.addAction(createShowInfoAction());
|
||||
toolBar.addAction(createShowHelpAction());
|
||||
toolBar.addSeparator();
|
||||
toolBar.addAction(createExitAction());
|
||||
add(toolBar, BorderLayout.NORTH);
|
||||
this.toolBar = toolBar;
|
||||
}
|
||||
|
||||
protected void setupStatusBar(StatusBar statusBar) {
|
||||
this.setStatusBar(statusBar);
|
||||
add(statusBar, BorderLayout.SOUTH);
|
||||
this.statusBar = statusBar;
|
||||
}
|
||||
|
||||
protected Action createExitAction() {
|
||||
private Action createExitAction() {
|
||||
final Action exit = new AbstractAction() {
|
||||
|
||||
@Override
|
||||
@ -100,11 +100,8 @@ public abstract class BaseFrame extends JFrame {
|
||||
doExit();
|
||||
}
|
||||
};
|
||||
|
||||
exit.putValue(Action.NAME, "exit");
|
||||
exit.putValue(Action.SHORT_DESCRIPTION, translate("exit.dayon"));
|
||||
exit.putValue(Action.SMALL_ICON, ImageUtilities.getOrCreateIcon(ImageNames.EXIT));
|
||||
|
||||
return exit;
|
||||
}
|
||||
|
||||
@ -112,7 +109,7 @@ public abstract class BaseFrame extends JFrame {
|
||||
private static final String HTTP_SUPPORT = "https://retgal.github.io/Dayon/" + translate("support.html");
|
||||
private static final String HTTP_FEEDBACK = HTTP_HOME + "/issues";
|
||||
|
||||
protected Action createShowInfoAction() {
|
||||
private Action createShowInfoAction() {
|
||||
final Action showSystemInfo = new AbstractAction() {
|
||||
|
||||
@Override
|
||||
@ -174,8 +171,6 @@ public abstract class BaseFrame extends JFrame {
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
showSystemInfo.putValue(Action.NAME, "showSystemInfo");
|
||||
showSystemInfo.putValue(Action.SHORT_DESCRIPTION, translate("system.info.show"));
|
||||
showSystemInfo.putValue(Action.SMALL_ICON, ImageUtilities.getOrCreateIcon(ImageNames.INFO));
|
||||
|
||||
@ -219,15 +214,13 @@ public abstract class BaseFrame extends JFrame {
|
||||
return format("<html>%s : <a href=''>%s</a> (build %s)</html>", label, url, buildNumber);
|
||||
}
|
||||
|
||||
protected Action createShowHelpAction() {
|
||||
private Action createShowHelpAction() {
|
||||
final Action showHelp = new AbstractAction() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent ev) {
|
||||
browse(SystemUtilities.getQuickStartURI(translate("quickstart.html"), frameType.getPrefix()));
|
||||
}
|
||||
};
|
||||
|
||||
showHelp.putValue(Action.NAME, "showHelp");
|
||||
showHelp.putValue(Action.SHORT_DESCRIPTION, translate("help"));
|
||||
showHelp.putValue(Action.SMALL_ICON, ImageUtilities.getOrCreateIcon(ImageNames.HELP));
|
||||
|
||||
@ -267,12 +260,8 @@ public abstract class BaseFrame extends JFrame {
|
||||
return statusBar;
|
||||
}
|
||||
|
||||
private void setStatusBar(StatusBar statusBar) {
|
||||
this.statusBar = statusBar;
|
||||
}
|
||||
|
||||
public void onUntrustedConnection(String fingerprint) {
|
||||
toolBar.setMessage(fingerprint);
|
||||
public void setFingerprints(String fingerprints) {
|
||||
toolBar.setFingerprints(fingerprints);
|
||||
}
|
||||
|
||||
private static class FeedbackMouseAdapter extends MouseAdapter {
|
||||
|
@ -1,15 +1,28 @@
|
||||
package mpo.dayon.common.gui.common;
|
||||
|
||||
public enum FrameType {
|
||||
ASSISTANT("assistant"), ASSISTED("assisted");
|
||||
ASSISTANT("assistant", 1024, 512),
|
||||
ASSISTED("assisted", 512, 256);
|
||||
|
||||
private final String prefix;
|
||||
private final Integer minWidth;
|
||||
private final Integer minHeight;
|
||||
|
||||
FrameType(String prefix) {
|
||||
FrameType(String prefix, Integer minWidth, Integer minHeight) {
|
||||
this.prefix = prefix;
|
||||
this.minWidth = minWidth;
|
||||
this.minHeight = minHeight;
|
||||
}
|
||||
|
||||
public String getPrefix() {
|
||||
return prefix;
|
||||
}
|
||||
|
||||
public Integer getMinWidth() {
|
||||
return minWidth;
|
||||
}
|
||||
|
||||
public Integer getMinHeight() {
|
||||
return minHeight;
|
||||
}
|
||||
}
|
||||
|
@ -7,11 +7,13 @@ public final class ImageNames {
|
||||
public static final String APP = "app_32.png";
|
||||
public static final String APP_LARGE = "app_48.png";
|
||||
public static final String CAPTURE_SETTINGS = "capture_settings.png";
|
||||
public static final String COMPATIBILITY = "compatibility.png";
|
||||
public static final String COMPRESSION_SETTINGS = "compression_settings.png";
|
||||
public static final String CONTROL = "control.png";
|
||||
public static final String COPY = "copy.png";
|
||||
public static final String DOWN = "down.png";
|
||||
public static final String EXIT = "exit.png";
|
||||
public static final String FINGERPRINT = "fingerprint.png";
|
||||
public static final String FIT = "fit.png";
|
||||
public static final String HELP = "help.png";
|
||||
public static final String INFO = "info.png";
|
||||
@ -28,7 +30,6 @@ public final class ImageNames {
|
||||
public static final String UP = "up.png";
|
||||
public static final String USERS = "users_48.png";
|
||||
public static final String WAITING = "waiting.gif";
|
||||
public static final String WARNING = "warning.png";
|
||||
public static final String WIN = "win.png";
|
||||
|
||||
}
|
||||
|
@ -1,18 +1,20 @@
|
||||
package mpo.dayon.common.gui.toolbar;
|
||||
|
||||
import mpo.dayon.common.gui.common.ImageNames;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import static java.lang.String.format;
|
||||
import static mpo.dayon.common.babylon.Babylon.translate;
|
||||
import static mpo.dayon.common.gui.common.ImageNames.FINGERPRINT;
|
||||
import static mpo.dayon.common.gui.common.ImageUtilities.getOrCreateIcon;
|
||||
|
||||
public class ToolBar extends JToolBar {
|
||||
public static final Insets ZERO_INSETS = new Insets(1, 1, 1, 1);
|
||||
|
||||
private final JLabel message = new JLabel();
|
||||
private static final Font DEFAULT_FONT = new Font("Sans Serif", Font.PLAIN, 16);
|
||||
|
||||
private final JLabel fingerprint = new JLabel();
|
||||
|
||||
public ToolBar() {
|
||||
setFloatable(false);
|
||||
@ -24,6 +26,7 @@ public class ToolBar extends JToolBar {
|
||||
final JButton button = new JButton();
|
||||
addButtonProperties(action, button);
|
||||
button.setDisabledIcon(null);
|
||||
button.setFont(DEFAULT_FONT);
|
||||
add(button);
|
||||
}
|
||||
|
||||
@ -47,20 +50,20 @@ public class ToolBar extends JToolBar {
|
||||
add(Box.createHorizontalGlue());
|
||||
}
|
||||
|
||||
public JLabel getMessage() {
|
||||
return message;
|
||||
public JLabel getFingerprints() {
|
||||
return fingerprint;
|
||||
}
|
||||
|
||||
public void clearMessage() {
|
||||
this.message.setIcon(null);
|
||||
this.message.setText(null);
|
||||
this.message.setToolTipText(null);
|
||||
public void clearFingerprints() {
|
||||
this.fingerprint.setText("");
|
||||
this.fingerprint.setIcon(null);
|
||||
}
|
||||
|
||||
public void setMessage(String fingerprint) {
|
||||
this.message.setIcon(getOrCreateIcon(ImageNames.WARNING));
|
||||
this.message.setText(translate("connection.suspicious"));
|
||||
this.message.setToolTipText(translate("connection.fingerprint.mismatch", fingerprint));
|
||||
public void setFingerprints(String hash) {
|
||||
fingerprint.setIcon(getOrCreateIcon(FINGERPRINT));
|
||||
fingerprint.setText(format("%s ", hash));
|
||||
fingerprint.setToolTipText(translate("connection.peer.fingerprints"));
|
||||
fingerprint.setFont(DEFAULT_FONT);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -69,6 +69,7 @@ connection.incoming.msg2 = Connected with [ %s ]
|
||||
# Connection Settings ...
|
||||
|
||||
connection.network = Network
|
||||
connection.peer.fingerprints = Fingerprints assistant:assisted
|
||||
connection.settings = Connection settings
|
||||
connection.settings.assistantIpAddress = Assistant IP address
|
||||
connection.settings.assistantPortNumber = Assistant port number
|
||||
@ -83,9 +84,6 @@ connection.settings.invalidToken = This token is invalid.
|
||||
connection.settings.upnp.true = UPnP is enabled on this gateway %s
|
||||
connection.settings.upnp.false = UPnP is disabled in this network.
|
||||
connection.settings.portforward.true = Port forwarding is configured automatically.
|
||||
connection.settings.portforward.false = Remember to configure the port forwarding.
|
||||
connection.suspicious = Possible MITM attack!
|
||||
connection.fingerprint.mismatch = Fingerprints don't match %s
|
||||
|
||||
# Token
|
||||
token = Token
|
||||
@ -182,3 +180,6 @@ toggle.screen.mode = Toggle fit screen mode
|
||||
uacSettings = UAC settings
|
||||
|
||||
share.all.screens = Share all screens
|
||||
|
||||
compatibility.mode = Compatibility mode for previous versions
|
||||
compatibility.mode.enable = Enable compatibility mode!
|
||||
|
@ -69,6 +69,7 @@ connection.incoming.msg2 = Verbunden mit [ %s ]
|
||||
# Connection Settings ...
|
||||
|
||||
connection.network = Netzwerk
|
||||
connection.peer.fingerprints = Fingerabdr\u00FCcke Assistent:Assistierter
|
||||
connection.settings = Verbindungseinstellungen
|
||||
connection.settings.assistantIpAddress = IP-Adresse des Assistenten
|
||||
connection.settings.assistantPortNumber = Port Nummer des Assistenten
|
||||
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP ist aktiviert - Gateway %s
|
||||
connection.settings.upnp.false = UPnP ist in diesem Netzwerk deaktiviert.
|
||||
connection.settings.portforward.true = Portweiterleitung wird automatisch konfiguriert.
|
||||
connection.settings.portforward.false = Einrichten der Portweiterleitung nicht vergessen.
|
||||
connection.suspicious = M\u00F6glicher MITM-Angriff!
|
||||
connection.fingerprint.mismatch = Fingerabdr\u00FCcke passen nicht %s
|
||||
|
||||
# Token
|
||||
token = Token
|
||||
@ -182,3 +181,6 @@ toggle.screen.mode = Anzeigemodus umschalten
|
||||
uacSettings = UAC-Einstellungen
|
||||
|
||||
share.all.screens = Alle Bildschirme teilen
|
||||
|
||||
compatibility.mode = Kompatibilit\u00E4tsmodus f\u00FCr Vorg\u00E4ngerversionen
|
||||
compatibility.mode.enable = Kompatibilit\u00E4tsmodus aktivieren!
|
@ -69,6 +69,7 @@ connection.incoming.msg2 = Conectado con [ %s ]
|
||||
# Connection Settings ...
|
||||
|
||||
connection.network = Red
|
||||
connection.peer.fingerprints = Huellas asistente:asistido
|
||||
connection.settings = Configuraci\u00F3n de conexi\u00F3n
|
||||
connection.settings.assistantIpAddress = Direcci\u00F3n IP del asistente
|
||||
connection.settings.assistantPortNumber = N\u00FAmero de puerto del asistente
|
||||
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP est\u00E1 habilitado en esta puer
|
||||
connection.settings.upnp.false = UPnP est\u00E1 deshabilitado en esta red.
|
||||
connection.settings.portforward.true = El reenv\u00EDo de puertos se configura autom\u00E1ticamente.
|
||||
connection.settings.portforward.false = Recuerde configurar el reenv\u00EDo de puertos.
|
||||
connection.suspicious = \u00A1Posible ataque MITM!
|
||||
connection.fingerprint.mismatch = Las huellas dactilares no coinciden %s
|
||||
|
||||
# Token
|
||||
token = C\u00F3digo
|
||||
@ -182,3 +181,6 @@ toggle.screen.mode = Cambiar modo de visualizaci\u00F3n
|
||||
uacSettings = Configuraci\u00F3n de UAC
|
||||
|
||||
share.all.screens = Compartir todas las pantallas
|
||||
|
||||
compatibility.mode = Modo de compatibilidad para versiones anteriores
|
||||
compatibility.mode.enable = \u00A1Habilite el modo de compatibilidad!
|
@ -69,6 +69,7 @@ connection.incoming.msg2 = Connect\u00E9 avec [ %s ]
|
||||
# Assisted Connection Settings ...
|
||||
|
||||
connection.network = R\u00E9seau
|
||||
connection.peer.fingerprints = Empreintes assistant:assist\u00E9
|
||||
connection.settings = Configuration de la Connexion
|
||||
connection.settings.assistantIpAddress = Addresse IP de l'Assistant
|
||||
connection.settings.assistantPortNumber = Num\u00E9ro du Port de l'Assistant
|
||||
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP est activ\u00E9 sur cette passere
|
||||
connection.settings.upnp.false = UPnP est d\u00E9sactiv\u00E9 dans ce r\u00E9seau.
|
||||
connection.settings.portforward.true = La redirection de port est configur\u00E9e automatiquement.
|
||||
connection.settings.portforward.false = N'oubliez pas de configurer la redirection de port.
|
||||
connection.suspicious = Possible attaque MITM!
|
||||
connection.fingerprint.mismatch = Les empreintes digitales ne correspondent pas %s
|
||||
|
||||
# Token
|
||||
token = Code
|
||||
@ -182,3 +181,6 @@ toggle.screen.mode = Ajuster le mode \u00E9cran
|
||||
uacSettings = Param\u00E8tres UAC
|
||||
|
||||
share.all.screens = Partager tous les \u00E9crans
|
||||
|
||||
compatibility.mode = Mode de compatibilit\u00E9 pour les versions pr\u00E9c\u00E9dentes
|
||||
compatibility.mode.enable = Activez le mode compatibilit\u00E9!
|
||||
|
@ -69,6 +69,7 @@ connection.incoming.msg2 = Connesso con [ %s ]
|
||||
# Connection Settings ...
|
||||
|
||||
connection.network = Rete
|
||||
connection.peer.fingerprints = Impronte assistante:assistito
|
||||
connection.settings = Impostazioni di connessione
|
||||
connection.settings.assistantIpAddress = Indirizzo IP dell'assistente
|
||||
connection.settings.assistantPortNumber = Numero porta assistente
|
||||
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP \u00E8 abilitato su questo gatewa
|
||||
connection.settings.upnp.false = UPnP \u00E8 disabilitato in questa rete.
|
||||
connection.settings.portforward.true = Il port forwarding \u00E8 configurato automaticamente.
|
||||
connection.settings.portforward.false = Ricordati di configurare il port forwarding.
|
||||
connection.suspicious = Possibile attacco MITM!
|
||||
connection.fingerprint.mismatch = Le impronte digitali non corrispondono %s
|
||||
|
||||
# Token
|
||||
token = Token
|
||||
@ -177,8 +176,11 @@ clipboard.setRemote = Imposta appunti assistiti
|
||||
|
||||
send.windowsKey = Invia chiave Windows
|
||||
|
||||
toggle.screen.mode = Attiva / disattiva la modalit\u00E0 di adattamento allo schermo
|
||||
toggle.screen.mode = Attiva/disattiva la modalit\u00E0 di adattamento allo schermo
|
||||
|
||||
uacSettings = Impostazioni dell'UAC
|
||||
|
||||
share.all.screens = Condividi tutti gli schermi
|
||||
|
||||
compatibility.mode = Modalit\u00E0 di compatibilit\u00E0 per le versioni precedenti
|
||||
compatibility.mode.enable = Abilita la modalit\u00E0 compatibilit\u00E0!
|
||||
|
@ -69,6 +69,7 @@ connection.incoming.msg2 = \u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043
|
||||
# Connection Settings ...
|
||||
|
||||
connection.network = \u0421\u0435\u0442\u044C
|
||||
connection.peer.fingerprints = \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u043F\u0430\u043B\u044C\u0446\u0435\u0432 \u041F\u043E\u043C\u043E\u0449\u043D\u0438\u043A:\u041F\u043E\u043C\u043E\u0433\u0430\u043B
|
||||
connection.settings = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F
|
||||
connection.settings.assistantIpAddress = IP-\u0430\u0434\u0440\u0435\u0441 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430
|
||||
connection.settings.assistantPortNumber = \u041D\u043E\u043C\u0435\u0440 \u043F\u043E\u0440\u0442\u0430 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430
|
||||
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP \u0432\u043A\u043B\u044E\u0447\u0
|
||||
connection.settings.upnp.false = UPnP \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D \u0432 \u044D\u0442\u043E\u0439 \u0441\u0435\u0442\u0438.
|
||||
connection.settings.portforward.true = \u041F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044F \u043F\u043E\u0440\u0442\u043E\u0432 \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.
|
||||
connection.settings.portforward.false = \u041D\u0435 \u0437\u0430\u0431\u0443\u0434\u044C\u0442\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044E \u043F\u043E\u0440\u0442\u043E\u0432.
|
||||
connection.suspicious = \u0412\u043E\u0437\u043C\u043E\u0436\u043D\u0430 MITM-\u0430\u0442\u0430\u043A\u0430!
|
||||
connection.fingerprint.mismatch = \u041E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0438 \u043F\u0430\u043B\u044C\u0446\u0435\u0432 \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442 %s
|
||||
|
||||
# Token (access code)
|
||||
token = \u041A\u043E\u0434 \u0434\u043E\u0441\u0442\u0443\u043F\u0430
|
||||
@ -182,3 +181,6 @@ toggle.screen.mode = \u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u044
|
||||
uacSettings = \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044F \u0443\u0447\u0435\u0442\u043D\u044B\u0445 \u0437\u0430\u043F\u0438\u0441\u0435\u0439
|
||||
|
||||
share.all.screens = \u0414\u0435\u043B\u0438\u0442\u0435\u0441\u044C \u0432\u0441\u0435\u043C\u0438 \u044D\u043A\u0440\u0430\u043D\u0430\u043C\u0438
|
||||
|
||||
compatibility.mode = \u0420\u0435\u0436\u0438\u043C \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438 \u0441 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u043C\u0438 \u0432\u0435\u0440\u0441\u0438\u044F\u043C\u0438
|
||||
compatibility.mode.enable = \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u0440\u0435\u0436\u0438\u043C \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438!
|
@ -69,6 +69,7 @@ connection.incoming.msg2 = [ %s ]'a ba\u011Fland\u0131
|
||||
# Connection Settings ...
|
||||
|
||||
connection.network = A\u011F
|
||||
connection.peer.fingerprints = parmak izleri asistan:yard\u0131ml\u0131
|
||||
connection.settings = Ba\u011Flant\u0131 ayarlar\u0131
|
||||
connection.settings.assistantIpAddress = Asistan IP adresi
|
||||
connection.settings.assistantPortNumber = Asistan port numaras\u0131
|
||||
@ -84,8 +85,6 @@ connection.settings.upnp.true = UPnP bu a\u011F ge\u00E7idinde etkinle
|
||||
connection.settings.upnp.false = UPnP bu a\u011Fda devre d\u0131\u015F\u0131.
|
||||
connection.settings.portforward.true = Ba\u011Flant\u0131 noktas\u0131 y\u00F6nlendirme otomatik olarak yap\u0131land\u0131r\u0131l\u0131r.
|
||||
connection.settings.portforward.false = Ba\u011Flant\u0131 noktas\u0131 y\u00F6nlendirmeyi yap\u0131land\u0131rmay\u0131 unutmay\u0131n.
|
||||
connection.suspicious = Muhtemel MITM sald\u0131r\u0131s\u0131!
|
||||
connection.fingerprint.mismatch = Parmak izleri e\u015Fle\u015Fmiyor %s
|
||||
|
||||
# Token (access code)
|
||||
token = Giri\u015F kodu
|
||||
@ -182,3 +181,6 @@ toggle.screen.mode = Ekrana s\u0131\u011Fd\u0131r modunu a\u00E7/kapat
|
||||
uacSettings = UAC ayarlar\u0131
|
||||
|
||||
share.all.screens = T\u00FCm ekranlar\u0131 payla\u015F
|
||||
|
||||
compatibility.mode = \u00D6nceki s\u00FCr\u00FCmler i\u00E7in uyumluluk modu
|
||||
compatibility.mode.enable = Uyumluluk modunu etkinle\u015Ftirin!
|
@ -104,6 +104,8 @@ connection.incoming.msg2 = \u4F1A\u8BDD\u5DF2\u542F\u52A8 [ %s ]
|
||||
# Connection Settings ...
|
||||
# Network Network Setting
|
||||
connection.network = \u7F51\u7EDC\u914D\u7F6E
|
||||
# Fingerprints assistant:assisted
|
||||
connection.peer.fingerprints = \u6307\u7EB9 \u4E3B\u63A7\u7AEF\uFF1A\u7528\u6237\u7AEF
|
||||
# Connection settings
|
||||
connection.settings = \u8FDE\u63A5\u914D\u7F6E
|
||||
# Assistant IP address
|
||||
@ -130,8 +132,6 @@ connection.settings.upnp.true = \u6B64\u7F51\u5173 %s \u4E0A\u542F\u75
|
||||
connection.settings.upnp.false = UPnP \u5728\u6B64\u7F51\u7EDC\u4E2D\u88AB\u7981\u7528\u3002
|
||||
connection.settings.portforward.true = \u7AEF\u53E3\u8F6C\u53D1\u662F\u81EA\u52A8\u914D\u7F6E\u7684\u3002
|
||||
connection.settings.portforward.false = \u8BF7\u8BB0\u4F4F\u914D\u7F6E\u7AEF\u53E3\u8F6C\u53D1\u3002
|
||||
connection.suspicious = \u53EF\u80FD\u7684 MITM \u653B\u51FB\uFF01
|
||||
connection.fingerprint.mismatch = \u6307\u7EB9\u4E0D\u5339\u914D %s
|
||||
|
||||
# Token (access code)
|
||||
token = \u8BBF\u95EE\u4EE3\u7801
|
||||
@ -277,3 +277,6 @@ toggle.screen.mode = \u8FDC\u7A0B\u684C\u9762\u5C4F\u5E55\u81EA\u9002\u5E94
|
||||
uacSettings = UAC \u8BBE\u7F6E
|
||||
|
||||
share.all.screens = \u5171\u4EAB\u6240\u6709\u5C4F\u5E55
|
||||
|
||||
compatibility.mode = \u4EE5\u524D\u7248\u672C\u7684\u517C\u5BB9\u6A21\u5F0F
|
||||
compatibility.mode.enable = \u542F\u7528\u517C\u5BB9\u6A21\u5F0F\uFF01
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 448 B |
@ -25,7 +25,7 @@ class NetworkAssistantEngineTest {
|
||||
engine.reconfigure(configuration);
|
||||
|
||||
// when
|
||||
engine.start();
|
||||
engine.start(false);
|
||||
|
||||
// then
|
||||
verify(listener, timeout(2000).atLeastOnce()).onStarting(configuration.getPort());
|
||||
|
@ -93,7 +93,7 @@ class VersionTest {
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({ "11.0.0,1.10.8", "12.0.0,1.10.8", "12.0.0,11.0.7", "11.0.7,12.0.0" })
|
||||
@CsvSource({ "11.0.0,1.10.8", "12.0.0,1.10.8", "12.0.0,11.0.7", "11.0.7,12.0.0", "12.0.1,13.0.0" })
|
||||
void isCompatibleVersionShouldReturnTrueForHardCodedCompatibleVersions(String thatV, String otherV) {
|
||||
// given
|
||||
Version that = new Version(thatV);
|
||||
|
Loading…
Reference in New Issue
Block a user