commit 8f4fe39cc93e7a6f9d95bdda49f1e35b086ffca7
parent 6c2f14a77b03f3677bdb06fd6db3cb6eafb5565b
Author: ThomasV <thomasv@electrum.org>
Date: Wed, 10 Feb 2016 14:09:33 +0100
remove old android GUI
Diffstat:
2 files changed, 0 insertions(+), 1053 deletions(-)
diff --git a/contrib/make_android b/contrib/make_android
@@ -1,37 +0,0 @@
-#!/usr/bin/python2
-
-if __name__ == '__main__':
- import sys, re, shutil, os, hashlib
- import imp
- os.chdir(os.path.dirname(os.path.realpath(__file__)))
- os.chdir('..')
-
- v = imp.load_source('version', 'lib/version.py')
- version = v.ELECTRUM_VERSION
-
- if not ( os.path.exists('packages')):
- print "The packages directory is missing."
- sys.exit()
-
- target = 'dist/e4a-%s'%version
- os.system('rm -rf %s'%target)
- os.mkdir(target)
- shutil.copyfile('electrum', target + '/e4a.py')
- shutil.copyfile('scripts/authenticator.py', target + '/authenticator.py')
- shutil.copytree("packages",'dist/e4a-%s/packages'%version, ignore=shutil.ignore_patterns('*.pyc'))
- shutil.copytree("lib",'dist/e4a-%s/lib'%version, ignore=shutil.ignore_patterns('*.pyc'))
- os.mkdir(target + '/gui')
- shutil.copyfile('gui/android.py', target + '/gui/android.py')
- open(target + '/gui/__init__.py','w').close()
- os.mkdir(target + '/plugins')
- shutil.copyfile('plugins/__init__.py', target + '/plugins/__init__.py')
-
- os.chdir("dist")
- # create the zip file
- os.system( "zip -qr e4a-%s.zip e4a-%s"%(version, version) )
- os.system( "rm -rf e4a-%s"%(version) )
-
- # change filename because some 3G carriers do not allow users to download a zip file...
- e4a_name = "e4a-%s.zip"%version
- print "dist/%s"%e4a_name
-
diff --git a/gui/android.py b/gui/android.py
@@ -1,1016 +0,0 @@
-#!/usr/bin/env python
-#
-# Electrum - lightweight Bitcoin client
-# Copyright (C) 2011 thomasv@gitorious
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-
-
-from __future__ import absolute_import
-import android
-from decimal import Decimal
-import datetime, re
-
-from electrum import SimpleConfig, Wallet, WalletStorage, format_satoshis
-from electrum.bitcoin import is_address, COIN, TYPE_ADDRESS
-from electrum import util
-
-
-def modal_dialog(title, msg = None):
- droid.dialogCreateAlert(title,msg)
- droid.dialogSetPositiveButtonText('OK')
- droid.dialogShow()
- droid.dialogGetResponse()
- droid.dialogDismiss()
-
-def modal_input(title, msg, value = None, etype=None):
- droid.dialogCreateInput(title, msg, value, etype)
- droid.dialogSetPositiveButtonText('OK')
- droid.dialogSetNegativeButtonText('Cancel')
- droid.dialogShow()
- response = droid.dialogGetResponse()
- result = response.result
- droid.dialogDismiss()
-
- if result is None:
- print "modal input: result is none"
- return modal_input(title, msg, value, etype)
-
- if result.get('which') == 'positive':
- return result.get('value')
-
-def modal_question(q, msg, pos_text = 'OK', neg_text = 'Cancel'):
- droid.dialogCreateAlert(q, msg)
- droid.dialogSetPositiveButtonText(pos_text)
- droid.dialogSetNegativeButtonText(neg_text)
- droid.dialogShow()
- response = droid.dialogGetResponse()
- result = response.result
- droid.dialogDismiss()
-
- if result is None:
- print "modal question: result is none"
- return modal_question(q,msg, pos_text, neg_text)
-
- return result.get('which') == 'positive'
-
-def edit_label(addr):
- v = modal_input('Edit label', None, wallet.labels.get(addr))
- if v is not None:
- wallet.set_label(addr, v)
- droid.fullSetProperty("labelTextView", "text", v)
-
-def select_from_contacts():
- title = 'Contacts:'
- droid.dialogCreateAlert(title)
- l = contacts.keys()
- droid.dialogSetItems(l)
- droid.dialogSetPositiveButtonText('New contact')
- droid.dialogShow()
- response = droid.dialogGetResponse().result
- droid.dialogDismiss()
-
- if response.get('which') == 'positive':
- return 'newcontact'
-
- result = response.get('item')
- if result is not None:
- t, v = contacts.get(result)
- return v
-
-
-
-def protocol_name(p):
- if p == 't': return 'TCP'
- if p == 's': return 'SSL'
-
-
-def protocol_dialog(host, protocol, z):
- droid.dialogCreateAlert('Protocol', host)
- protocols = filter(lambda x: x in "ts", z.keys())
- l = []
- current = protocols.index(protocol)
- for p in protocols:
- l.append(protocol_name(p))
- droid.dialogSetSingleChoiceItems(l, current)
- droid.dialogSetPositiveButtonText('OK')
- droid.dialogSetNegativeButtonText('Cancel')
- droid.dialogShow()
- response = droid.dialogGetResponse().result
- selected_item = droid.dialogGetSelectedItems().result
- droid.dialogDismiss()
-
- if not response:
- return
- if not selected_item:
- return
- if response.get('which') == 'positive':
- return protocols[selected_item[0]]
-
-
-
-
-def make_layout(s, scrollable = False):
- content = """
-
- <LinearLayout
- android:id="@+id/zz"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#ff222222">
-
- <TextView
- android:id="@+id/textElectrum"
- android:text="Electrum"
- android:textSize="7pt"
- android:textColor="#ff4444ff"
- android:gravity="left"
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- />
- </LinearLayout>
-
- %s """%s
-
- if scrollable:
- content = """
- <ScrollView
- android:id="@+id/scrollview"
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
-
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
-
- %s
-
- </LinearLayout>
- </ScrollView>
- """%content
-
-
- return """<?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/background"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#ff000022">
-
- %s
- </LinearLayout>"""%content
-
-
-
-
-def main_layout():
- h = get_history_layout(15)
- l = make_layout("""
- <TextView android:id="@+id/balanceTextView"
- android:layout_width="match_parent"
- android:text=""
- android:textColor="#ffffffff"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:padding="7dip"
- android:textSize="8pt"
- android:gravity="center_vertical|center_horizontal|left">
- </TextView>
-
- <TextView android:id="@+id/historyTextView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Recent transactions"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center_vertical|center_horizontal|center">
- </TextView>
- %s """%h,True)
- return l
-
-
-
-def qr_layout(addr, amount, message):
- addr_view= """
- <TextView android:id="@+id/addrTextView"
- android:layout_width="match_parent"
- android:layout_height="50"
- android:text="%s"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center_vertical|center_horizontal|center">
- </TextView>"""%addr
- if amount:
- amount_view = """
- <TextView android:id="@+id/amountTextView"
- android:layout_width="match_parent"
- android:layout_height="50"
- android:text="Amount: %s"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center_vertical|center_horizontal|center">
- </TextView>"""%format_satoshis(amount)
- else:
- amount_view = ""
- if message:
- message_view = """
- <TextView android:id="@+id/messageTextView"
- android:layout_width="match_parent"
- android:layout_height="50"
- android:text="Message: %s"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center_vertical|center_horizontal|center">
- </TextView>"""%message
- else:
- message_view = ""
-
- return make_layout("""
- %s
- %s
- %s
- <ImageView
- android:id="@+id/qrView"
- android:gravity="center"
- android:layout_width="match_parent"
- android:layout_height="350"
- android:antialias="false"
- android:src="file:///sdcard/sl4a/qrcode.bmp" />
- """%(addr_view, amount_view, message_view), True)
-
-payto_layout = make_layout("""
-
- <TextView android:id="@+id/recipientTextView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Pay to:"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="left">
- </TextView>
-
-
- <EditText android:id="@+id/recipient"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:tag="Tag Me" android:inputType="text">
- </EditText>
-
- <LinearLayout android:id="@+id/linearLayout1"
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
- <Button android:id="@+id/buttonQR" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="From QR code"></Button>
- <Button android:id="@+id/buttonContacts" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="From Contacts"></Button>
- </LinearLayout>
-
-
- <TextView android:id="@+id/labelTextView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Message:"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="left">
- </TextView>
-
- <EditText android:id="@+id/message"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:tag="Tag Me" android:inputType="text">
- </EditText>
-
- <TextView android:id="@+id/amountLabelTextView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Amount:"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="left">
- </TextView>
-
- <EditText android:id="@+id/amount"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:tag="Tag Me" android:inputType="numberDecimal">
- </EditText>
-
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content" android:id="@+id/linearLayout1">
- <Button android:id="@+id/buttonPay" android:layout_width="wrap_content"
- android:layout_height="wrap_content" android:text="Send"></Button>
- </LinearLayout>""",False)
-
-
-
-settings_layout = make_layout(""" <ListView
- android:id="@+id/myListView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" />""")
-
-
-def get_history_values(n):
- values = []
- h = wallet.get_history()
- length = min(n, len(h))
- for i in range(length):
- tx_hash, conf, value, timestamp, balance = h[-i-1]
- try:
- dt = datetime.datetime.fromtimestamp( timestamp )
- if dt.date() == dt.today().date():
- time_str = str( dt.time() )
- else:
- time_str = str( dt.date() )
- except Exception:
- time_str = 'pending'
- conf_str = 'v' if conf else 'o'
- label = wallet.get_label(tx_hash)
- label = label.replace('<','').replace('>','')
- values.append((conf_str, ' ' + time_str, ' ' + format_satoshis(value, True), ' ' + label))
-
- return values
-
-
-def get_history_layout(n):
- rows = ""
- i = 0
- values = get_history_values(n)
- for v in values:
- a,b,c,d = v
- color = "#ff00ff00" if a == 'v' else "#ffff0000"
- rows += """
- <TableRow>
- <TextView
- android:id="@+id/hl_%d_col1"
- android:layout_column="0"
- android:text="%s"
- android:textColor="%s"
- android:padding="3" />
- <TextView
- android:id="@+id/hl_%d_col2"
- android:layout_column="1"
- android:text="%s"
- android:padding="3" />
- <TextView
- android:id="@+id/hl_%d_col3"
- android:layout_column="2"
- android:text="%s"
- android:padding="3" />
- <TextView
- android:id="@+id/hl_%d_col4"
- android:layout_column="3"
- android:text="%s"
- android:padding="4" />
- </TableRow>"""%(i,a,color,i,b,i,c,i,d)
- i += 1
-
- output = """
-<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:stretchColumns="0,1,2,3">
- %s
-</TableLayout>"""% rows
- return output
-
-
-def set_history_layout(n):
- values = get_history_values(n)
- i = 0
- for v in values:
- a,b,c,d = v
- droid.fullSetProperty("hl_%d_col1"%i,"text", a)
-
- if a == 'v':
- droid.fullSetProperty("hl_%d_col1"%i, "textColor","#ff00ff00")
- else:
- droid.fullSetProperty("hl_%d_col1"%i, "textColor","#ffff0000")
-
- droid.fullSetProperty("hl_%d_col2"%i,"text", b)
- droid.fullSetProperty("hl_%d_col3"%i,"text", c)
- droid.fullSetProperty("hl_%d_col4"%i,"text", d)
- i += 1
-
-
-
-
-status_text = ''
-def update_layout():
- global status_text
- if not network.is_connected():
- text = "Not connected..."
- elif not wallet.up_to_date:
- text = "Synchronizing..."
- else:
- c, u, x = wallet.get_balance()
- text = "Balance:"+format_satoshis(c)
- if u:
- text += ' [' + format_satoshis(u,True).strip() + ']'
- if x:
- text += ' [' + format_satoshis(x,True).strip() + ']'
-
-
- # vibrate if status changed
- if text != status_text:
- if status_text and network.is_connected() and wallet.up_to_date:
- droid.vibrate()
- status_text = text
-
- droid.fullSetProperty("balanceTextView", "text", status_text)
-
- if wallet.up_to_date:
- set_history_layout(15)
-
-
-
-
-def pay_to(recipient, amount, label):
-
- if wallet.use_encryption:
- password = droid.dialogGetPassword('Password').result
- if not password: return
- else:
- password = None
-
- droid.dialogCreateSpinnerProgress("Electrum", "signing transaction...")
- droid.dialogShow()
- try:
- tx = wallet.mktx([(TYPE_ADDRESS, recipient, amount)], password, config)
- except Exception as e:
- modal_dialog('error', e.message)
- droid.dialogDismiss()
- return
-
- if label:
- wallet.set_label(tx.hash(), label)
-
- droid.dialogDismiss()
-
- r, h = wallet.sendtx( tx )
- if r:
- modal_dialog('Payment sent', h)
- return True
- else:
- modal_dialog('Error', h)
-
-
-
-
-
-
-
-def make_new_contact():
- code = droid.scanBarcode()
- r = code.result
- if r:
- data = str(r['extras']['SCAN_RESULT']).strip()
- if data:
- if re.match('^bitcoin:', data):
- out = util.parse_URI(data)
- address = out.get('address')
- elif is_address(data):
- address = data
- else:
- address = None
- if address:
- if modal_question('Add to contacts?', address):
- # fixme: ask for key
- contacts[address] = ('address', address)
- else:
- modal_dialog('Invalid address', data)
-
-
-do_refresh = False
-
-def update_callback(event):
- global do_refresh
- print "gui callback", network.is_connected()
- do_refresh = True
- droid.eventPost("refresh",'z')
-
-def main_loop():
- global do_refresh
-
- update_layout()
- out = None
- quitting = False
- while out is None:
-
- event = droid.eventWait(1000).result
- if event is None:
- if do_refresh:
- update_layout()
- do_refresh = False
- continue
-
- print "got event in main loop", repr(event)
- if event == 'OK': continue
- if event is None: continue
- if not event.get("name"): continue
-
- # request 2 taps before we exit
- if event["name"]=="key":
- if event["data"]["key"] == '4':
- if quitting:
- out = 'quit'
- else:
- quitting = True
- else: quitting = False
-
- if event["name"]=="click":
- id=event["data"]["id"]
-
- elif event["name"]=="settings":
- out = 'settings'
-
- elif event["name"] in menu_commands:
- out = event["name"]
-
- if out == 'contacts':
- global contact_addr
- contact_addr = select_from_contacts()
- if contact_addr == 'newcontact':
- make_new_contact()
- contact_addr = None
- if not contact_addr:
- out = None
-
- elif out == "receive":
- global receive_addr
- domain = wallet.addresses(include_change = False)
- for addr in domain:
- if not wallet.history.get(addr):
- receive_addr = addr
- break
- else:
- out = None
-
- return out
-
-
-def payto_loop():
- global recipient
- if recipient:
- droid.fullSetProperty("recipient","text",recipient)
- recipient = None
-
- out = None
- while out is None:
- event = droid.eventWait().result
- if not event: continue
- print "got event in payto loop", event
- if event == 'OK': continue
- if not event.get("name"): continue
-
- if event["name"] == "click":
- id = event["data"]["id"]
-
- if id=="buttonPay":
-
- droid.fullQuery()
- recipient = droid.fullQueryDetail("recipient").result.get('text')
- message = droid.fullQueryDetail("message").result.get('text')
- amount = droid.fullQueryDetail('amount').result.get('text')
-
- if not is_address(recipient):
- modal_dialog('Error','Invalid Bitcoin address')
- continue
-
- try:
- amount = int(COIN * Decimal(amount))
- except Exception:
- modal_dialog('Error','Invalid amount')
- continue
-
- result = pay_to(recipient, amount, message)
- if result:
- out = 'main'
-
- elif id=="buttonContacts":
- addr = select_from_contacts()
- droid.fullSetProperty("recipient", "text", addr)
-
- elif id=="buttonQR":
- code = droid.scanBarcode()
- r = code.result
- if r:
- data = str(r['extras']['SCAN_RESULT']).strip()
- if data:
- print "data", data
- if re.match('^bitcoin:', data):
- rr = util.parse_URI(data)
- amount = rr.get('amount')
- address = rr.get('address')
- message = rr.get('message', '')
- if amount:
- amount = str(Decimal(amount)/COIN)
- droid.fullSetProperty("recipient", "text", address)
- droid.fullSetProperty("amount", "text", amount)
- droid.fullSetProperty("message", "text", message)
- elif is_address(data):
- droid.fullSetProperty("recipient", "text", data)
- else:
- modal_dialog('Error','cannot parse QR code\n'+data)
-
-
- elif event["name"] in menu_commands:
- out = event["name"]
-
- elif event["name"]=="key":
- if event["data"]["key"] == '4':
- out = 'main'
-
- #elif event["name"]=="screen":
- # if event["data"]=="destroy":
- # out = 'main'
-
- return out
-
-
-receive_addr = ''
-receive_amount = None
-receive_message = None
-
-contact_addr = ''
-recipient = ''
-
-def receive_loop():
- global receive_addr, receive_amount, receive_message
- print "receive loop"
- receive_URI = util.create_URI(receive_addr, receive_amount, receive_message)
- make_bitmap(receive_URI)
- droid.fullShow(qr_layout(receive_addr, receive_amount, receive_message))
- out = None
- while out is None:
- event = droid.eventWait().result
- if not event:
- continue
-
- elif event["name"]=="key":
- if event["data"]["key"] == '4':
- out = 'main'
-
- elif event["name"]=="clipboard":
- droid.setClipboard(receive_URI)
- modal_dialog('URI copied to clipboard', receive_URI)
-
- elif event["name"]=="amount":
- amount = modal_input('Amount', 'Amount you want to receive (in BTC). ', format_satoshis(receive_amount) if receive_amount else None, "numberDecimal")
- if amount is not None:
- receive_amount = int(COIN * Decimal(amount)) if amount else None
- out = 'receive'
-
- elif event["name"]=="message":
- message = modal_input('Message', 'Message in your request', receive_message)
- if message is not None:
- receive_message = unicode(message)
- out = 'receive'
-
- return out
-
-def contacts_loop():
- global recipient
- out = None
- while out is None:
- event = droid.eventWait().result
- print "got event", event
- if event["name"]=="key":
- if event["data"]["key"] == '4':
- out = 'main'
-
- elif event["name"]=="clipboard":
- droid.setClipboard(contact_addr)
- modal_dialog('Address copied to clipboard',contact_addr)
-
- elif event["name"]=="edit":
- edit_label(contact_addr)
-
- elif event["name"]=="paytocontact":
- recipient = contact_addr
- out = 'send'
-
- elif event["name"]=="deletecontact":
- if modal_question('delete contact', contact_addr):
- out = 'main'
-
- return out
-
-
-def server_dialog(servers):
- droid.dialogCreateAlert("Public servers")
- droid.dialogSetItems( servers.keys() )
- droid.dialogSetPositiveButtonText('Private server')
- droid.dialogShow()
- response = droid.dialogGetResponse().result
- droid.dialogDismiss()
- if not response: return
-
- if response.get('which') == 'positive':
- return modal_input('Private server', None)
-
- i = response.get('item')
- if i is not None:
- response = servers.keys()[i]
- return response
-
-
-def show_seed():
- if wallet.use_encryption:
- password = droid.dialogGetPassword('Seed').result
- if not password: return
- else:
- password = None
-
- try:
- seed = wallet.get_mnemonic(password)
- except Exception:
- modal_dialog('error','incorrect password')
- return
-
- modal_dialog('Your seed is', seed)
-
-def change_password_dialog():
- if wallet.use_encryption:
- password = droid.dialogGetPassword('Your wallet is encrypted').result
- if password is None: return
- else:
- password = None
-
- try:
- wallet.check_password(password)
- except Exception:
- modal_dialog('error','incorrect password')
- return
-
- new_password = droid.dialogGetPassword('Choose a password').result
- if new_password == None:
- return
-
- if new_password != '':
- password2 = droid.dialogGetPassword('Confirm new password').result
- if new_password != password2:
- modal_dialog('error','passwords do not match')
- return
-
- wallet.update_password(password, new_password)
- if new_password:
- modal_dialog('Password updated','your wallet is encrypted')
- else:
- modal_dialog('No password','your wallet is not encrypted')
- return True
-
-
-def settings_loop():
-
-
- def set_listview():
- host, port, p, proxy_config, auto_connect = network.get_parameters()
- fee = str(Decimal(wallet.fee_per_kb(config)) / COIN)
- is_encrypted = 'yes' if wallet.use_encryption else 'no'
- protocol = protocol_name(p)
- droid.fullShow(settings_layout)
- droid.fullSetList("myListView",['Server: ' + host, 'Protocol: '+ protocol, 'Port: '+port, 'Transaction fee/kb: '+fee, 'Password: '+is_encrypted, 'Seed'])
-
- set_listview()
-
- out = None
- while out is None:
- event = droid.eventWait()
- event = event.result
- print "got event", event
- if event == 'OK': continue
- if not event: continue
-
- servers = network.get_servers()
- name = event.get("name")
- if not name: continue
-
- if name == "itemclick":
- pos = event["data"]["position"]
- host, port, protocol, proxy_config, auto_connect = network.get_parameters()
- network_changed = False
-
- if pos == "0": #server
- host = server_dialog(servers)
- if host:
- p = servers[host]
- port = p[protocol]
- network_changed = True
-
- elif pos == "1": #protocol
- if host in servers:
- protocol = protocol_dialog(host, protocol, servers[host])
- if protocol:
- z = servers[host]
- port = z[protocol]
- network_changed = True
-
- elif pos == "2": #port
- a_port = modal_input('Port number', 'If you use a public server, this field is set automatically when you set the protocol', port, "number")
- if a_port != port:
- port = a_port
- network_changed = True
-
- elif pos == "3": #fee
- fee = modal_input(
- 'Transaction fee',
- 'The fee will be this amount multiplied by the number of inputs in your transaction. ',
- str(Decimal(wallet.fee_per_kb(config)) / COIN), "numberDecimal")
- if fee:
- try:
- fee = int(COIN * Decimal(fee))
- except Exception:
- modal_dialog('error','invalid fee value')
- config.set_key('fee_per_kb', fee)
- set_listview()
-
- elif pos == "4":
- if change_password_dialog():
- set_listview()
-
- elif pos == "5":
- show_seed()
-
- if network_changed:
- proxy = None
- auto_connect = False
- try:
- network.set_parameters(host, port, protocol, proxy, auto_connect)
- except Exception:
- modal_dialog('error','invalid server')
- set_listview()
-
- elif name in menu_commands:
- out = event["name"]
-
- elif name == 'cancel':
- out = 'main'
-
- elif name == "key":
- if event["data"]["key"] == '4':
- out = 'main'
-
- return out
-
-def add_menu(s):
- droid.clearOptionsMenu()
- if s == 'main':
- droid.addOptionsMenuItem("Send","send",None,"")
- droid.addOptionsMenuItem("Receive","receive",None,"")
- droid.addOptionsMenuItem("Contacts","contacts",None,"")
- droid.addOptionsMenuItem("Settings","settings",None,"")
- elif s == 'receive':
- droid.addOptionsMenuItem("Copy","clipboard",None,"")
- droid.addOptionsMenuItem("Amount","amount",None,"")
- droid.addOptionsMenuItem("Message","message",None,"")
- elif s == 'contacts':
- droid.addOptionsMenuItem("Copy","clipboard",None,"")
- droid.addOptionsMenuItem("Label","edit",None,"")
- droid.addOptionsMenuItem("Pay to","paytocontact",None,"")
- #droid.addOptionsMenuItem("Delete","deletecontact",None,"")
-
-
-def make_bitmap(data):
- # fixme: this is highly inefficient
- droid.dialogCreateSpinnerProgress("please wait")
- droid.dialogShow()
- try:
- import qrcode
- from electrum import bmp
- qr = qrcode.QRCode()
- qr.add_data(data)
- bmp.save_qrcode(qr,"/sdcard/sl4a/qrcode.bmp")
- finally:
- droid.dialogDismiss()
-
-
-
-
-droid = android.Android()
-menu_commands = ["send", "receive", "settings", "contacts", "main"]
-wallet = None
-network = None
-contacts = None
-config = None
-
-class ElectrumGui:
-
- def __init__(self, _config, daemon, plugins):
- global wallet, network, contacts, config
- network = daemon.network
- config = _config
- network.register_callback(update_callback, ['updated'])
-
- contacts = util.StoreDict(config, 'contacts')
-
- storage = WalletStorage(config.get_wallet_path())
- if not storage.file_exists:
- action = self.restore_or_create()
- if not action:
- exit()
-
- password = droid.dialogGetPassword('Choose a password').result
- if password:
- password2 = droid.dialogGetPassword('Confirm password').result
- if password != password2:
- modal_dialog('Error','passwords do not match')
- exit()
- else:
- # set to None if it's an empty string
- password = None
-
- if action == 'create':
- wallet = Wallet(storage)
- seed = wallet.make_seed()
- modal_dialog('Your seed is:', seed)
- wallet.add_seed(seed, password)
- wallet.create_master_keys(password)
- wallet.create_main_account(password)
- elif action == 'restore':
- seed = self.seed_dialog()
- if not seed:
- exit()
- if not Wallet.is_seed(seed):
- exit()
- wallet = Wallet.from_seed(seed, password, storage)
- else:
- exit()
-
- msg = "Creating wallet" if action == 'create' else "Restoring wallet"
- droid.dialogCreateSpinnerProgress("Electrum", msg)
- droid.dialogShow()
- wallet.start_threads(network)
- if action == 'restore':
- wallet.wait_until_synchronized()
- else:
- wallet.synchronize()
- droid.dialogDismiss()
- droid.vibrate()
-
- else:
- wallet = Wallet(storage)
- wallet.start_threads(network)
-
-
- def main(self):
- s = 'main'
- while True:
- add_menu(s)
- if s == 'main':
- droid.fullShow(main_layout())
- s = main_loop()
-
- elif s == 'send':
- droid.fullShow(payto_layout)
- s = payto_loop()
-
- elif s == 'receive':
- s = receive_loop()
-
- elif s == 'contacts':
- make_bitmap(contact_addr)
- droid.fullShow(qr_layout(contact_addr, None, None))
- s = contacts_loop()
-
- elif s == 'settings':
- s = settings_loop()
-
- else:
- break
-
- droid.makeToast("Bye!")
-
-
- def restore_or_create(self):
- droid.dialogCreateAlert("Wallet not found","Do you want to create a new wallet, or restore an existing one?")
- droid.dialogSetPositiveButtonText('Create')
- droid.dialogSetNeutralButtonText('Restore')
- droid.dialogSetNegativeButtonText('Cancel')
- droid.dialogShow()
- response = droid.dialogGetResponse().result
- droid.dialogDismiss()
- if not response: return
- if response.get('which') == 'negative':
- return
- return 'restore' if response.get('which') == 'neutral' else 'create'
-
-
- def seed_dialog(self):
- if modal_question("Enter your seed", "Input method", 'QR Code', 'mnemonic'):
- code = droid.scanBarcode()
- r = code.result
- if r:
- seed = r['extras']['SCAN_RESULT']
- else:
- return
- else:
- seed = modal_input('Mnemonic', 'please enter your code')
- return str(seed)