reset internal state and popup warning if main wallet swapped

This commit is contained in:
woodser 2024-05-18 09:48:22 -04:00
parent ffdbe73693
commit bee93bf45f
6 changed files with 43 additions and 1 deletions

View file

@ -97,6 +97,7 @@ import javafx.beans.property.BooleanProperty;
import javafx.beans.property.DoubleProperty; import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty; import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty; import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener; import javafx.beans.value.ChangeListener;
import javafx.collections.SetChangeListener; import javafx.collections.SetChangeListener;
@ -139,6 +140,7 @@ public class HavenoSetup {
private final MediationManager mediationManager; private final MediationManager mediationManager;
private final RefundManager refundManager; private final RefundManager refundManager;
private final ArbitrationManager arbitrationManager; private final ArbitrationManager arbitrationManager;
private final StringProperty topErrorMsg = new SimpleStringProperty();
@Setter @Setter
@Nullable @Nullable
private Consumer<Runnable> displayTacHandler; private Consumer<Runnable> displayTacHandler;
@ -717,6 +719,10 @@ public class HavenoSetup {
return walletAppSetup.getWalletServiceErrorMsg(); return walletAppSetup.getWalletServiceErrorMsg();
} }
public StringProperty getTopErrorMsg() {
return topErrorMsg;
}
public StringProperty getXmrSplashSyncIconId() { public StringProperty getXmrSplashSyncIconId() {
return walletAppSetup.getXmrSplashSyncIconId(); return walletAppSetup.getXmrSplashSyncIconId();
} }

View file

@ -140,6 +140,11 @@ public final class XmrAddressEntryList implements PersistableEnvelope, Persisted
return newAddressEntry; return newAddressEntry;
} }
public void clear() {
entrySet.clear();
requestPersistence();
}
public void requestPersistence() { public void requestPersistence() {
persistenceManager.requestPersistence(); persistenceManager.requestPersistence();
} }

View file

@ -1372,6 +1372,9 @@ public class XmrWalletService {
// reapply connection after wallet synced // reapply connection after wallet synced
onConnectionChanged(xmrConnectionService.getConnection()); onConnectionChanged(xmrConnectionService.getConnection());
// reset internal state if main wallet was swapped
resetIfWalletChanged();
// signal that main wallet is synced // signal that main wallet is synced
doneDownload(); doneDownload();
@ -1409,6 +1412,23 @@ public class XmrWalletService {
} }
} }
private void resetIfWalletChanged() {
getAddressEntryListAsImmutableList(); // TODO: using getter to create base address if necessary
List<XmrAddressEntry> baseAddresses = getAddressEntries(XmrAddressEntry.Context.BASE_ADDRESS);
if (baseAddresses.size() > 1 || (baseAddresses.size() == 1 && !baseAddresses.get(0).getAddressString().equals(wallet.getPrimaryAddress()))) {
String warningMsg = "New Monero wallet detected. Resetting internal state.";
if (!tradeManager.getOpenTrades().isEmpty()) warningMsg += "\n\nWARNING: Your open trades will settle to the payout address in the OLD wallet!"; // TODO: allow payout address to be updated in PaymentSentMessage, PaymentReceivedMessage, and DisputeOpenedMessage?
HavenoUtils.havenoSetup.getTopErrorMsg().set(warningMsg);
// reset address entries
xmrAddressEntryList.clear();
getAddressEntryListAsImmutableList(); // recreate base address
// cancel offers
tradeManager.getOpenOfferManager().removeAllOpenOffers(null);
}
}
private void syncWithProgress() { private void syncWithProgress() {
// show sync progress // show sync progress

View file

@ -678,6 +678,13 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
} }
}); });
model.getTopErrorMsg().addListener((ov, oldValue, newValue) -> {
log.warn("top level warning has been set! " + newValue);
if (newValue != null) {
new Popup().warning(newValue).show();
}
});
// temporarily disabled due to high CPU usage (per issue #4649) // temporarily disabled due to high CPU usage (per issue #4649)
//model.getCombinedSyncProgress().addListener((ov, oldValue, newValue) -> { //model.getCombinedSyncProgress().addListener((ov, oldValue, newValue) -> {
// if ((double) newValue >= 1) { // if ((double) newValue >= 1) {

View file

@ -641,6 +641,10 @@ public class MainViewModel implements ViewModel, HavenoSetup.HavenoSetupListener
return havenoSetup.getWalletServiceErrorMsg(); return havenoSetup.getWalletServiceErrorMsg();
} }
StringProperty getTopErrorMsg() {
return havenoSetup.getTopErrorMsg();
}
StringProperty getXmrSplashSyncIconId() { StringProperty getXmrSplashSyncIconId() {
return havenoSetup.getXmrSplashSyncIconId(); return havenoSetup.getXmrSplashSyncIconId();
} }

View file

@ -88,7 +88,7 @@ class OpenOffersDataModel extends ActivatableDataModel {
private void applyList() { private void applyList() {
list.clear(); list.clear();
list.addAll(openOfferManager.getObservableList().stream().map(OpenOfferListItem::new).collect(Collectors.toList())); list.addAll(openOfferManager.getOpenOffers().stream().map(OpenOfferListItem::new).collect(Collectors.toList()));
// we sort by date, earliest first // we sort by date, earliest first
list.sort((o1, o2) -> o2.getOffer().getDate().compareTo(o1.getOffer().getDate())); list.sort((o1, o2) -> o2.getOffer().getDate().compareTo(o1.getOffer().getDate()));