diff --git a/common/src/main/java/io/bitsquare/app/Version.java b/common/src/main/java/io/bitsquare/app/Version.java index 94f3fc5e2a..e2c195261f 100644 --- a/common/src/main/java/io/bitsquare/app/Version.java +++ b/common/src/main/java/io/bitsquare/app/Version.java @@ -28,34 +28,46 @@ public class Version { // The version nr. for the objects sent over the network. A change will break the serialization of old objects. // If objects are used for both network and database the network version is applied. - public static final long NETWORK_PROTOCOL_VERSION = 2; + public static final long P2P_NETWORK_VERSION = 1; // The version nr. of the serialized data stored to disc. A change will break the serialization of old objects. - public static final long LOCAL_DB_VERSION = 2; + public static final long LOCAL_DB_VERSION = 1; // The version nr. of the current protocol. The offer holds that version. // A taker will check the version of the offers to see if his version is compatible. - // TODO not used yet - public static final long PROTOCOL_VERSION = 1; + public static final long TRADE_PROTOCOL_VERSION = 1; - // The version for the bitcoin network (Mainnet = 0, TestNet = 1, Regtest = 2) - private static int NETWORK_ID; - public static int getNetworkId() { - return NETWORK_ID; + public static int getP2PMessageVersion() { + // A changed NETWORK_PROTOCOL_VERSION for the serialized objects does not trigger reliable a disconnect. + // TODO investigate why, but java serialisation should be replaced anyway, so using one existing field + // for the version is fine. + // BTC_NETWORK_ID is 0, 1 or 2, we use for changes at NETWORK_PROTOCOL_VERSION a multiplication with 10 + // to avoid conflicts: + // E.g. btc BTC_NETWORK_ID=1, NETWORK_PROTOCOL_VERSION=1 -> getNetworkId()=2; + // BTC_NETWORK_ID=0, NETWORK_PROTOCOL_VERSION=2 -> getNetworkId()=2; -> wrong + return BTC_NETWORK_ID + 10 * (int) P2P_NETWORK_VERSION; } - public static void setNetworkId(int networkId) { - NETWORK_ID = networkId; + // The version for the bitcoin network (Mainnet = 0, TestNet = 1, Regtest = 2) + private static int BTC_NETWORK_ID; + + public static void setBtcNetworkId(int btcNetworkId) { + BTC_NETWORK_ID = btcNetworkId; + } + + public static int getBtcNetworkId() { + return BTC_NETWORK_ID; } public static void printVersion() { log.info("Version{" + "VERSION=" + VERSION + - ", NETWORK_PROTOCOL_VERSION=" + NETWORK_PROTOCOL_VERSION + + ", P2P_NETWORK_VERSION=" + P2P_NETWORK_VERSION + ", LOCAL_DB_VERSION=" + LOCAL_DB_VERSION + - ", PROTOCOL_VERSION=" + PROTOCOL_VERSION + - ", NETWORK_ID=" + NETWORK_ID + + ", TRADE_PROTOCOL_VERSION=" + TRADE_PROTOCOL_VERSION + + ", BTC_NETWORK_ID=" + BTC_NETWORK_ID + + ", getP2PNetworkId()=" + getP2PMessageVersion() + '}'); } diff --git a/common/src/main/java/io/bitsquare/common/ByteArray.java b/common/src/main/java/io/bitsquare/common/ByteArray.java index 9152618fbe..42c3a3895b 100644 --- a/common/src/main/java/io/bitsquare/common/ByteArray.java +++ b/common/src/main/java/io/bitsquare/common/ByteArray.java @@ -7,7 +7,7 @@ import java.util.Arrays; public class ByteArray implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final byte[] bytes; diff --git a/common/src/main/java/io/bitsquare/common/crypto/PubKeyRing.java b/common/src/main/java/io/bitsquare/common/crypto/PubKeyRing.java index cce1ea47ad..9b3d95441d 100644 --- a/common/src/main/java/io/bitsquare/common/crypto/PubKeyRing.java +++ b/common/src/main/java/io/bitsquare/common/crypto/PubKeyRing.java @@ -37,7 +37,7 @@ import java.security.spec.X509EncodedKeySpec; */ public class PubKeyRing implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final Logger log = LoggerFactory.getLogger(PubKeyRing.class); diff --git a/common/src/main/java/io/bitsquare/common/crypto/SealedAndSigned.java b/common/src/main/java/io/bitsquare/common/crypto/SealedAndSigned.java index 0d6c03b0d3..add2fef527 100644 --- a/common/src/main/java/io/bitsquare/common/crypto/SealedAndSigned.java +++ b/common/src/main/java/io/bitsquare/common/crypto/SealedAndSigned.java @@ -25,7 +25,7 @@ import java.util.Arrays; public final class SealedAndSigned implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final byte[] encryptedSecretKey; public final byte[] encryptedPayloadWithHmac; diff --git a/common/src/main/java/io/bitsquare/storage/FileManager.java b/common/src/main/java/io/bitsquare/storage/FileManager.java index 01b8a4eb26..b10c98daeb 100644 --- a/common/src/main/java/io/bitsquare/storage/FileManager.java +++ b/common/src/main/java/io/bitsquare/storage/FileManager.java @@ -133,14 +133,14 @@ public class FileManager { executor.schedule(saveFileTask, delayInMilli, TimeUnit.MILLISECONDS); } - public synchronized T read(File file) { + public synchronized T read(File file) throws IOException, ClassNotFoundException { log.debug("read" + file); try (final FileInputStream fileInputStream = new FileInputStream(file); final ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream)) { return (T) objectInputStream.readObject(); } catch (Throwable t) { log.error("Exception at read: " + t.getMessage()); - return null; + throw t; } } @@ -176,12 +176,12 @@ public class FileManager { } public synchronized void removeAndBackupFile(String fileName) throws IOException { - File corruptedBackupDir = new File(Paths.get(dir.getAbsolutePath(), "corrupted").toString()); + File corruptedBackupDir = new File(Paths.get(dir.getAbsolutePath(), "backup_of_corrupted_data").toString()); if (!corruptedBackupDir.exists()) if (!corruptedBackupDir.mkdir()) log.warn("make dir failed"); - File corruptedFile = new File(Paths.get(dir.getAbsolutePath(), "corrupted", fileName).toString()); + File corruptedFile = new File(Paths.get(dir.getAbsolutePath(), "backup_of_corrupted_data", fileName).toString()); renameTempFileToFile(storageFile, corruptedFile); } diff --git a/common/src/main/java/io/bitsquare/storage/Storage.java b/common/src/main/java/io/bitsquare/storage/Storage.java index cd79725ab6..1298d8a2cf 100644 --- a/common/src/main/java/io/bitsquare/storage/Storage.java +++ b/common/src/main/java/io/bitsquare/storage/Storage.java @@ -17,7 +17,6 @@ package io.bitsquare.storage; -import com.google.common.base.Throwables; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -158,23 +157,20 @@ public class Storage { log.trace("Backup {} completed in {}msec", storageFile, System.currentTimeMillis() - now); return persistedObject; - } catch (ClassCastException | IOException e) { - e.printStackTrace(); - log.error("Version of persisted class has changed. We cannot read the persisted data anymore. We make a backup and remove the inconsistent " + - "file."); + } catch (Throwable t) { + log.error("Version of persisted class has changed. We cannot read the persisted data anymore. " + + "We make a backup and remove the inconsistent file."); + log.error(t.getMessage()); try { - // In case the persisted data have been critical (keys) we keep a backup which might be used for recovery + // We keep a backup which might be used for recovery fileManager.removeAndBackupFile(fileName); } catch (IOException e1) { e1.printStackTrace(); log.error(e1.getMessage()); // We swallow Exception if backup fails } - databaseCorruptionHandler.onFileCorrupted(storageFile.getName()); - } catch (Throwable throwable) { - throwable.printStackTrace(); - log.error(throwable.getMessage()); - Throwables.propagate(throwable); + if (databaseCorruptionHandler != null) + databaseCorruptionHandler.onFileCorrupted(storageFile.getName()); } } return null; diff --git a/core/src/main/java/io/bitsquare/alert/Alert.java b/core/src/main/java/io/bitsquare/alert/Alert.java index 1ae3e91cce..5cfd2ea7af 100644 --- a/core/src/main/java/io/bitsquare/alert/Alert.java +++ b/core/src/main/java/io/bitsquare/alert/Alert.java @@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit; public final class Alert implements PubKeyProtectedExpirablePayload { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final long TTL = TimeUnit.DAYS.toMillis(10); diff --git a/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java b/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java index f3021accd5..8ea5b3d722 100644 --- a/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java +++ b/core/src/main/java/io/bitsquare/arbitration/Arbitrator.java @@ -30,7 +30,7 @@ import java.util.concurrent.TimeUnit; public final class Arbitrator implements PubKeyProtectedExpirablePayload { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public static final long TTL = TimeUnit.DAYS.toMillis(10); diff --git a/core/src/main/java/io/bitsquare/arbitration/Dispute.java b/core/src/main/java/io/bitsquare/arbitration/Dispute.java index 39d9ce848e..a0bb07d13f 100644 --- a/core/src/main/java/io/bitsquare/arbitration/Dispute.java +++ b/core/src/main/java/io/bitsquare/arbitration/Dispute.java @@ -40,7 +40,7 @@ import java.util.List; public class Dispute implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final Logger log = LoggerFactory.getLogger(Dispute.class); /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/io/bitsquare/arbitration/DisputeResult.java b/core/src/main/java/io/bitsquare/arbitration/DisputeResult.java index f813ce755f..ddcab6a6a5 100644 --- a/core/src/main/java/io/bitsquare/arbitration/DisputeResult.java +++ b/core/src/main/java/io/bitsquare/arbitration/DisputeResult.java @@ -32,7 +32,7 @@ import java.util.Date; public class DisputeResult implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final Logger log = LoggerFactory.getLogger(DisputeResult.class); public enum FeePaymentPolicy { diff --git a/core/src/main/java/io/bitsquare/arbitration/messages/DisputeDirectMessage.java b/core/src/main/java/io/bitsquare/arbitration/messages/DisputeDirectMessage.java index 718d554108..78f1d7cea9 100644 --- a/core/src/main/java/io/bitsquare/arbitration/messages/DisputeDirectMessage.java +++ b/core/src/main/java/io/bitsquare/arbitration/messages/DisputeDirectMessage.java @@ -34,7 +34,7 @@ import java.util.List; public final class DisputeDirectMessage extends DisputeMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final Logger log = LoggerFactory.getLogger(DisputeDirectMessage.class); private final long date; @@ -188,7 +188,7 @@ public final class DisputeDirectMessage extends DisputeMessage { public static class Attachment implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final Logger log = LoggerFactory.getLogger(Attachment.class); private final byte[] bytes; diff --git a/core/src/main/java/io/bitsquare/arbitration/messages/DisputeMessage.java b/core/src/main/java/io/bitsquare/arbitration/messages/DisputeMessage.java index 5e1b166e49..f07de6007d 100644 --- a/core/src/main/java/io/bitsquare/arbitration/messages/DisputeMessage.java +++ b/core/src/main/java/io/bitsquare/arbitration/messages/DisputeMessage.java @@ -21,10 +21,10 @@ import io.bitsquare.app.Version; import io.bitsquare.p2p.messaging.MailboxMessage; public abstract class DisputeMessage implements MailboxMessage { - private final int networkId = Version.getNetworkId(); + private final int messageVersion = Version.getP2PMessageVersion(); @Override - public int networkId() { - return networkId; + public int getMessageVersion() { + return messageVersion; } } diff --git a/core/src/main/java/io/bitsquare/arbitration/messages/DisputeResultMessage.java b/core/src/main/java/io/bitsquare/arbitration/messages/DisputeResultMessage.java index a6bcc3dcea..3123d4187d 100644 --- a/core/src/main/java/io/bitsquare/arbitration/messages/DisputeResultMessage.java +++ b/core/src/main/java/io/bitsquare/arbitration/messages/DisputeResultMessage.java @@ -23,7 +23,7 @@ import io.bitsquare.p2p.NodeAddress; public final class DisputeResultMessage extends DisputeMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final DisputeResult disputeResult; private final NodeAddress myNodeAddress; diff --git a/core/src/main/java/io/bitsquare/arbitration/messages/OpenNewDisputeMessage.java b/core/src/main/java/io/bitsquare/arbitration/messages/OpenNewDisputeMessage.java index e7a1b547b7..c5a38026cd 100644 --- a/core/src/main/java/io/bitsquare/arbitration/messages/OpenNewDisputeMessage.java +++ b/core/src/main/java/io/bitsquare/arbitration/messages/OpenNewDisputeMessage.java @@ -23,7 +23,7 @@ import io.bitsquare.p2p.NodeAddress; public final class OpenNewDisputeMessage extends DisputeMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final Dispute dispute; private final NodeAddress myNodeAddress; diff --git a/core/src/main/java/io/bitsquare/arbitration/messages/PeerOpenedDisputeMessage.java b/core/src/main/java/io/bitsquare/arbitration/messages/PeerOpenedDisputeMessage.java index 784e0fd06d..7701b546e3 100644 --- a/core/src/main/java/io/bitsquare/arbitration/messages/PeerOpenedDisputeMessage.java +++ b/core/src/main/java/io/bitsquare/arbitration/messages/PeerOpenedDisputeMessage.java @@ -23,7 +23,7 @@ import io.bitsquare.p2p.NodeAddress; public final class PeerOpenedDisputeMessage extends DisputeMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final Dispute dispute; private final NodeAddress myNodeAddress; diff --git a/core/src/main/java/io/bitsquare/arbitration/messages/PeerPublishedPayoutTxMessage.java b/core/src/main/java/io/bitsquare/arbitration/messages/PeerPublishedPayoutTxMessage.java index 855dfb82c1..0107638a45 100644 --- a/core/src/main/java/io/bitsquare/arbitration/messages/PeerPublishedPayoutTxMessage.java +++ b/core/src/main/java/io/bitsquare/arbitration/messages/PeerPublishedPayoutTxMessage.java @@ -24,7 +24,7 @@ import java.util.Arrays; public final class PeerPublishedPayoutTxMessage extends DisputeMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final byte[] transaction; public final String tradeId; diff --git a/core/src/main/java/io/bitsquare/btc/data/RawInput.java b/core/src/main/java/io/bitsquare/btc/data/RawInput.java index b4da3d320d..a019b3d797 100644 --- a/core/src/main/java/io/bitsquare/btc/data/RawInput.java +++ b/core/src/main/java/io/bitsquare/btc/data/RawInput.java @@ -24,7 +24,7 @@ import java.util.Arrays; public class RawInput implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final long index; public final byte[] parentTransaction; diff --git a/core/src/main/java/io/bitsquare/payment/AliPayAccountContractData.java b/core/src/main/java/io/bitsquare/payment/AliPayAccountContractData.java index d6de629953..1275d92f03 100644 --- a/core/src/main/java/io/bitsquare/payment/AliPayAccountContractData.java +++ b/core/src/main/java/io/bitsquare/payment/AliPayAccountContractData.java @@ -23,7 +23,7 @@ import java.io.Serializable; public class AliPayAccountContractData extends PaymentAccountContractData implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private String accountNr; diff --git a/core/src/main/java/io/bitsquare/payment/BlockChainAccountContractData.java b/core/src/main/java/io/bitsquare/payment/BlockChainAccountContractData.java index ccdce971d6..d28db61a51 100644 --- a/core/src/main/java/io/bitsquare/payment/BlockChainAccountContractData.java +++ b/core/src/main/java/io/bitsquare/payment/BlockChainAccountContractData.java @@ -23,7 +23,7 @@ import java.io.Serializable; public class BlockChainAccountContractData extends PaymentAccountContractData implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private String address; // used in crypto note coins. not supported now but hopefully in future, so leave it for now. diff --git a/core/src/main/java/io/bitsquare/payment/OKPayAccountContractData.java b/core/src/main/java/io/bitsquare/payment/OKPayAccountContractData.java index 8f111c97e9..7cabdd44de 100644 --- a/core/src/main/java/io/bitsquare/payment/OKPayAccountContractData.java +++ b/core/src/main/java/io/bitsquare/payment/OKPayAccountContractData.java @@ -23,7 +23,7 @@ import java.io.Serializable; public class OKPayAccountContractData extends PaymentAccountContractData implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private String accountNr; diff --git a/core/src/main/java/io/bitsquare/payment/PaymentAccountContractData.java b/core/src/main/java/io/bitsquare/payment/PaymentAccountContractData.java index ddf4a93e7c..0cfeb948c3 100644 --- a/core/src/main/java/io/bitsquare/payment/PaymentAccountContractData.java +++ b/core/src/main/java/io/bitsquare/payment/PaymentAccountContractData.java @@ -24,7 +24,7 @@ import java.io.Serializable; public abstract class PaymentAccountContractData implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private final String paymentMethodName; private final String id; diff --git a/core/src/main/java/io/bitsquare/payment/PerfectMoneyAccountContractData.java b/core/src/main/java/io/bitsquare/payment/PerfectMoneyAccountContractData.java index b849e92244..f710b46e39 100644 --- a/core/src/main/java/io/bitsquare/payment/PerfectMoneyAccountContractData.java +++ b/core/src/main/java/io/bitsquare/payment/PerfectMoneyAccountContractData.java @@ -23,7 +23,7 @@ import java.io.Serializable; public class PerfectMoneyAccountContractData extends PaymentAccountContractData implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private String accountNr; diff --git a/core/src/main/java/io/bitsquare/payment/SepaAccountContractData.java b/core/src/main/java/io/bitsquare/payment/SepaAccountContractData.java index 347bacd8c5..71b64fab7d 100644 --- a/core/src/main/java/io/bitsquare/payment/SepaAccountContractData.java +++ b/core/src/main/java/io/bitsquare/payment/SepaAccountContractData.java @@ -30,7 +30,7 @@ import java.util.stream.Collectors; public class SepaAccountContractData extends PaymentAccountContractData implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final Logger log = LoggerFactory.getLogger(SepaAccountContractData.class); diff --git a/core/src/main/java/io/bitsquare/payment/SwishAccountContractData.java b/core/src/main/java/io/bitsquare/payment/SwishAccountContractData.java index 1dacb37de0..1bf11ee4cb 100644 --- a/core/src/main/java/io/bitsquare/payment/SwishAccountContractData.java +++ b/core/src/main/java/io/bitsquare/payment/SwishAccountContractData.java @@ -23,7 +23,7 @@ import java.io.Serializable; public class SwishAccountContractData extends PaymentAccountContractData implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private String mobileNr; private String holderName; diff --git a/core/src/main/java/io/bitsquare/trade/Contract.java b/core/src/main/java/io/bitsquare/trade/Contract.java index b518b582fa..5bb542fd0f 100644 --- a/core/src/main/java/io/bitsquare/trade/Contract.java +++ b/core/src/main/java/io/bitsquare/trade/Contract.java @@ -36,7 +36,7 @@ import static com.google.common.base.Preconditions.checkArgument; public class Contract implements Serializable { // That object is sent over the wire, so we need to take care of version compatibility. @JsonExclude - public static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + public static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final Offer offer; private final long tradeAmount; diff --git a/core/src/main/java/io/bitsquare/trade/offer/Offer.java b/core/src/main/java/io/bitsquare/trade/offer/Offer.java index b2c926e28b..7033fcd920 100644 --- a/core/src/main/java/io/bitsquare/trade/offer/Offer.java +++ b/core/src/main/java/io/bitsquare/trade/offer/Offer.java @@ -49,7 +49,7 @@ import static com.google.common.base.Preconditions.checkNotNull; public final class Offer implements PubKeyProtectedExpirablePayload { // That object is sent over the wire, so we need to take care of version compatibility. @JsonExclude - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; @JsonExclude private static final Logger log = LoggerFactory.getLogger(Offer.class); @@ -58,7 +58,6 @@ public final class Offer implements PubKeyProtectedExpirablePayload { "take that offer."; public static final String TAC_TAKER = "With taking the offer I commit to the trade conditions as defined."; - public enum Direction {BUY, SELL} public enum State { @@ -71,12 +70,11 @@ public final class Offer implements PubKeyProtectedExpirablePayload { } - // key attributes for lookup private final String id; private final Direction direction; private final String currencyCode; private final long date; - + private final long protocolVersion; private final long fiatPrice; private final long amount; private final long minAmount; @@ -138,6 +136,8 @@ public final class Offer implements PubKeyProtectedExpirablePayload { this.arbitratorNodeAddresses = arbitratorNodeAddresses; this.acceptedCountryCodes = acceptedCountryCodes; + protocolVersion = Version.TRADE_PROTOCOL_VERSION; + date = new Date().getTime(); setState(State.UNDEFINED); } @@ -258,6 +258,9 @@ public final class Offer implements PubKeyProtectedExpirablePayload { return pubKeyRing.getSignaturePubKey(); } + public long getProtocolVersion() { + return protocolVersion; + } public String getId() { return id; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java index b55c909942..a1d65b57b2 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityRequest.java @@ -22,7 +22,7 @@ import io.bitsquare.common.crypto.PubKeyRing; public final class OfferAvailabilityRequest extends OfferMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private final PubKeyRing pubKeyRing; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java index e752e72d66..1f7baff2a6 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferAvailabilityResponse.java @@ -21,7 +21,7 @@ import io.bitsquare.app.Version; public final class OfferAvailabilityResponse extends OfferMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final boolean isAvailable; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java index 0d8027e1d7..601d9d0dfb 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/availability/messages/OfferMessage.java @@ -25,9 +25,9 @@ import javax.annotation.concurrent.Immutable; @Immutable public abstract class OfferMessage implements DirectMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; - private final int networkId = Version.getNetworkId(); + private final int messageVersion = Version.getP2PMessageVersion(); public final String offerId; protected OfferMessage(String offerId) { @@ -35,14 +35,14 @@ public abstract class OfferMessage implements DirectMessage { } @Override - public int networkId() { - return networkId; + public int getMessageVersion() { + return messageVersion; } @Override public String toString() { return "OfferMessage{" + - "networkId=" + networkId + + "messageVersion=" + messageVersion + ", offerId='" + offerId + '\'' + '}'; } diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java index 24befe5f5a..2220118cb0 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/DepositTxPublishedMessage.java @@ -27,7 +27,7 @@ import java.util.Arrays; @Immutable public final class DepositTxPublishedMessage extends TradeMessage implements MailboxMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final byte[] depositTx; private final NodeAddress senderNodeAddress; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java index 1ed5917ab1..540bda376b 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FiatTransferStartedMessage.java @@ -26,7 +26,7 @@ import javax.annotation.concurrent.Immutable; @Immutable public final class FiatTransferStartedMessage extends TradeMessage implements MailboxMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final String buyerPayoutAddress; private final NodeAddress senderNodeAddress; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java index be50830816..55b25e31fb 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/FinalizePayoutTxRequest.java @@ -27,7 +27,7 @@ import java.util.Arrays; @Immutable public final class FinalizePayoutTxRequest extends TradeMessage implements MailboxMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final byte[] sellerSignature; public final String sellerPayoutAddress; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java index 6d956bf895..a772a58c5e 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayDepositRequest.java @@ -31,7 +31,7 @@ import java.util.List; @Immutable public final class PayDepositRequest extends TradeMessage implements MailboxMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final long tradeAmount; public final byte[] takerTradeWalletPubKey; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java index 23730a907c..3a49354770 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PayoutTxFinalizedMessage.java @@ -27,7 +27,7 @@ import java.util.Arrays; @Immutable public final class PayoutTxFinalizedMessage extends TradeMessage implements MailboxMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; public final byte[] payoutTx; private final NodeAddress senderNodeAddress; diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java index 2b33335185..5e6cf1b3a7 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/PublishDepositTxRequest.java @@ -31,7 +31,7 @@ import java.util.List; @Immutable public final class PublishDepositTxRequest extends TradeMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; private static final Logger log = LoggerFactory.getLogger(PublishDepositTxRequest.class); diff --git a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java index 692d128ad2..f8bb508f80 100644 --- a/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java +++ b/core/src/main/java/io/bitsquare/trade/protocol/trade/messages/TradeMessage.java @@ -25,9 +25,9 @@ import javax.annotation.concurrent.Immutable; @Immutable public abstract class TradeMessage implements DirectMessage { // That object is sent over the wire, so we need to take care of version compatibility. - private static final long serialVersionUID = Version.NETWORK_PROTOCOL_VERSION; + private static final long serialVersionUID = Version.P2P_NETWORK_VERSION; - private final int networkId = Version.getNetworkId(); + private final int messageVersion = Version.getP2PMessageVersion(); public final String tradeId; @Override @@ -51,7 +51,7 @@ public abstract class TradeMessage implements DirectMessage { } @Override - public int networkId() { - return networkId; + public int getMessageVersion() { + return messageVersion; } } diff --git a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java index a935b6c023..0a25bcce6a 100644 --- a/gui/src/main/java/io/bitsquare/app/BitsquareApp.java +++ b/gui/src/main/java/io/bitsquare/app/BitsquareApp.java @@ -128,18 +128,24 @@ public class BitsquareApp extends Application { injector = Guice.createInjector(bitsquareAppModule); injector.getInstance(InjectorViewFactory.class).setInjector(injector); - Version.setNetworkId(injector.getInstance(BitsquareEnvironment.class).getBitcoinNetwork().ordinal()); - - // load the main view and create the main scene - CachingViewLoader viewLoader = injector.getInstance(CachingViewLoader.class); - mainView = (MainView) viewLoader.load(MainView.class); - mainView.setPersistedFilesCorrupted(corruptedDatabaseFiles); + Version.setBtcNetworkId(injector.getInstance(BitsquareEnvironment.class).getBitcoinNetwork().ordinal()); Storage.setDatabaseCorruptionHandler((String fileName) -> { corruptedDatabaseFiles.add(fileName); if (mainView != null) mainView.setPersistedFilesCorrupted(corruptedDatabaseFiles); }); + + // load the main view and create the main scene + CachingViewLoader viewLoader = injector.getInstance(CachingViewLoader.class); + mainView = (MainView) viewLoader.load(MainView.class); + mainView.setPersistedFilesCorrupted(corruptedDatabaseFiles); + + /* Storage.setDatabaseCorruptionHandler((String fileName) -> { + corruptedDatabaseFiles.add(fileName); + if (mainView != null) + mainView.setPersistedFilesCorrupted(corruptedDatabaseFiles); + });*/ scene = new Scene(mainView.getRoot(), 1000, 740); scene.getStylesheets().setAll( diff --git a/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java b/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java index e89926efc9..7fa2877914 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java +++ b/gui/src/main/java/io/bitsquare/gui/components/AddressTextField.java @@ -73,7 +73,8 @@ public class AddressTextField extends AnchorPane { } }); textField.focusTraversableProperty().set(focusTraversableProperty().get()); - focusedProperty().addListener((ov, oldValue, newValue) -> textField.requestFocus()); + //TODO app wide focus + //focusedProperty().addListener((ov, oldValue, newValue) -> textField.requestFocus()); Label copyIcon = new Label(); copyIcon.setLayoutY(3); diff --git a/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java b/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java index 746b1339e8..f1ec9f0da7 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java +++ b/gui/src/main/java/io/bitsquare/gui/components/TextFieldWithCopyIcon.java @@ -67,7 +67,8 @@ public class TextFieldWithCopyIcon extends AnchorPane { AnchorPane.setRightAnchor(textField, 30.0); AnchorPane.setLeftAnchor(textField, 0.0); textField.focusTraversableProperty().set(focusTraversableProperty().get()); - focusedProperty().addListener((ov, oldValue, newValue) -> textField.requestFocus()); + //TODO app wide focus + //focusedProperty().addListener((ov, oldValue, newValue) -> textField.requestFocus()); getChildren().addAll(textField, copyIcon); } diff --git a/gui/src/main/java/io/bitsquare/gui/components/TxIdTextField.java b/gui/src/main/java/io/bitsquare/gui/components/TxIdTextField.java index 68e1e9ce2d..4e2639012d 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/TxIdTextField.java +++ b/gui/src/main/java/io/bitsquare/gui/components/TxIdTextField.java @@ -85,7 +85,8 @@ public class TxIdTextField extends AnchorPane { AnchorPane.setRightAnchor(textField, 55.0); AnchorPane.setLeftAnchor(textField, 0.0); textField.focusTraversableProperty().set(focusTraversableProperty().get()); - focusedProperty().addListener((ov, oldValue, newValue) -> textField.requestFocus()); + //TODO app wide focus + //focusedProperty().addListener((ov, oldValue, newValue) -> textField.requestFocus()); getChildren().addAll(textField, copyIcon, progressIndicator); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainView.java b/gui/src/main/java/io/bitsquare/gui/main/MainView.java index ed4dd0b056..7d81c47cee 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainView.java @@ -18,6 +18,7 @@ package io.bitsquare.gui.main; import io.bitsquare.BitsquareException; +import io.bitsquare.app.BitsquareApp; import io.bitsquare.common.UserThread; import io.bitsquare.common.util.Tuple2; import io.bitsquare.gui.Navigation; @@ -184,11 +185,18 @@ public class MainView extends InitializableView { if (!persistedFilesCorrupted.isEmpty()) { // show warning that some files has been corrupted - new Popup().warning("Those data base file(s) are not compatible with our current code base." + - "\n" + persistedFilesCorrupted.toString() + - "\n\nWe made a backup of the corrupted file(s) and applied the default values." + - "\n\nThe backup is located at: [data directory]/db/corrupted" - ).show(); + new Popup().warning("We detected incompatible data base files!\n\n" + + "Those database file(s) are not compatible with our current code base:" + + "\n" + persistedFilesCorrupted.toString() + + "\n\nWe made a backup of the corrupted file(s) and applied the default values to a new " + + "database version." + + "\n\nThe backup is located at:\n[you local app data directory]/db/backup_of_corrupted_data.\n\n" + + "Please check if you have the latest version of Bitsquare installed.\n" + + "You can download it at:\nhttps://github.com/bitsquare/bitsquare/releases\n\n" + + "Please restart the application.") + .closeButtonText("Shut down") + .onClose(BitsquareApp.shutDownHandler::run) + .show(); } transitions.fadeOutAndRemove(splashScreen, 1500, actionEvent -> disposeSplashScreen()); @@ -358,7 +366,8 @@ public class MainView extends InitializableView { model.walletServiceErrorMsg.addListener((ov, oldValue, newValue) -> { if (newValue != null) { btcInfoLabel.setId("splash-error-state-msg"); - btcNetworkWarnMsgPopup = new Popup().warning(newValue).show(); + btcNetworkWarnMsgPopup = new Popup().warning(newValue); + btcNetworkWarnMsgPopup.show(); } else { btcInfoLabel.setId("footer-pane"); if (btcNetworkWarnMsgPopup != null) @@ -407,7 +416,8 @@ public class MainView extends InitializableView { p2PNetworkLabel.idProperty().bind(model.p2PNetworkLabelId); model.p2PNetworkWarnMsg.addListener((ov, oldValue, newValue) -> { if (newValue != null) { - p2PNetworkWarnMsgPopup = new Popup().warning(newValue).show(); + p2PNetworkWarnMsgPopup = new Popup().warning(newValue); + p2PNetworkWarnMsgPopup.show(); } else if (p2PNetworkWarnMsgPopup != null) { p2PNetworkWarnMsgPopup.hide(); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java index e430748b1d..5feaeac7d4 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java @@ -41,6 +41,9 @@ import io.bitsquare.locale.CountryUtil; import io.bitsquare.locale.CurrencyUtil; import io.bitsquare.p2p.P2PService; import io.bitsquare.p2p.P2PServiceListener; +import io.bitsquare.p2p.network.CloseConnectionReason; +import io.bitsquare.p2p.network.Connection; +import io.bitsquare.p2p.network.ConnectionListener; import io.bitsquare.payment.OKPayAccount; import io.bitsquare.trade.Trade; import io.bitsquare.trade.TradeManager; @@ -187,7 +190,7 @@ public class MainViewModel implements ViewModel { "There might be some network connection problems.\n\n" + "Please restart and try again.") .closeButtonText("Shut down") - .onClose(() -> BitsquareApp.shutDownHandler.run()) + .onClose(BitsquareApp.shutDownHandler::run) .show(); }); } @@ -211,6 +214,34 @@ public class MainViewModel implements ViewModel { private BooleanProperty initP2PNetwork() { final BooleanProperty p2pNetworkInitialized = new SimpleBooleanProperty(); p2PNetworkInfo.set("Connecting to Tor network..."); + p2PService.getNetworkNode().addConnectionListener(new ConnectionListener() { + @Override + public void onConnection(Connection connection) { + } + + @Override + public void onDisconnect(CloseConnectionReason closeConnectionReason, Connection connection) { + // We only check at seed nodes as they are running the latest version + // Other disconnects might be caused by peers running an older version + if (connection.getPeerType() == Connection.PeerType.SEED_NODE && + closeConnectionReason == CloseConnectionReason.RULE_VIOLATION) { + new Popup() + .warning("You got disconnected from a seed node.\n\n" + + "Reason for getting disconnected: " + connection.getRuleViolation().name() + "\n\n" + + "It might be that your installed version is not compatible with " + + "the network.\n\n" + + "Please check if you run the latest software version.\n" + + "You can download the latest version of Bitsquare at:\n" + + "https://github.com/bitsquare/bitsquare/releases/\n\n" + + "") + .show(); + } + } + + @Override + public void onError(Throwable throwable) { + } + }); p2PService.start(new P2PServiceListener() { @Override public void onTorNodeReady() { @@ -348,8 +379,9 @@ public class MainViewModel implements ViewModel { if (walletService.getWallet().isEncrypted() && (openOfferManager.getOpenOffers().size() > 0 || tradeManager.getTrades().size() > 0 - || disputeManager.getDisputesAsObservableList().size() > 0)) - walletPasswordPopup.show().onAesKey(aesKey -> tradeWalletService.setAesKey(aesKey)); + || disputeManager.getDisputesAsObservableList().size() > 0)) { + walletPasswordPopup.onAesKey(aesKey -> tradeWalletService.setAesKey(aesKey)).show(); + } if (tradeManager.pendingTradesInitializedProperty().get() && isSplashScreenRemoved.get()) applyTradePeriodState(); diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/arbitratorregistration/ArbitratorRegistrationView.java b/gui/src/main/java/io/bitsquare/gui/main/account/arbitratorregistration/ArbitratorRegistrationView.java index fd1352e711..a8f5fd2d37 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/arbitratorregistration/ArbitratorRegistrationView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/arbitratorregistration/ArbitratorRegistrationView.java @@ -24,6 +24,7 @@ import io.bitsquare.common.UserThread; import io.bitsquare.common.util.Tuple2; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; +import io.bitsquare.gui.popups.EnterPrivKeyPopup; import io.bitsquare.gui.popups.Popup; import io.bitsquare.gui.util.FormBuilder; import io.bitsquare.gui.util.ImageUtil; diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/content/seedwords/SeedWordsView.java b/gui/src/main/java/io/bitsquare/gui/main/account/content/seedwords/SeedWordsView.java index 650a701950..89af8bb842 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/content/seedwords/SeedWordsView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/account/content/seedwords/SeedWordsView.java @@ -114,13 +114,13 @@ public class SeedWordsView extends ActivatableView { private void askForPassword() { - walletPasswordPopup.show().onAesKey(aesKey -> { + walletPasswordPopup.onAesKey(aesKey -> { Wallet wallet = walletService.getWallet(); KeyCrypter keyCrypter = wallet.getKeyCrypter(); keyChainSeed = wallet.getKeyChainSeed(); DeterministicSeed decryptedSeed = keyChainSeed.decrypt(keyCrypter, "", aesKey); showSeedScreen(decryptedSeed); - }); + }).show(); } private void showSeedScreen(DeterministicSeed seed) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/disputes/arbitrator/ArbitratorDisputeView.java b/gui/src/main/java/io/bitsquare/gui/main/disputes/arbitrator/ArbitratorDisputeView.java index aac3ff1025..84ceeebc6d 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/disputes/arbitrator/ArbitratorDisputeView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/disputes/arbitrator/ArbitratorDisputeView.java @@ -21,9 +21,9 @@ import io.bitsquare.arbitration.Dispute; import io.bitsquare.arbitration.DisputeManager; import io.bitsquare.common.crypto.KeyRing; import io.bitsquare.gui.common.view.FxmlView; -import io.bitsquare.gui.main.disputes.DisputeSummaryPopup; import io.bitsquare.gui.main.disputes.trader.TraderDisputeView; import io.bitsquare.gui.popups.ContractPopup; +import io.bitsquare.gui.popups.DisputeSummaryPopup; import io.bitsquare.gui.popups.TradeDetailsPopup; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.trade.TradeManager; diff --git a/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java b/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java index cecaca26bf..a4375a0187 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java @@ -29,8 +29,8 @@ import io.bitsquare.gui.common.view.ActivatableView; import io.bitsquare.gui.common.view.FxmlView; import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.components.TableGroupHeadline; -import io.bitsquare.gui.main.disputes.DisputeSummaryPopup; import io.bitsquare.gui.popups.ContractPopup; +import io.bitsquare.gui.popups.DisputeSummaryPopup; import io.bitsquare.gui.popups.Popup; import io.bitsquare.gui.popups.TradeDetailsPopup; import io.bitsquare.gui.util.BSFormatter; diff --git a/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java b/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java index 281ed65d4b..a86dd42a36 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/funds/withdrawal/WithdrawalView.java @@ -310,10 +310,11 @@ public class WithdrawalView extends ActivatableView { } private void doWithdraw(Coin amount, FutureCallback callback) { - if (walletService.getWallet().isEncrypted()) - walletPasswordPopup.show().onAesKey(aesKey -> sendFunds(amount, aesKey, callback)); - else + if (walletService.getWallet().isEncrypted()) { + walletPasswordPopup.onAesKey(aesKey -> sendFunds(amount, aesKey, callback)).show(); + } else { sendFunds(amount, null, callback); + } } private void sendFunds(Coin amount, KeyParameter aesKey, FutureCallback callback) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java index 73e019efff..b003285713 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/createoffer/CreateOfferDataModel.java @@ -253,10 +253,10 @@ class CreateOfferDataModel extends ActivatableDataModel { void onPlaceOffer(Offer offer, TransactionResultHandler resultHandler) { if (walletService.getWallet().isEncrypted() && tradeWalletService.getAesKey() == null) { - walletPasswordPopup.show().onAesKey(aesKey -> { + walletPasswordPopup.onAesKey(aesKey -> { tradeWalletService.setAesKey(aesKey); doPlaceOffer(offer, resultHandler); - }); + }).show(); } else { doPlaceOffer(offer, resultHandler); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java index 6a2708ef16..3e6e837614 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java @@ -220,7 +220,7 @@ public class OfferBookView extends ActivatableViewAndModel onShowInfo(isPaymentAccountValidForOffer, hasMatchingArbitrator)); - } - } - } - @Override public void updateItem(final OfferBookListItem newItem, boolean empty) { super.updateItem(newItem, empty); if (newItem != null && !empty) { final Offer offer = newItem.getOffer(); - verifyIfTradable(offer); + + TableRow tableRow = getTableRow(); + if (tableRow != null) { + isPaymentAccountValidForOffer = model.isPaymentAccountValidForOffer(offer); + hasMatchingArbitrator = model.hasMatchingArbitrator(offer); + hasSameProtocolVersion = model.hasSameProtocolVersion(offer); + isTradable = isPaymentAccountValidForOffer && hasMatchingArbitrator && + hasSameProtocolVersion; + + tableRow.setOpacity(isTradable ? 1 : 0.4); + + if (isTradable) { + // set first row button as default + button.setDefaultButton(getIndex() == 0); + tableRow.setOnMouseClicked(null); + } else { + button.setDefaultButton(false); + tableRow.setOnMouseClicked(e -> + onShowInfo(isPaymentAccountValidForOffer, hasMatchingArbitrator, + hasSameProtocolVersion)); + } + } + String title; if (isTradable) { if (model.isMyOffer(offer)) { @@ -465,7 +475,7 @@ public class OfferBookView extends ActivatableViewAndModel onShowInfo(isPaymentAccountValidForOffer, hasMatchingArbitrator)); + button.setOnAction(e -> onShowInfo(isPaymentAccountValidForOffer, hasMatchingArbitrator, hasSameProtocolVersion)); } button.setText(title); diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java index ff57717b64..9557e367f1 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookViewModel.java @@ -18,6 +18,7 @@ package io.bitsquare.gui.main.offer.offerbook; import com.google.inject.Inject; +import io.bitsquare.app.Version; import io.bitsquare.common.handlers.ErrorMessageHandler; import io.bitsquare.common.handlers.ResultHandler; import io.bitsquare.gui.common.model.ActivatableViewModel; @@ -281,7 +282,6 @@ class OfferBookViewModel extends ActivatableViewModel { }); } - public boolean hasMatchingArbitrator(Offer offer) { for (NodeAddress offerArbitratorNodeAddress : offer.getArbitratorNodeAddresses()) { for (NodeAddress acceptedArbitratorNodeAddress : user.getAcceptedArbitratorAddresses()) { @@ -291,4 +291,8 @@ class OfferBookViewModel extends ActivatableViewModel { } return false; } + + public boolean hasSameProtocolVersion(Offer offer) { + return offer.getProtocolVersion() == Version.TRADE_PROTOCOL_VERSION; + } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferDataModel.java b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferDataModel.java index ea693c82fa..feb016b99b 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferDataModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferDataModel.java @@ -167,10 +167,10 @@ class TakeOfferDataModel extends ActivatableDataModel { // have it persisted as well. void onTakeOffer(TradeResultHandler tradeResultHandler) { if (walletService.getWallet().isEncrypted() && tradeWalletService.getAesKey() == null) { - walletPasswordPopup.show().onAesKey(aesKey -> { + walletPasswordPopup.onAesKey(aesKey -> { tradeWalletService.setAesKey(aesKey); doTakeOffer(tradeResultHandler); - }); + }).show(); } else { doTakeOffer(tradeResultHandler); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java index f194460798..3acf78039c 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/takeoffer/TakeOfferView.java @@ -182,11 +182,11 @@ public class TakeOfferView extends ActivatableViewAndModel { if (!oldValue && newValue) { isOfferAvailablePopup = new Popup().information(BSResources.get("takeOffer.fundsBox.isOfferAvailable")) - .show() .onClose(() -> { model.resetErrorMessage(); close(); - }).show(); + }); + isOfferAvailablePopup.show(); } }); diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesDataModel.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesDataModel.java index 7d6745a70a..2a6ceab902 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesDataModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesDataModel.java @@ -170,9 +170,9 @@ public class PendingTradesDataModel extends ActivatableDataModel { void onWithdrawRequest(String toAddress) { checkNotNull(trade, "trade must not be null"); - if (walletService.getWallet().isEncrypted()) - walletPasswordPopup.show().onAesKey(aesKey -> doWithdrawRequest(toAddress, aesKey)); - else + if (walletService.getWallet().isEncrypted()) { + walletPasswordPopup.onAesKey(aesKey -> doWithdrawRequest(toAddress, aesKey)).show(); + } else doWithdrawRequest(toAddress, null); } diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java index 2640a715db..9e316c2171 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java @@ -110,8 +110,9 @@ public class PendingTradesView extends ActivatableViewAndModel { - table.requestFocus(); - UserThread.execute(() -> table.getFocusModel().focus(index)); + //TODO app wide focus + //table.requestFocus(); + //UserThread.execute(() -> table.getFocusModel().focus(index)); }); } }; @@ -151,9 +152,10 @@ public class PendingTradesView extends ActivatableViewAndModel { + //TODO app wide focus table.getSelectionModel().select(index); - table.requestFocus(); - UserThread.execute(() -> table.getFocusModel().focus(index)); + //table.requestFocus(); + //UserThread.execute(() -> table.getFocusModel().focus(index)); }); } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/CompletedView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/CompletedView.java index 64a180103a..eb415bb463 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/CompletedView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/steps/CompletedView.java @@ -69,11 +69,12 @@ public class CompletedView extends TradeStepDetailsView { // We need to handle both cases: Address not set and address already set (when returning from other view) // We get address validation after focus out, so first make sure we loose focus and then set it again as hint for user to put address in UserThread.execute(() -> { - withdrawAddressTextField.requestFocus(); - UserThread.execute(() -> { + //TODO app wide focus + // withdrawAddressTextField.requestFocus(); + /* UserThread.execute(() -> { this.requestFocus(); UserThread.execute(() -> withdrawAddressTextField.requestFocus()); - }); + });*/ }); } diff --git a/gui/src/main/java/io/bitsquare/gui/popups/ContractPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/ContractPopup.java index 41e625289c..234c77e00e 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/ContractPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/ContractPopup.java @@ -62,7 +62,7 @@ public class ContractPopup extends Popup { width = 850; createGridPane(); addContent(); - createPopup(); + display(); return this; } @@ -152,7 +152,8 @@ public class ContractPopup extends Popup { addLabelTxIdTextField(gridPane, ++rowIndex, "Payout transaction ID:", dispute.getPayoutTxId()); Button cancelButton = addButtonAfterGroup(gridPane, ++rowIndex, "Close"); - cancelButton.requestFocus(); + //TODO app wide focus + //cancelButton.requestFocus(); cancelButton.setOnAction(e -> { closeHandlerOptional.ifPresent(closeHandler -> closeHandler.run()); hide(); diff --git a/gui/src/main/java/io/bitsquare/gui/popups/DisplayAlertMessagePopup.java b/gui/src/main/java/io/bitsquare/gui/popups/DisplayAlertMessagePopup.java index 0673181351..750b1fbb2e 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/DisplayAlertMessagePopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/DisplayAlertMessagePopup.java @@ -46,15 +46,14 @@ public class DisplayAlertMessagePopup extends Popup { public DisplayAlertMessagePopup() { } - public DisplayAlertMessagePopup show() { + public void show() { width = 700; // need to set headLine, otherwise the fields will not be created in addHeadLine headLine = "Important information!"; createGridPane(); addHeadLine(); addContent(); - createPopup(); - return this; + PopupManager.queueForDisplay(this); } public DisplayAlertMessagePopup alertMessage(Alert alert) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/disputes/DisputeSummaryPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/DisputeSummaryPopup.java similarity index 99% rename from gui/src/main/java/io/bitsquare/gui/main/disputes/DisputeSummaryPopup.java rename to gui/src/main/java/io/bitsquare/gui/popups/DisputeSummaryPopup.java index b78135eb29..9d6191ecb2 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/disputes/DisputeSummaryPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/DisputeSummaryPopup.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.gui.main.disputes; +package io.bitsquare.gui.popups; import io.bitsquare.arbitration.Dispute; import io.bitsquare.arbitration.DisputeManager; @@ -26,7 +26,6 @@ import io.bitsquare.btc.TradeWalletService; import io.bitsquare.btc.WalletService; import io.bitsquare.btc.exceptions.TransactionVerificationException; import io.bitsquare.common.util.Tuple2; -import io.bitsquare.gui.popups.Popup; import io.bitsquare.gui.util.BSFormatter; import io.bitsquare.gui.util.Layout; import io.bitsquare.gui.util.Transitions; @@ -89,7 +88,7 @@ public class DisputeSummaryPopup extends Popup { width = 850; createGridPane(); addContent(); - createPopup(); + PopupManager.queueForDisplay(this); } public DisputeSummaryPopup onClose(Runnable closeHandler) { diff --git a/gui/src/main/java/io/bitsquare/gui/popups/EmptyWalletPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/EmptyWalletPopup.java index 80d6fd91bf..0751051068 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/EmptyWalletPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/EmptyWalletPopup.java @@ -64,7 +64,7 @@ public class EmptyWalletPopup extends Popup { this.formatter = formatter; } - public EmptyWalletPopup show() { + public void show() { if (headLine == null) headLine = "Empty wallet"; @@ -72,8 +72,7 @@ public class EmptyWalletPopup extends Popup { createGridPane(); addHeadLine(); addContent(); - createPopup(); - return this; + PopupManager.queueForDisplay(this); } public EmptyWalletPopup onClose(Runnable closeHandler) { diff --git a/gui/src/main/java/io/bitsquare/gui/main/account/arbitratorregistration/EnterPrivKeyPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/EnterPrivKeyPopup.java similarity index 95% rename from gui/src/main/java/io/bitsquare/gui/main/account/arbitratorregistration/EnterPrivKeyPopup.java rename to gui/src/main/java/io/bitsquare/gui/popups/EnterPrivKeyPopup.java index e0b1a48cb1..aecb7ff028 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/account/arbitratorregistration/EnterPrivKeyPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/EnterPrivKeyPopup.java @@ -15,11 +15,10 @@ * along with Bitsquare. If not, see . */ -package io.bitsquare.gui.main.account.arbitratorregistration; +package io.bitsquare.gui.popups; import io.bitsquare.app.BitsquareApp; import io.bitsquare.gui.components.InputTextField; -import io.bitsquare.gui.popups.Popup; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.Label; @@ -50,7 +49,7 @@ public class EnterPrivKeyPopup extends Popup { public EnterPrivKeyPopup() { } - public EnterPrivKeyPopup show() { + public void show() { if (gridPane != null) { rowIndex = -1; gridPane.getChildren().clear(); @@ -63,9 +62,7 @@ public class EnterPrivKeyPopup extends Popup { addHeadLine(); addInputFields(); addButtons(); - createPopup(); - - return this; + PopupManager.queueForDisplay(this); } public EnterPrivKeyPopup onClose(Runnable closeHandler) { diff --git a/gui/src/main/java/io/bitsquare/gui/popups/OfferDetailsPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/OfferDetailsPopup.java index e6b0531e95..b6b4a3108b 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/OfferDetailsPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/OfferDetailsPopup.java @@ -79,7 +79,7 @@ public class OfferDetailsPopup extends Popup { width = 850; createGridPane(); addContent(); - createPopup(); + display(); return this; } @@ -90,7 +90,7 @@ public class OfferDetailsPopup extends Popup { width = 850; createGridPane(); addContent(); - createPopup(); + display(); return this; } diff --git a/gui/src/main/java/io/bitsquare/gui/popups/OpenEmergencyTicketPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/OpenEmergencyTicketPopup.java index 1b99ac38bd..54a7b3d3ab 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/OpenEmergencyTicketPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/OpenEmergencyTicketPopup.java @@ -42,7 +42,7 @@ public class OpenEmergencyTicketPopup extends Popup { public OpenEmergencyTicketPopup() { } - public OpenEmergencyTicketPopup show() { + public void show() { if (headLine == null) headLine = "Open support ticket"; @@ -50,8 +50,7 @@ public class OpenEmergencyTicketPopup extends Popup { createGridPane(); addHeadLine(); addContent(); - createPopup(); - return this; + PopupManager.queueForDisplay(this); } public OpenEmergencyTicketPopup onOpenTicket(ResultHandler openTicketHandler) { diff --git a/gui/src/main/java/io/bitsquare/gui/popups/Popup.java b/gui/src/main/java/io/bitsquare/gui/popups/Popup.java index 16c27e2047..97a78f9d61 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/Popup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/Popup.java @@ -78,7 +78,7 @@ public class Popup { public Popup() { } - public Popup show() { + public void show() { createGridPane(); addHeadLine(); @@ -91,13 +91,16 @@ public class Popup { addCloseButton(); addDontShowAgainCheckBox(); - createPopup(); - return this; + PopupManager.queueForDisplay(this); } public void hide() { MainView.removeBlur(); - stage.hide(); + if (stage != null) + stage.hide(); + else + log.warn("Stage is null"); + PopupManager.isHidden(this); } public Popup onClose(Runnable closeHandler) { @@ -207,7 +210,7 @@ public class Popup { FxTimer.runLater(Duration.ofMillis(Transitions.DEFAULT_DURATION), () -> MainView.blurLight()); } - protected void createPopup() { + public void display() { if (owner == null) owner = MainView.getRootContainer(); @@ -333,7 +336,8 @@ public class Popup { if (actionHandlerOptional.isPresent() || actionButtonText != null) { actionButton = new Button(actionButtonText == null ? "Ok" : actionButtonText); actionButton.setDefaultButton(true); - actionButton.requestFocus(); + //TODO app wide focus + //actionButton.requestFocus(); actionButton.setOnAction(event -> { hide(); actionHandlerOptional.ifPresent(actionHandler -> actionHandler.run()); @@ -367,4 +371,12 @@ public class Popup { else truncatedMessage = message; } + + @Override + public String toString() { + return "Popup{" + + "headLine='" + headLine + '\'' + + ", message='" + message + '\'' + + '}'; + } } diff --git a/gui/src/main/java/io/bitsquare/gui/popups/PopupManager.java b/gui/src/main/java/io/bitsquare/gui/popups/PopupManager.java new file mode 100644 index 0000000000..da8701ecd2 --- /dev/null +++ b/gui/src/main/java/io/bitsquare/gui/popups/PopupManager.java @@ -0,0 +1,40 @@ +package io.bitsquare.gui.popups; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; + +class PopupManager { + private static final Logger log = LoggerFactory.getLogger(PopupManager.class); + private static Queue popups = new LinkedBlockingQueue<>(3); + private static Popup displayedPopup; + + static void queueForDisplay(Popup popup) { + boolean result = popups.offer(popup); + if (!result) + log.warn("The capacity is full with popups in the queue.\n\t" + + "Not added new popup=" + popup); + displayNext(); + } + + static void isHidden(Popup popup) { + if (displayedPopup == null || displayedPopup == popup) { + displayedPopup = null; + displayNext(); + } else { + log.warn("We got a isHidden called with a wrong popup.\n\t" + + "popup (argument)=" + popup + "\n\tdisplayedPopup=" + displayedPopup); + } + } + + private static void displayNext() { + if (displayedPopup == null) { + if (!popups.isEmpty()) { + displayedPopup = popups.poll(); + displayedPopup.display(); + } + } + } +} diff --git a/gui/src/main/java/io/bitsquare/gui/popups/SelectDepositTxPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/SelectDepositTxPopup.java index 8638b2c893..2f820784bf 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/SelectDepositTxPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/SelectDepositTxPopup.java @@ -51,7 +51,7 @@ public class SelectDepositTxPopup extends Popup { public SelectDepositTxPopup() { } - public SelectDepositTxPopup show() { + public void show() { if (headLine == null) headLine = "Select deposit transaction for dispute"; @@ -60,8 +60,7 @@ public class SelectDepositTxPopup extends Popup { addHeadLine(); addContent(); addCloseButton(); - createPopup(); - return this; + PopupManager.queueForDisplay(this); } public SelectDepositTxPopup onSelect(Consumer selectHandler) { diff --git a/gui/src/main/java/io/bitsquare/gui/popups/SendAlertMessagePopup.java b/gui/src/main/java/io/bitsquare/gui/popups/SendAlertMessagePopup.java index a8e268021b..7f1411540d 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/SendAlertMessagePopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/SendAlertMessagePopup.java @@ -59,7 +59,7 @@ public class SendAlertMessagePopup extends Popup { public SendAlertMessagePopup() { } - public SendAlertMessagePopup show() { + public void show() { if (headLine == null) headLine = "Send global notification"; @@ -67,8 +67,7 @@ public class SendAlertMessagePopup extends Popup { createGridPane(); addHeadLine(); addContent(); - createPopup(); - return this; + PopupManager.queueForDisplay(this); } public SendAlertMessagePopup onAddAlertMessage(SendAlertMessageHandler sendAlertMessageHandler) { diff --git a/gui/src/main/java/io/bitsquare/gui/popups/TradeDetailsPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/TradeDetailsPopup.java index b66e23efed..6d93e2f394 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/TradeDetailsPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/TradeDetailsPopup.java @@ -65,7 +65,7 @@ public class TradeDetailsPopup extends Popup { width = 850; createGridPane(); addContent(); - createPopup(); + display(); return this; } @@ -191,7 +191,8 @@ public class TradeDetailsPopup extends Popup { } Button cancelButton = addButtonAfterGroup(gridPane, ++rowIndex, "Close"); - cancelButton.requestFocus(); + //TODO app wide focus + //cancelButton.requestFocus(); cancelButton.setOnAction(e -> { closeHandlerOptional.ifPresent(closeHandler -> closeHandler.run()); hide(); diff --git a/gui/src/main/java/io/bitsquare/gui/popups/WalletPasswordPopup.java b/gui/src/main/java/io/bitsquare/gui/popups/WalletPasswordPopup.java index 79ff4563a4..be793b2e8f 100644 --- a/gui/src/main/java/io/bitsquare/gui/popups/WalletPasswordPopup.java +++ b/gui/src/main/java/io/bitsquare/gui/popups/WalletPasswordPopup.java @@ -64,7 +64,7 @@ public class WalletPasswordPopup extends Popup { this.walletService = walletService; } - public WalletPasswordPopup show() { + public void show() { if (gridPane != null) { rowIndex = -1; gridPane.getChildren().clear(); @@ -77,9 +77,7 @@ public class WalletPasswordPopup extends Popup { addHeadLine(); addInputFields(); addButtons(); - createPopup(); - - return this; + PopupManager.queueForDisplay(this); } public WalletPasswordPopup onClose(Runnable closeHandler) { diff --git a/gui/src/main/resources/logback.xml b/gui/src/main/resources/logback.xml index cc18b4ecc4..f5f0290eb1 100644 --- a/gui/src/main/resources/logback.xml +++ b/gui/src/main/resources/logback.xml @@ -10,7 +10,12 @@ +