Skip to content

Commit

Permalink
update offer state on same thread to fix blocking
Browse files Browse the repository at this point in the history
  • Loading branch information
woodser committed Apr 7, 2024
1 parent 6fea58c commit 59fbd80
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 72 deletions.
2 changes: 1 addition & 1 deletion core/src/main/java/haveno/core/offer/Offer.java
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ public void resetState() {
///////////////////////////////////////////////////////////////////////////////////////////

public void setState(Offer.State state) {
UserThread.await(() -> stateProperty().set(state));
stateProperty.set(state);
}

public ObjectProperty<Offer.State> stateProperty() {
Expand Down
36 changes: 19 additions & 17 deletions desktop/src/main/java/haveno/desktop/main/market/MarketView.java
Original file line number Diff line number Diff line change
Expand Up @@ -200,22 +200,24 @@ private String getAllTradesWithReferralId() {
}

private String getAllOffersWithReferralId() {
List<String> list = offerBook.getOfferBookListItems().stream()
.map(OfferBookListItem::getOffer)
.filter(offer -> offer.getExtraDataMap() != null)
.filter(offer -> offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID) != null)
.map(offer -> {
StringBuilder sb = new StringBuilder();
sb.append("Offer ID: ").append(offer.getId()).append("\n")
.append("Type: ").append(offer.getDirection().name()).append("\n")
.append("Market: ").append(CurrencyUtil.getCurrencyPair(offer.getCurrencyCode())).append("\n")
.append("Price: ").append(FormattingUtils.formatPrice(offer.getPrice())).append("\n")
.append("Amount: ").append(DisplayUtils.formatAmount(offer, formatter)).append(" BTC\n")
.append("Payment method: ").append(Res.get(offer.getPaymentMethod().getId())).append("\n")
.append("ReferralID: ").append(offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID));
return sb.toString();
})
.collect(Collectors.toList());
return Joiner.on("\n\n").join(list);
synchronized (offerBook.getOfferBookListItems()) {
List<String> list = offerBook.getOfferBookListItems().stream()
.map(OfferBookListItem::getOffer)
.filter(offer -> offer.getExtraDataMap() != null)
.filter(offer -> offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID) != null)
.map(offer -> {
StringBuilder sb = new StringBuilder();
sb.append("Offer ID: ").append(offer.getId()).append("\n")
.append("Type: ").append(offer.getDirection().name()).append("\n")
.append("Market: ").append(CurrencyUtil.getCurrencyPair(offer.getCurrencyCode())).append("\n")
.append("Price: ").append(FormattingUtils.formatPrice(offer.getPrice())).append("\n")
.append("Amount: ").append(DisplayUtils.formatAmount(offer, formatter)).append(" BTC\n")
.append("Payment method: ").append(Res.get(offer.getPaymentMethod().getId())).append("\n")
.append("ReferralID: ").append(offer.getExtraDataMap().get(OfferPayload.REFERRAL_ID));
return sb.toString();
})
.collect(Collectors.toList());
return Joiner.on("\n\n").join(list);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -147,16 +147,18 @@ class OfferBookChartViewModel extends ActivatableViewModel {

private void fillTradeCurrencies() {
// Don't use a set as we need all entries
List<TradeCurrency> tradeCurrencyList = offerBookListItems.stream()
.map(e -> {
String currencyCode = e.getOffer().getCurrencyCode();
Optional<TradeCurrency> tradeCurrencyOptional = CurrencyUtil.getTradeCurrency(currencyCode);
return tradeCurrencyOptional.orElse(null);
})
.filter(Objects::nonNull)
.collect(Collectors.toList());

currencyListItems.updateWithCurrencies(tradeCurrencyList, null);
synchronized (offerBookListItems) {
List<TradeCurrency> tradeCurrencyList = offerBookListItems.stream()
.map(e -> {
String currencyCode = e.getOffer().getCurrencyCode();
Optional<TradeCurrency> tradeCurrencyOptional = CurrencyUtil.getTradeCurrency(currencyCode);
return tradeCurrencyOptional.orElse(null);
})
.filter(Objects::nonNull)
.collect(Collectors.toList());

currencyListItems.updateWithCurrencies(tradeCurrencyList, null);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -350,50 +350,52 @@ void onFocusOutAmountTextField(boolean oldValue, boolean newValue, String userIn
///////////////////////////////////////////////////////////////////////////////////////////

private void applyOfferState(Offer.State state) {
offerWarning.set(null);

// We have 2 situations handled here:
// 1. when clicking take offer in the offerbook screen, we do the availability check
// 2. Before actually taking the offer in the take offer screen, we check again the availability as some time might have passed in the meantime
// So we use the takeOfferRequested flag to display different network_messages depending on the context.
switch (state) {
case UNKNOWN:
break;
case OFFER_FEE_RESERVED:
// irrelevant for taker
break;
case AVAILABLE:
isOfferAvailable.set(true);
updateButtonDisableState();
break;
case NOT_AVAILABLE:
if (takeOfferRequested)
offerWarning.set(Res.get("takeOffer.failed.offerNotAvailable"));
else
offerWarning.set(Res.get("takeOffer.failed.offerTaken"));
takeOfferRequested = false;
break;
case REMOVED:
if (!takeOfferRequested)
offerWarning.set(Res.get("takeOffer.failed.offerRemoved"));

takeOfferRequested = false;
break;
case MAKER_OFFLINE:
if (takeOfferRequested)
offerWarning.set(Res.get("takeOffer.failed.offererNotOnline"));
else
offerWarning.set(Res.get("takeOffer.failed.offererOffline"));
takeOfferRequested = false;
break;
default:
log.error("Unhandled offer state: " + state);
break;
}

updateSpinnerInfo();

updateButtonDisableState();
UserThread.execute(() -> {
offerWarning.set(null);

// We have 2 situations handled here:
// 1. when clicking take offer in the offerbook screen, we do the availability check
// 2. Before actually taking the offer in the take offer screen, we check again the availability as some time might have passed in the meantime
// So we use the takeOfferRequested flag to display different network_messages depending on the context.
switch (state) {
case UNKNOWN:
break;
case OFFER_FEE_RESERVED:
// irrelevant for taker
break;
case AVAILABLE:
isOfferAvailable.set(true);
updateButtonDisableState();
break;
case NOT_AVAILABLE:
if (takeOfferRequested)
offerWarning.set(Res.get("takeOffer.failed.offerNotAvailable"));
else
offerWarning.set(Res.get("takeOffer.failed.offerTaken"));
takeOfferRequested = false;
break;
case REMOVED:
if (!takeOfferRequested)
offerWarning.set(Res.get("takeOffer.failed.offerRemoved"));

takeOfferRequested = false;
break;
case MAKER_OFFLINE:
if (takeOfferRequested)
offerWarning.set(Res.get("takeOffer.failed.offererNotOnline"));
else
offerWarning.set(Res.get("takeOffer.failed.offererOffline"));
takeOfferRequested = false;
break;
default:
log.error("Unhandled offer state: " + state);
break;
}

updateSpinnerInfo();

updateButtonDisableState();
});
}

private void applyTradeErrorMessage(@Nullable String errorMessage) {
Expand Down

0 comments on commit 59fbd80

Please sign in to comment.