diff --git a/core/src/main/java/org/bitcoinj/wallet/Wallet.java b/core/src/main/java/org/bitcoinj/wallet/Wallet.java index 77730c791..07069ba6a 100644 --- a/core/src/main/java/org/bitcoinj/wallet/Wallet.java +++ b/core/src/main/java/org/bitcoinj/wallet/Wallet.java @@ -72,6 +72,7 @@ import org.bitcoinj.wallet.listeners.WalletCoinsReceivedEventListener; import org.bitcoinj.wallet.listeners.WalletCoinsSentEventListener; import org.bitcoinj.wallet.listeners.WalletReorganizeEventListener; +import org.bitcoinj.wallet.listeners.WalletResetEventListener; import org.slf4j.*; import org.bouncycastle.crypto.params.*; @@ -203,6 +204,8 @@ protected boolean removeEldestEntry(Map.Entry eldest) { = new CopyOnWriteArrayList<>(); private final CopyOnWriteArrayList> reorganizeListeners = new CopyOnWriteArrayList<>(); + private final CopyOnWriteArrayList> resetListeners + = new CopyOnWriteArrayList<>(); private final CopyOnWriteArrayList> scriptChangeListeners = new CopyOnWriteArrayList<>(); private final CopyOnWriteArrayList> transactionConfidenceListeners @@ -3041,6 +3044,14 @@ public void addReorganizeEventListener(Executor executor, WalletReorganizeEventL reorganizeListeners.add(new ListenerRegistration<>(listener, executor)); } + /** + * Adds an event listener object. Methods on this object are called when something interesting happens, + * like receiving money. The listener is executed by the given executor. + */ + public void addResetEventListener(Executor executor, WalletResetEventListener listener) { + // This is thread safe, so we don't need to take the lock. + resetListeners.add(new ListenerRegistration<>(listener, executor)); + } /** * Adds an event listener object. Methods on this object are called when scripts * watched by this wallet change. Runs the listener methods in the user thread. @@ -3122,6 +3133,14 @@ public boolean removeReorganizeEventListener(WalletReorganizeEventListener liste return ListenerRegistration.removeFromList(listener, reorganizeListeners); } + /** + * Removes the given event listener object. Returns true if the listener was removed, false if that listener + * was never added. + */ + public boolean removeResetEventListener(WalletResetEventListener listener) { + return ListenerRegistration.removeFromList(listener, resetListeners); + } + /** * Removes the given event listener object. Returns true if the listener was removed, false if that listener * was never added. @@ -3208,6 +3227,18 @@ public void run() { } } + protected void queueOnReset() { + checkState(lock.isHeldByCurrentThread()); + for (final ListenerRegistration registration : resetListeners) { + registration.executor.execute(new Runnable() { + @Override + public void run() { + registration.listener.onWalletReset(Wallet.this); + } + }); + } + } + protected void queueOnScriptsChanged(final List