URI: 
       tremove old android GUI - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 8f4fe39cc93e7a6f9d95bdda49f1e35b086ffca7
   DIR parent 6c2f14a77b03f3677bdb06fd6db3cb6eafb5565b
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed, 10 Feb 2016 14:09:33 +0100
       
       remove old android GUI
       
       Diffstat:
         D contrib/make_android                |      37 -------------------------------
         D gui/android.py                      |    1016 -------------------------------
       
       2 files changed, 0 insertions(+), 1053 deletions(-)
       ---
   DIR diff --git a/contrib/make_android b/contrib/make_android
       t@@ -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
       -
   DIR diff --git a/gui/android.py b/gui/android.py
       t@@ -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)