URI: 
       tTrezor: better messages during initialization - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit a7cb66d31e9b10e8ba3a44efc5e7678bd0fe9643
   DIR parent 1e030706cb96f19a7e55dbc01acae48b91b0ce14
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Fri, 22 Jan 2016 20:37:49 +0900
       
       Trezor: better messages during initialization
       
       Diffstat:
         M plugins/trezor/clientbase.py        |       2 +-
         M plugins/trezor/plugin.py            |      44 ++++++++++++++++++-------------
         M plugins/trezor/qt_generic.py        |       6 ++----
       
       3 files changed, 29 insertions(+), 23 deletions(-)
       ---
   DIR diff --git a/plugins/trezor/clientbase.py b/plugins/trezor/clientbase.py
       t@@ -61,7 +61,7 @@ class GuiMixin(object):
            def callback_WordRequest(self, msg):
                self.step += 1
                msg = _("Step %d/24.  Enter seed word as explained on "
       -                "your %s") % (self.step, self.device)
       +                "your %s:") % (self.step, self.device)
                word = self.handler.get_word(msg)
                # Unfortunately the device can't handle self.proto.Cancel()
                return self.proto.WordAck(word=word)
   DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py
       t@@ -4,6 +4,7 @@ import threading
        import time
        
        from binascii import unhexlify
       +from functools import partial
        from struct import pack
        
        from electrum.account import BIP32_Account
       t@@ -14,9 +15,9 @@ from electrum.i18n import _
        from electrum.plugins import BasePlugin, hook
        from electrum.transaction import (deserialize, is_extended_pubkey,
                                          Transaction, x_to_xpub)
       -from electrum.wallet import BIP32_HD_Wallet, BIP44_Wallet
       +from electrum.wallet import BIP44_Wallet
        from electrum.util import ThreadJob
       -from electrum.plugins import DeviceMgr
       +
        
        # Trezor initialization methods
        TIM_NEW, TIM_RECOVER, TIM_MNEMONIC, TIM_PRIVKEY = range(0, 4)
       t@@ -263,13 +264,14 @@ class TrezorCompatiblePlugin(BasePlugin, ThreadJob):
                wallet.last_operation = self.prevent_timeout
        
                # Initialization method
       -        msg = _("Please select how you want to initialize your %s.\n"
       -                "The first two are secure as no secret information is entered "
       -                "onto your computer.\nFor the last two methods you enter "
       -                "secrets into your computer and upload them to the device, "
       -                "and so you should do those on a computer you know to be "
       -                "trustworthy and free of malware."
       -        ) % self.device
       +        msg = _("Choose how you want to initialize your %s.\n\n"
       +                "The first two methods are secure as no secret information "
       +                "is entered into your computer.\n\n"
       +                "For the last two methods you input secrets on your keyboard "
       +                "and upload them to your %s, and so you should "
       +                "only do those on a computer you know to be trustworthy "
       +                "and free of malware."
       +        ) % (self.device, self.device)
        
                methods = [
                    # Must be short as QT doesn't word-wrap radio button text
       t@@ -294,7 +296,7 @@ class TrezorCompatiblePlugin(BasePlugin, ThreadJob):
        
                language = 'english'
        
       -        def initialize_device():
       +        def initialize_method():
                    client = self.get_client(wallet)
        
                    if method == TIM_NEW:
       t@@ -316,7 +318,17 @@ class TrezorCompatiblePlugin(BasePlugin, ThreadJob):
                        client.load_device_by_xprv(item, pin, passphrase_protection,
                                                   label, language)
        
       -        wallet.thread.add(initialize_device)
       +        return initialize_method
       +
       +    def setup_device(self, wallet, on_done):
       +        '''Called when creating a new wallet.  Select the device to use.  If
       +        the device is uninitialized, go through the intialization
       +        process.  Then create the wallet accounts.'''
       +        create_hd_task = partial(wallet.create_hd_account, None)
       +        initialized = self.select_device(wallet)
       +        if not initialized:
       +            wallet.thread.add(self.initialize_device(wallet))
       +        wallet.thread.add(create_hd_task, on_done=on_done)
        
            def unpaired_devices(self, handler):
                '''Returns all connected, unpaired devices as a list of clients and a
       t@@ -331,23 +343,19 @@ class TrezorCompatiblePlugin(BasePlugin, ThreadJob):
                    if not client:
                        continue
                    state = states[client.is_initialized()]
       -            label = client.label() or _("An unnamed device")
       -            descr = "%s: device ID %s (%s)" % (label, device.id_, state)
       +            label = client.label() or _("An unnamed %s") % self.device
       +            descr = "%s (%s)" % (label, state)
                    infos.append((device, descr, client.is_initialized()))
        
                return infos
        
            def select_device(self, wallet):
       -        '''Called when creating a new wallet.  Select the device to use.  If
       -        the device is uninitialized, go through the intialization
       -        process.'''
                msg = _("Please select which %s device to use:") % self.device
                infos = self.unpaired_devices(wallet.handler)
                labels = [info[1] for info in infos]
                device, descr, init = infos[wallet.handler.query_choice(msg, labels)]
                self.device_manager().pair_wallet(wallet, device.id_)
       -        if not init:
       -            self.initialize_device(wallet)
       +        return init
        
            def on_restore_wallet(self, wallet, wizard):
                assert isinstance(wallet, self.wallet_class)
   DIR diff --git a/plugins/trezor/qt_generic.py b/plugins/trezor/qt_generic.py
       t@@ -252,11 +252,9 @@ def qt_plugin_class(base_plugin_class):
                assert type(wallet) == self.wallet_class
                wallet.handler = self.create_handler(wizard)
                wallet.thread = TaskThread(wizard, wizard.on_error)
       -        self.select_device(wallet)
       -        # Create accounts in separate thread; wait until done
       +        # Setup device and create accounts in separate thread; wait until done
                loop = QEventLoop()
       -        wallet.thread.add(partial(wallet.create_hd_account, None),
       -                          on_done=loop.quit)
       +        self.setup_device(wallet, loop.quit)
                loop.exec_()
        
            @hook