diff --git a/core/src/main/java/com/google/bitcoin/wallet/BasicKeyChain.java b/core/src/main/java/com/google/bitcoin/wallet/BasicKeyChain.java index e34984bc1..77bc32e48 100644 --- a/core/src/main/java/com/google/bitcoin/wallet/BasicKeyChain.java +++ b/core/src/main/java/com/google/bitcoin/wallet/BasicKeyChain.java @@ -210,6 +210,10 @@ public class BasicKeyChain implements EncryptableKeyChain { } } + public List> getListeners() { + return new ArrayList>(listeners); + } + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Serialization support diff --git a/core/src/main/java/com/google/bitcoin/wallet/KeyChainGroup.java b/core/src/main/java/com/google/bitcoin/wallet/KeyChainGroup.java index 31f4348f1..b22e12a5a 100644 --- a/core/src/main/java/com/google/bitcoin/wallet/KeyChainGroup.java +++ b/core/src/main/java/com/google/bitcoin/wallet/KeyChainGroup.java @@ -20,6 +20,7 @@ import com.google.bitcoin.core.*; import com.google.bitcoin.crypto.DeterministicKey; import com.google.bitcoin.crypto.KeyCrypter; import com.google.bitcoin.store.UnreadableWalletException; +import com.google.bitcoin.utils.ListenerRegistration; import com.google.bitcoin.utils.Threading; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; @@ -85,6 +86,8 @@ public class KeyChainGroup { private void createAndActivateNewHDChain() { final DeterministicKeyChain chain = new DeterministicKeyChain(new SecureRandom()); + for (ListenerRegistration registration : basic.getListeners()) + chain.addEventListener(registration.listener, registration.executor); if (lookaheadSize >= 0) chain.setLookaheadSize(lookaheadSize); chains.add(chain); diff --git a/core/src/test/java/com/google/bitcoin/core/WalletTest.java b/core/src/test/java/com/google/bitcoin/core/WalletTest.java index b98ca4482..6e342da3c 100644 --- a/core/src/test/java/com/google/bitcoin/core/WalletTest.java +++ b/core/src/test/java/com/google/bitcoin/core/WalletTest.java @@ -2361,4 +2361,20 @@ public class WalletTest extends TestWithWallet { wallet.notifyTransactionIsInBlock(tx.getHash(), block, AbstractBlockChain.NewBlockType.BEST_CHAIN, 1); assertEquals(Utils.COIN, wallet.getBalance()); } + + @Test + public void keyEvents() throws Exception { + // Check that we can register an event listener, generate some keys and the callbacks are invoked properly. + wallet = new Wallet(params); + final List keys = Lists.newLinkedList(); + wallet.addEventListener(new AbstractWalletEventListener() { + @Override + public void onKeysAdded(List k) { + keys.addAll(k); + } + }, Threading.SAME_THREAD); + wallet.setKeychainLookaheadSize(5); + wallet.freshReceiveKey(); + assertEquals(6, keys.size()); + } }