mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-09-01 09:45:18 +00:00
first version
This commit is contained in:
parent
d46b37b3ea
commit
1f79d6c25d
1 changed files with 141 additions and 107 deletions
|
@ -29,8 +29,21 @@ import datetime
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def modal_dialog(title, msg):
|
||||||
|
droid.dialogCreateAlert(title,msg)
|
||||||
|
droid.dialogSetPositiveButtonText('OK')
|
||||||
|
droid.dialogShow()
|
||||||
|
droid.dialogGetResponse()
|
||||||
|
droid.dialogDismiss()
|
||||||
|
|
||||||
|
def modal_question(q,msg):
|
||||||
|
droid.dialogCreateAlert(q, msg)
|
||||||
|
droid.dialogSetPositiveButtonText('OK')
|
||||||
|
droid.dialogSetNegativeButtonText('Cancel')
|
||||||
|
droid.dialogShow()
|
||||||
|
response = droid.dialogGetResponse().result
|
||||||
|
droid.dialogDismiss()
|
||||||
|
return response.get('which') == 'positive'
|
||||||
|
|
||||||
def select_from_contacts():
|
def select_from_contacts():
|
||||||
title = 'Contacts:'
|
title = 'Contacts:'
|
||||||
|
@ -68,6 +81,26 @@ def select_from_addresses():
|
||||||
return addr
|
return addr
|
||||||
|
|
||||||
|
|
||||||
|
def protocol_dialog(host, z):
|
||||||
|
droid.dialogCreateAlert('Protocol',host)
|
||||||
|
protocols = z.keys()
|
||||||
|
l = []
|
||||||
|
for p in protocols:
|
||||||
|
if p == 't': l.append('TCP/stratum')
|
||||||
|
if p == 'h': l.append('HTTP/Stratum')
|
||||||
|
if p == 'n': l.append('TCP/native')
|
||||||
|
droid.dialogSetSingleChoiceItems(l)
|
||||||
|
droid.dialogSetPositiveButtonText('OK')
|
||||||
|
droid.dialogSetNegativeButtonText('Cancel')
|
||||||
|
droid.dialogShow()
|
||||||
|
response = droid.dialogGetResponse().result
|
||||||
|
if response.get('which') == 'positive':
|
||||||
|
response = droid.dialogGetSelectedItems().result[0]
|
||||||
|
droid.dialogDismiss()
|
||||||
|
p = protocols[response]
|
||||||
|
port = z[p]
|
||||||
|
return host + ':' + port + ':' + p
|
||||||
|
|
||||||
|
|
||||||
def qr_code_layout(addr):
|
def qr_code_layout(addr):
|
||||||
return """<html>
|
return """<html>
|
||||||
|
@ -93,13 +126,17 @@ def qr_code_layout(addr):
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<form onsubmit="cb(); return false;">
|
<form onsubmit="cb(); return false;">
|
||||||
<input type="submit" value="Exit" />
|
<input type="submit" value="Back" />
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>"""%addr
|
</html>"""%addr
|
||||||
|
|
||||||
|
|
||||||
title = """
|
title = """
|
||||||
|
"""
|
||||||
|
|
||||||
|
def make_layout(s, scrollable):
|
||||||
|
content = """
|
||||||
<TextView android:id="@+id/titleTextView"
|
<TextView android:id="@+id/titleTextView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="100"
|
android:layout_height="100"
|
||||||
|
@ -109,9 +146,28 @@ title = """
|
||||||
android:textColor="0xff0055ff"
|
android:textColor="0xff0055ff"
|
||||||
android:textSize="30" >
|
android:textSize="30" >
|
||||||
</TextView>
|
</TextView>
|
||||||
"""
|
|
||||||
|
|
||||||
def make_layout(s):
|
%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"?>
|
return """<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:id="@+id/background"
|
android:id="@+id/background"
|
||||||
|
@ -119,31 +175,15 @@ def make_layout(s):
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="#ff000022">
|
android:background="#ff000022">
|
||||||
%s
|
|
||||||
%s
|
%s
|
||||||
</LinearLayout>"""%(title,s)
|
</LinearLayout>"""%content
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main_layout():
|
def main_layout():
|
||||||
return """<?xml version="1.0" encoding="utf-8"?>
|
return make_layout("""
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:background="#ff000022"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ScrollView
|
|
||||||
android:id="@+id/background"
|
|
||||||
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
|
|
||||||
|
|
||||||
<TextView android:id="@+id/balanceTextView"
|
<TextView android:id="@+id/balanceTextView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -164,16 +204,12 @@ def main_layout():
|
||||||
android:gravity="center_vertical|center_horizontal|center">
|
android:gravity="center_vertical|center_horizontal|center">
|
||||||
</TextView>
|
</TextView>
|
||||||
|
|
||||||
%s
|
%s """%get_history_layout(15),True)
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
</LinearLayout>
|
|
||||||
"""%(title, get_history_layout(15))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
payto_layout = make_layout("""
|
payto_layout = make_layout("""
|
||||||
|
|
||||||
<TextView android:id="@+id/recipientTextView"
|
<TextView android:id="@+id/recipientTextView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -186,7 +222,7 @@ payto_layout = make_layout("""
|
||||||
<EditText android:id="@+id/recipient"
|
<EditText android:id="@+id/recipient"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:tag="Tag Me" android:inputType="textCapWords|textPhonetic|number">
|
android:tag="Tag Me" android:inputType="text">
|
||||||
</EditText>
|
</EditText>
|
||||||
|
|
||||||
<LinearLayout android:id="@+id/linearLayout1"
|
<LinearLayout android:id="@+id/linearLayout1"
|
||||||
|
@ -210,7 +246,7 @@ payto_layout = make_layout("""
|
||||||
<EditText android:id="@+id/label"
|
<EditText android:id="@+id/label"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:tag="Tag Me" android:inputType="textCapWords|textPhonetic|number">
|
android:tag="Tag Me" android:inputType="text">
|
||||||
</EditText>
|
</EditText>
|
||||||
|
|
||||||
<TextView android:id="@+id/amountLabelTextView"
|
<TextView android:id="@+id/amountLabelTextView"
|
||||||
|
@ -231,7 +267,7 @@ payto_layout = make_layout("""
|
||||||
android:layout_height="wrap_content" android:id="@+id/linearLayout1">
|
android:layout_height="wrap_content" android:id="@+id/linearLayout1">
|
||||||
<Button android:id="@+id/buttonPay" android:layout_width="wrap_content"
|
<Button android:id="@+id/buttonPay" android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content" android:text="Send"></Button>
|
android:layout_height="wrap_content" android:text="Send"></Button>
|
||||||
</LinearLayout>""")
|
</LinearLayout>""",False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -264,7 +300,7 @@ settings_layout = make_layout("""
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:tag="Tag Me"
|
android:tag="Tag Me"
|
||||||
android:inputType="textCapWords|textPhonetic|number">
|
android:inputType="text">
|
||||||
</EditText>
|
</EditText>
|
||||||
|
|
||||||
<LinearLayout android:layout_width="match_parent"
|
<LinearLayout android:layout_width="match_parent"
|
||||||
|
@ -288,7 +324,7 @@ settings_layout = make_layout("""
|
||||||
<Button android:id="@+id/buttonSave" android:layout_width="wrap_content"
|
<Button android:id="@+id/buttonSave" android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content" android:text="Save"></Button>
|
android:layout_height="wrap_content" android:text="Save"></Button>
|
||||||
|
|
||||||
""")
|
""",False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -419,17 +455,19 @@ def pay_to(recipient, amount, fee, label):
|
||||||
|
|
||||||
droid.dialogCreateSpinnerProgress("Electrum", "signing transaction...")
|
droid.dialogCreateSpinnerProgress("Electrum", "signing transaction...")
|
||||||
droid.dialogShow()
|
droid.dialogShow()
|
||||||
tx = wallet.mktx( recipient, amount, label, password, fee)
|
|
||||||
|
try:
|
||||||
|
tx = wallet.mktx( recipient, amount, label, password, fee)
|
||||||
|
except:
|
||||||
|
droid.dialogDismiss()
|
||||||
|
return 'error'
|
||||||
|
|
||||||
print tx
|
print tx
|
||||||
droid.dialogDismiss()
|
droid.dialogDismiss()
|
||||||
|
|
||||||
if tx:
|
if tx:
|
||||||
r, h = wallet.sendtx( tx )
|
r, h = wallet.sendtx( tx )
|
||||||
droid.dialogCreateAlert('tx sent', h)
|
modal_dialog('tx sent', h)
|
||||||
droid.dialogSetPositiveButtonText('OK')
|
|
||||||
droid.dialogShow()
|
|
||||||
response = droid.dialogGetResponse().result
|
|
||||||
droid.dialogDismiss()
|
|
||||||
return h
|
return h
|
||||||
else:
|
else:
|
||||||
return 'error'
|
return 'error'
|
||||||
|
@ -440,11 +478,8 @@ def pay_to(recipient, amount, fee, label):
|
||||||
|
|
||||||
|
|
||||||
def recover():
|
def recover():
|
||||||
droid.dialogCreateAlert("wallet file not found")
|
if not modal_question("Wallet not found","restore from seed?"):
|
||||||
droid.dialogSetPositiveButtonText('OK')
|
exit(1)
|
||||||
droid.dialogShow()
|
|
||||||
resp = droid.dialogGetResponse().result
|
|
||||||
print resp
|
|
||||||
|
|
||||||
code = droid.scanBarcode()
|
code = droid.scanBarcode()
|
||||||
r = code.result
|
r = code.result
|
||||||
|
@ -453,13 +488,8 @@ def recover():
|
||||||
else:
|
else:
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
droid.dialogCreateAlert('seed', seed)
|
if not modal_question('Seed', seed):
|
||||||
droid.dialogSetPositiveButtonText('OK')
|
exit(1)
|
||||||
droid.dialogSetNegativeButtonText('Cancel')
|
|
||||||
droid.dialogShow()
|
|
||||||
response = droid.dialogGetResponse().result
|
|
||||||
droid.dialogDismiss()
|
|
||||||
print response
|
|
||||||
|
|
||||||
wallet.seed = str(seed)
|
wallet.seed = str(seed)
|
||||||
wallet.init_mpk( wallet.seed )
|
wallet.init_mpk( wallet.seed )
|
||||||
|
@ -475,12 +505,10 @@ def recover():
|
||||||
# history and addressbook
|
# history and addressbook
|
||||||
wallet.update_tx_history()
|
wallet.update_tx_history()
|
||||||
wallet.fill_addressbook()
|
wallet.fill_addressbook()
|
||||||
droid.dialogCreateAlert("recovery successful")
|
|
||||||
droid.dialogShow()
|
|
||||||
wallet.save()
|
wallet.save()
|
||||||
|
modal_dialog("recovery successful")
|
||||||
else:
|
else:
|
||||||
droid.dialogCreateSpinnerProgress("wallet not found")
|
modal_dialog("no transactions found for this seed")
|
||||||
droid.dialogShow()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -491,22 +519,11 @@ def make_new_contact():
|
||||||
address = r['extras']['SCAN_RESULT']
|
address = r['extras']['SCAN_RESULT']
|
||||||
if address:
|
if address:
|
||||||
if wallet.is_valid(address):
|
if wallet.is_valid(address):
|
||||||
droid.dialogCreateAlert('Add to contacts?', address)
|
if modal_question('Add to contacts?', address):
|
||||||
droid.dialogSetPositiveButtonText('OK')
|
|
||||||
droid.dialogSetNegativeButtonText('Cancel')
|
|
||||||
droid.dialogShow()
|
|
||||||
response = droid.dialogGetResponse().result
|
|
||||||
droid.dialogDismiss()
|
|
||||||
print response
|
|
||||||
if response.get('which') == 'positive':
|
|
||||||
wallet.addressbook.append(address)
|
wallet.addressbook.append(address)
|
||||||
wallet.save()
|
wallet.save()
|
||||||
else:
|
else:
|
||||||
droid.dialogCreateAlert('Invalid address', address)
|
modal_dialog('Invalid address', address)
|
||||||
droid.dialogSetPositiveButtonText('OK')
|
|
||||||
droid.dialogShow()
|
|
||||||
response = droid.dialogGetResponse().result
|
|
||||||
droid.dialogDismiss()
|
|
||||||
|
|
||||||
|
|
||||||
def main_loop():
|
def main_loop():
|
||||||
|
@ -552,6 +569,7 @@ def main_loop():
|
||||||
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
def payto_loop():
|
def payto_loop():
|
||||||
out = None
|
out = None
|
||||||
while out is None:
|
while out is None:
|
||||||
|
@ -568,15 +586,15 @@ def payto_loop():
|
||||||
label = droid.fullQueryDetail("label").result.get('text')
|
label = droid.fullQueryDetail("label").result.get('text')
|
||||||
amount = droid.fullQueryDetail('amount').result.get('text')
|
amount = droid.fullQueryDetail('amount').result.get('text')
|
||||||
fee = '0.001'
|
fee = '0.001'
|
||||||
amount = int( 100000000 * Decimal(amount) )
|
try:
|
||||||
|
amount = int( 100000000 * Decimal(amount) )
|
||||||
|
except:
|
||||||
|
modal_dialog('Error','invalid amount')
|
||||||
|
continue
|
||||||
|
|
||||||
fee = int( 100000000 * Decimal(fee) )
|
fee = int( 100000000 * Decimal(fee) )
|
||||||
result = pay_to(recipient, amount, fee, label)
|
result = pay_to(recipient, amount, fee, label)
|
||||||
|
modal_dialog('result',result)
|
||||||
droid.dialogCreateAlert('result', result)
|
|
||||||
droid.dialogSetPositiveButtonText('OK')
|
|
||||||
droid.dialogShow()
|
|
||||||
droid.dialogGetResponse()
|
|
||||||
droid.dialogDismiss()
|
|
||||||
out = 'main'
|
out = 'main'
|
||||||
|
|
||||||
elif id=="buttonContacts":
|
elif id=="buttonContacts":
|
||||||
|
@ -637,35 +655,31 @@ def server_dialog(plist):
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
def protocol_dialog(plist):
|
|
||||||
options=["TCP","HTTP","native"]
|
|
||||||
droid.dialogCreateAlert("Protocol")
|
|
||||||
droid.dialogSetSingleChoiceItems(options)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def settings_loop():
|
def settings_loop():
|
||||||
droid.fullSetProperty("server","text",wallet.server)
|
droid.fullSetProperty("server","text",wallet.server)
|
||||||
|
droid.fullSetProperty("fee","text", "%s"% str( Decimal( wallet.fee)/100000000 ) )
|
||||||
|
|
||||||
out = None
|
out = None
|
||||||
while out is None:
|
while out is None:
|
||||||
event = droid.eventWait().result
|
event = droid.eventWait().result
|
||||||
print "got event", event
|
print "got event", event
|
||||||
|
|
||||||
if event["name"] == "click":
|
plist = {}
|
||||||
|
for item in wallet.interface.servers:
|
||||||
|
host, pp = item
|
||||||
|
z = {}
|
||||||
|
for item2 in pp:
|
||||||
|
protocol, port = item2
|
||||||
|
z[protocol] = port
|
||||||
|
plist[host] = z
|
||||||
|
|
||||||
|
|
||||||
|
if event["name"] == "click":
|
||||||
id = event["data"]["id"]
|
id = event["data"]["id"]
|
||||||
|
|
||||||
if id=="buttonServer":
|
if id=="buttonServer":
|
||||||
plist = {}
|
|
||||||
for item in wallet.interface.servers:
|
|
||||||
host, pp = item
|
|
||||||
z = {}
|
|
||||||
for item2 in pp:
|
|
||||||
protocol, port = item2
|
|
||||||
z[protocol] = port
|
|
||||||
plist[host] = z
|
|
||||||
|
|
||||||
host = server_dialog(plist)
|
host = server_dialog(plist)
|
||||||
if host:
|
if host:
|
||||||
p = plist[host]
|
p = plist[host]
|
||||||
|
@ -673,18 +687,36 @@ def settings_loop():
|
||||||
srv = host + ':' + port + ':t'
|
srv = host + ':' + port + ':t'
|
||||||
droid.fullSetProperty("server","text",srv)
|
droid.fullSetProperty("server","text",srv)
|
||||||
|
|
||||||
elif id=="buttonSave":
|
elif id=="buttonProtocol":
|
||||||
droid.fullQuery()
|
droid.fullQuery()
|
||||||
srv = droid.fullQueryDetail("server").result.get('text')
|
srv = droid.fullQueryDetail("server").result.get('text')
|
||||||
|
host = srv.split(':')[0]
|
||||||
|
if host in plist:
|
||||||
|
server = protocol_dialog(host, plist[host])
|
||||||
|
print server
|
||||||
|
droid.fullSetProperty("server","text",server)
|
||||||
|
|
||||||
|
elif id=="buttonSave":
|
||||||
|
|
||||||
|
droid.fullQuery()
|
||||||
|
srv = droid.fullQueryDetail("server").result.get('text')
|
||||||
|
fee = droid.fullQueryDetail("fee").result.get('text')
|
||||||
try:
|
try:
|
||||||
wallet.set_server(srv)
|
wallet.set_server(srv)
|
||||||
out = 'main'
|
|
||||||
except:
|
except:
|
||||||
droid.dialogCreateAlert('error')
|
modal_dialog('error','invalid server')
|
||||||
droid.dialogSetPositiveButtonText('OK')
|
|
||||||
droid.dialogShow()
|
try:
|
||||||
droid.dialogGetResponse()
|
fee = int( 100000000 * Decimal(fee) )
|
||||||
droid.dialogDismiss()
|
if wallet.fee != fee:
|
||||||
|
wallet.fee = fee
|
||||||
|
wallet.save()
|
||||||
|
except:
|
||||||
|
modal_dialog('error','invalid fee value')
|
||||||
|
|
||||||
|
out = 'main'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
elif id=="buttonCancel":
|
elif id=="buttonCancel":
|
||||||
out = 'main'
|
out = 'main'
|
||||||
|
@ -725,17 +757,18 @@ def add_menu(s):
|
||||||
droid.addOptionsMenuItem("Receive","receive",None,"")
|
droid.addOptionsMenuItem("Receive","receive",None,"")
|
||||||
droid.addOptionsMenuItem("Contacts","contacts",None,"")
|
droid.addOptionsMenuItem("Contacts","contacts",None,"")
|
||||||
droid.addOptionsMenuItem("Settings","settings",None,"")
|
droid.addOptionsMenuItem("Settings","settings",None,"")
|
||||||
|
elif s == 'receive':
|
||||||
|
droid.addOptionsMenuItem("Back","main",None,"")
|
||||||
elif s == 'contacts':
|
elif s == 'contacts':
|
||||||
droid.addOptionsMenuItem("Pay to","paytocontact",None,"")
|
droid.addOptionsMenuItem("Back","main",None,"")
|
||||||
droid.addOptionsMenuItem("Edit label","editcontact",None,"")
|
#droid.addOptionsMenuItem("Pay to","paytocontact",None,"")
|
||||||
droid.addOptionsMenuItem("Delete","removecontact",None,"")
|
#droid.addOptionsMenuItem("Edit label","editcontact",None,"")
|
||||||
|
#droid.addOptionsMenuItem("Delete","removecontact",None,"")
|
||||||
elif s == 'settings':
|
elif s == 'settings':
|
||||||
droid.addOptionsMenuItem("Save","save",None,"")
|
droid.addOptionsMenuItem("Save","save",None,"")
|
||||||
droid.addOptionsMenuItem("Cancel","cancel",None,"")
|
droid.addOptionsMenuItem("Cancel","cancel",None,"")
|
||||||
|
|
||||||
|
|
||||||
#droid.addOptionsMenuItem("Quit","quit",None,"")
|
|
||||||
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
add_menu(s)
|
add_menu(s)
|
||||||
|
@ -743,6 +776,7 @@ while True:
|
||||||
droid.fullShow(main_layout())
|
droid.fullShow(main_layout())
|
||||||
s = main_loop()
|
s = main_loop()
|
||||||
droid.fullDismiss()
|
droid.fullDismiss()
|
||||||
|
|
||||||
elif s == 'send':
|
elif s == 'send':
|
||||||
droid.fullShow(payto_layout)
|
droid.fullShow(payto_layout)
|
||||||
s = payto_loop()
|
s = payto_loop()
|
||||||
|
@ -752,7 +786,7 @@ while True:
|
||||||
f = open('/sdcard/sl4a/scripts/recv.html',"w")
|
f = open('/sdcard/sl4a/scripts/recv.html',"w")
|
||||||
f.write(qr_code_layout(receive_addr))
|
f.write(qr_code_layout(receive_addr))
|
||||||
f.close()
|
f.close()
|
||||||
droid.webViewShow("file:///sdcard/sl4a/scripts/recv.html")
|
wvs = droid.webViewShow("file:///sdcard/sl4a/scripts/recv.html")
|
||||||
s = receive_loop()
|
s = receive_loop()
|
||||||
|
|
||||||
elif s == 'contacts':
|
elif s == 'contacts':
|
||||||
|
|
Loading…
Add table
Reference in a new issue