electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 7c42957a7ce492cdd99031a28335966288158aa7
parent b6393cbdf2215b500bd1506122e995b6a91b745f
Author: ThomasV <thomasv@electrum.org>
Date:   Thu, 16 Jun 2016 07:47:40 +0200

kivy: finish multisig in instalwizard

Diffstat:
Mgui/kivy/main_window.py | 15+++++++++++++++
Mgui/kivy/uix/dialogs/create_restore.py | 114++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mgui/kivy/uix/dialogs/installwizard.py | 28++++++++++++++++++++++------
Mgui/kivy/uix/screens.py | 14+-------------
4 files changed, 119 insertions(+), 52 deletions(-)

diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py @@ -346,6 +346,21 @@ class ElectrumWindow(App): activity.bind(on_activity_result=on_qr_result) integrator.initiateScan() + def do_share(self, data): + if platform != 'android': + return + from jnius import autoclass, cast + JS = autoclass('java.lang.String') + Intent = autoclass('android.content.Intent') + sendIntent = Intent() + sendIntent.setAction(Intent.ACTION_SEND) + sendIntent.setType("text/plain") + sendIntent.putExtra(Intent.EXTRA_TEXT, JS(data)) + PythonActivity = autoclass('org.renpy.android.PythonActivity') + currentActivity = cast('android.app.Activity', PythonActivity.mActivity) + it = Intent.createChooser(sendIntent, cast('java.lang.CharSequence', JS("Share Bitcoin Request"))) + currentActivity.startActivity(it) + def build(self): return Builder.load_file('gui/kivy/main.kv') diff --git a/gui/kivy/uix/dialogs/create_restore.py b/gui/kivy/uix/dialogs/create_restore.py @@ -40,6 +40,12 @@ Builder.load_string(''' on_press: if self.root: self.root.dispatch('on_press', self) on_release: if self.root: self.root.dispatch('on_release', self) +<BigLabel@Label> + color: .854, .925, .984, 1 + size_hint: 1, None + text_size: self.width, None + height: self.texture_size[1] + bold: True <-WizardDialog> text_color: .854, .925, .984, 1 @@ -196,12 +202,8 @@ Builder.load_string(''' <RestoreSeedDialog> word: '' - Label: - color: root.text_color - size_hint: 1, None - text_size: self.width, None - height: self.texture_size[1] - text: "[b]ENTER YOUR SEED PHRASE[/b]" + BigLabel: + text: "ENTER YOUR SEED PHRASE" GridLayout cols: 1 padding: 0, '12dp' @@ -301,12 +303,10 @@ Builder.load_string(''' text: '<' <AddXpubDialog> - Label: - color: root.text_color - size_hint: 1, None - text_size: self.width, None - height: self.texture_size[1] - text: "[b]MASTER PUBLIC KEY[/b]" + title: '' + message: '' + BigLabel: + text: root.title GridLayout cols: 1 padding: 0, '12dp' @@ -315,12 +315,11 @@ Builder.load_string(''' size_hint: 1, None height: self.minimum_height SeedButton: - id: text_input_seed + id: text_input text: '' - on_text: Clock.schedule_once(root.on_text) + on_text: Clock.schedule_once(root.check_text) SeedLabel: text: root.message - GridLayout rows: 1 spacing: '12dp' @@ -340,15 +339,44 @@ Builder.load_string(''' on_release: root.do_clear() +<ShowXpubDialog> + xpub: '' + message: _('Here is your master public key. Share it with your cosigners.') + BigLabel: + text: "MASTER PUBLIC KEY" + GridLayout + cols: 1 + padding: 0, '12dp' + orientation: 'vertical' + spacing: '12dp' + size_hint: 1, None + height: self.minimum_height + SeedButton: + id: text_input + text: root.xpub + SeedLabel: + text: root.message + GridLayout + rows: 1 + spacing: '12dp' + size_hint: 1, None + height: self.minimum_height + WizardButton: + text: _('QR code') + on_release: root.do_qr() + WizardButton: + text: _('Copy') + on_release: root.do_copy() + WizardButton: + text: _('Share') + on_release: root.do_share() + + <ShowSeedDialog> spacing: '12dp' value: 'next' - Label: - color: root.text_color - size_hint: 1, None - text_size: self.width, None - height: self.texture_size[1] - text: "[b]PLEASE WRITE DOWN YOUR SEED PHRASE[/b]" + BigLabel: + text: "PLEASE WRITE DOWN YOUR SEED PHRASE" GridLayout: id: grid cols: 1 @@ -546,30 +574,50 @@ class RestoreSeedDialog(WizardDialog): tis._keyboard.unbind(on_key_down=self.on_key_down) tis.focus = False -class AddXpubDialog(WizardDialog): - message = StringProperty('') +class ShowXpubDialog(WizardDialog): def __init__(self, **kwargs): - super(AddXpubDialog, self).__init__(**kwargs) - self._test = kwargs['test'] + WizardDialog.__init__(self, **kwargs) self.app = App.get_running_app() + self.xpub = kwargs['xpub'] + self.ids.next.disabled = False - def get_text(self): - ti = self.ids.text_input_seed - return unicode(ti.text).strip() + def do_copy(self): + self.app._clipboard.copy(self.xpub) - def on_text(self, dt): + def do_share(self): + self.app.do_share(self.xpub) + + def do_qr(self): + from qr_dialog import QRDialog + popup = QRDialog(_("Master Public Key"), self.xpub, True) + popup.open() + + +class AddXpubDialog(WizardDialog): + + def __init__(self, **kwargs): + WizardDialog.__init__(self, **kwargs) + self.app = App.get_running_app() + self._test = kwargs['test'] + self.title = kwargs['title'] + self.message = kwargs['message'] + + def check_text(self, dt): self.ids.next.disabled = not bool(self._test(self.get_text())) + def get_text(self): + ti = self.ids.text_input + return unicode(ti.text).strip() + def scan_xpub(self): def on_complete(text): - self.ids.text_input_seed.text = text + self.ids.text_input.text = text self.app.scan_qr(on_complete) def do_paste(self): - self.ids.text_input_seed.text = test_xpub if is_test else unicode(self.app._clipboard.paste()) + self.ids.text_input.text = test_xpub if is_test else unicode(self.app._clipboard.paste()) def do_clear(self): - self.ids.text_input_seed.text = '' - + self.ids.text_input.text = '' diff --git a/gui/kivy/uix/dialogs/installwizard.py b/gui/kivy/uix/dialogs/installwizard.py @@ -13,7 +13,7 @@ import threading from functools import partial import weakref -from create_restore import WizardChoiceDialog, ShowSeedDialog, RestoreSeedDialog, AddXpubDialog, WizardMultisigDialog +from create_restore import WizardChoiceDialog, ShowSeedDialog, RestoreSeedDialog, AddXpubDialog, ShowXpubDialog, WizardMultisigDialog from password_dialog import PasswordDialog @@ -135,8 +135,9 @@ class InstallWizard(Widget): return text = _dlg.get_text() self.run('create_wallet', (text, None)) - msg = _('To create a watching-only wallet, paste your master public key, or scan it using the camera button.') - AddXpubDialog(test=Wallet.is_mpk, message=msg, on_release=on_xpub).open() + title = "MASTER PUBLIC KEY" + message = _('To create a watching-only wallet, paste your master public key, or scan it using the camera button.') + AddXpubDialog(title=title, message=message, test=Wallet.is_mpk, on_release=on_xpub).open() def create_standard(self): self.wallet_type = 'standard' @@ -158,15 +159,30 @@ class InstallWizard(Widget): action = self.wallet.get_action() self.run(action) + def add_cosigners(self): + def on_release(_dlg, btn): + _dlg.close() + self.run('add_cosigner') + xpub = self.wallet.master_public_keys.get('x1/') + ShowXpubDialog(xpub=xpub, test=Wallet.is_xpub, on_release=on_release).open() + + def add_cosigner(self): def on_xpub(_dlg, btn): xpub = _dlg.get_text() _dlg.close() - self.wallet.add_master_public_key("x%d/" % 2, xpub) + if btn is _dlg.ids.back: + self.run('add_cosigners') + return + if xpub: + self.wallet.add_master_public_key("x%d/" % 2, xpub) action = self.wallet.get_action() + if action == 'add_cosigners': action = 'add_cosigner' self.run(action) - msg = _('Paste your cosigner xpub, or scan it using the camera button.') - AddXpubDialog(test=Wallet.is_xpub, message=msg, on_release=on_xpub).open() + + title = "ADD COSIGNERS" + message = _('Please paste your cosigners master public key, or scan it using the camera button.') + AddXpubDialog(title=title, message=message, test=Wallet.is_xpub, on_release=on_xpub).open() def create_main_account(self): self.wallet.create_main_account() diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py @@ -357,20 +357,8 @@ class ReceiveScreen(CScreen): qr.set_data(uri) def do_share(self): - if platform != 'android': - return uri = self.get_URI() - from jnius import autoclass, cast - JS = autoclass('java.lang.String') - Intent = autoclass('android.content.Intent') - sendIntent = Intent() - sendIntent.setAction(Intent.ACTION_SEND) - sendIntent.setType("text/plain") - sendIntent.putExtra(Intent.EXTRA_TEXT, JS(uri)) - PythonActivity = autoclass('org.renpy.android.PythonActivity') - currentActivity = cast('android.app.Activity', PythonActivity.mActivity) - it = Intent.createChooser(sendIntent, cast('java.lang.CharSequence', JS("Share Bitcoin Request"))) - currentActivity.startActivity(it) + self.app.do_share(uri) def do_copy(self): uri = self.get_URI()