Implement kivy android client Ui with network status and navigation window listing
3
.gitignore
vendored
|
@ -18,3 +18,6 @@ dist
|
|||
docs/_*/*
|
||||
docs/autodoc/
|
||||
pyan/
|
||||
.buildozer/
|
||||
|
||||
debug.log
|
||||
|
|
0
src/.bash_aliases
Normal file
22550
src/PyBitmessage/debug.log.1
Normal file
1
src/PyBitmessage/singleton.lock
Normal file
|
@ -0,0 +1 @@
|
|||
30826
|
BIN
src/bin/bluewhale-0.1-debug.apk
Normal file
|
@ -0,0 +1,50 @@
|
|||
from pythonforandroid.toolchain import Recipe, shprint, shutil, current_directory
|
||||
from os.path import exists, join
|
||||
import os
|
||||
import sys
|
||||
from multiprocessing import cpu_count
|
||||
import sh
|
||||
|
||||
|
||||
class BitmsghashRecipe(Recipe):
|
||||
# This could also inherit from PythonRecipe etc. if you want to
|
||||
# use their pre-written build processes
|
||||
|
||||
url = 'https://github.com/surbhicis/bitmsghash/archive/master.zip'
|
||||
# {version} will be replaced with self.version when downloading
|
||||
|
||||
depends = ['openssl']
|
||||
|
||||
conflicts = []
|
||||
|
||||
def get_recipe_env(self, arch=None):
|
||||
env = super(BitmsghashRecipe, self).get_recipe_env(arch)
|
||||
r = Recipe.get_recipe('openssl', self.ctx)
|
||||
b = r.get_build_dir(arch.arch)
|
||||
env['CCFLAGS'] = env['CFLAGS'] = \
|
||||
env['CFLAGS'] + ' -I{openssl_build_path}/include ' \
|
||||
'-I{openssl_build_path}/include/openssl'.format(
|
||||
openssl_build_path=b)
|
||||
env['LDFLAGS'] = \
|
||||
env['LDFLAGS'] + ' -L{openssl_build_path} ' \
|
||||
'-lcrypto{openssl_version} ' \
|
||||
'-lssl{openssl_version}'.format(
|
||||
openssl_build_path=b,
|
||||
openssl_version=r.version)
|
||||
return env
|
||||
|
||||
def should_build(self, arch=None):
|
||||
super(BitmsghashRecipe, self).should_build(arch)
|
||||
return not exists(
|
||||
join(self.ctx.get_libs_dir(arch.arch), 'libbitmsghash.so'))
|
||||
|
||||
def build_arch(self, arch=None):
|
||||
super(BitmsghashRecipe, self).build_arch(arch)
|
||||
env = self.get_recipe_env(arch)
|
||||
with current_directory(join(self.get_build_dir(arch.arch))):
|
||||
dst_dir = join(self.get_build_dir(arch.arch))
|
||||
shprint(sh.make, '-j', str(cpu_count()), _env=env)
|
||||
self.install_libs(arch, '{}/libbitmsghash.so'.format(dst_dir),
|
||||
'libbitmsghash.so')
|
||||
|
||||
recipe = BitmsghashRecipe()
|
|
@ -0,0 +1,58 @@
|
|||
from os import environ
|
||||
from os.path import exists, join
|
||||
|
||||
import sh
|
||||
from pythonforandroid.logger import shprint, info_main, info
|
||||
from pythonforandroid.recipe import PythonRecipe
|
||||
# from pythonforandroid.util import ensure_dir
|
||||
|
||||
|
||||
class KivyMDRecipe(PythonRecipe):
|
||||
# This recipe installs KivyMD into the android dist from source
|
||||
version = 'master'
|
||||
url = 'https://gitlab.com/kivymd/KivyMD/repository/{version}/archive.zip'
|
||||
depends = ['kivy']
|
||||
site_packages_name = 'kivymd'
|
||||
call_hostpython_via_targetpython = False
|
||||
patches = ['kivymd-fix-dev-compatibility.patch']
|
||||
|
||||
def should_build(self, arch):
|
||||
return True
|
||||
|
||||
# def unpack(self, arch):
|
||||
# info_main('Unpacking {} for {}'.format(self.name, arch))
|
||||
#
|
||||
# build_dir = self.get_build_container_dir(arch)
|
||||
#
|
||||
# user_dir = environ.get('P4A_{}_DIR'.format(self.name.lower()))
|
||||
#
|
||||
# if user_dir is not None:
|
||||
# info("Installing KivyMD development version (from modded source)")
|
||||
# self.clean_build()
|
||||
# shprint(sh.rm, '-rf', build_dir)
|
||||
# shprint(sh.mkdir, '-p', build_dir)
|
||||
# shprint(sh.rmdir, build_dir)
|
||||
# ensure_dir(build_dir)
|
||||
# ensure_dir(build_dir + "/kivymd")
|
||||
# shprint(sh.cp, user_dir + '/setup.py', self.get_build_dir(arch) + "/setup.py")
|
||||
# shprint(sh.cp, '-a', user_dir + "/kivymd", self.get_build_dir(arch) + "/kivymd")
|
||||
# return
|
||||
|
||||
def get_recipe_env(self, arch):
|
||||
env = super(KivyMDRecipe, self).get_recipe_env(arch)
|
||||
env['PYTHON_ROOT'] = self.ctx.get_python_install_dir()
|
||||
env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7'
|
||||
env['LDFLAGS'] += ' -L' + env['PYTHON_ROOT'] + '/lib' + \
|
||||
' -lpython2.7'
|
||||
if 'sdl2' in self.ctx.recipe_build_order:
|
||||
env['USE_SDL2'] = '1'
|
||||
env['KIVY_SDL2_PATH'] = ':'.join([
|
||||
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL', 'include'),
|
||||
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_image'),
|
||||
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_mixer'),
|
||||
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_ttf'),
|
||||
])
|
||||
return env
|
||||
|
||||
|
||||
recipe = KivyMDRecipe()
|
|
@ -0,0 +1,36 @@
|
|||
diff -Naurp KivyMD.orig/kivymd/button.py KivyMD/kivymd/button.py
|
||||
--- KivyMD.orig/kivymd/button.py 2017-08-25 13:12:34.000000000 +0200
|
||||
+++ KivyMD/kivymd/button.py 2018-07-10 10:37:55.719440354 +0200
|
||||
@@ -175,7 +175,8 @@ class BaseButton(ThemableBehavior, Butto
|
||||
self._current_button_color = self.md_bg_color_disabled
|
||||
else:
|
||||
self._current_button_color = self.md_bg_color
|
||||
- super(BaseButton, self).on_disabled(instance, value)
|
||||
+ # To add compatibility to last kivy (disabled is now an Alias property)
|
||||
+ # super(BaseButton, self).on_disabled(instance, value)
|
||||
|
||||
|
||||
class BasePressedButton(BaseButton):
|
||||
diff -Naurp KivyMD.orig/kivymd/selectioncontrols.py KivyMD/kivymd/selectioncontrols.py
|
||||
--- KivyMD.orig/kivymd/selectioncontrols.py 2017-08-25 13:12:34.000000000 +0200
|
||||
+++ KivyMD/kivymd/selectioncontrols.py 2018-07-10 10:40:06.971439102 +0200
|
||||
@@ -45,6 +45,7 @@ Builder.load_string('''
|
||||
pos: self.pos
|
||||
|
||||
<MDSwitch>:
|
||||
+ _thumb_pos: (self.right - dp(12), self.center_y - dp(12)) if self.active else (self.x - dp(12), self.center_y - dp(12))
|
||||
canvas.before:
|
||||
Color:
|
||||
rgba: self._track_color_disabled if self.disabled else \
|
||||
diff -Naurp KivyMD.orig/kivymd/tabs.py KivyMD/kivymd/tabs.py
|
||||
--- KivyMD.orig/kivymd/tabs.py 2017-08-25 13:12:34.000000000 +0200
|
||||
+++ KivyMD/kivymd/tabs.py 2018-07-10 10:39:20.603439544 +0200
|
||||
@@ -185,7 +185,7 @@ class MDBottomNavigationBar(ThemableBeha
|
||||
|
||||
class MDTabHeader(MDFlatButton):
|
||||
""" Internal widget for headers based on MDFlatButton"""
|
||||
-
|
||||
+
|
||||
width = BoundedNumericProperty(dp(0), min=dp(72), max=dp(264), errorhandler=lambda x: dp(72))
|
||||
tab = ObjectProperty(None)
|
||||
panel = ObjectProperty(None)
|
|
@ -106,6 +106,10 @@ NavigationLayout:
|
|||
text: "new address"
|
||||
icon:'account-plus'
|
||||
on_release: app.root.ids.scr_mngr.current = 'login'
|
||||
NavigationDrawerIconButton:
|
||||
text: "Network Status"
|
||||
icon:'server-network'
|
||||
on_release: app.root.ids.scr_mngr.current = 'networkstat'
|
||||
NavigationDrawerIconButton:
|
||||
text: "My Addresses"
|
||||
icon:'account-multiple'
|
||||
|
@ -159,6 +163,8 @@ NavigationLayout:
|
|||
id:sc11
|
||||
Payment:
|
||||
id:sc12
|
||||
NetworkStat:
|
||||
id:sc13
|
||||
|
||||
<SwipeButton@Carousel>:
|
||||
text: ''
|
||||
|
@ -576,3 +582,56 @@ NavigationLayout:
|
|||
size_hint: 1, None
|
||||
height: dp(40)
|
||||
text: 'Scan QR code'
|
||||
|
||||
<NetworkStat>:
|
||||
name: 'networkstat'
|
||||
MDTabbedPanel:
|
||||
id: tab_panel
|
||||
tab_display_mode:'text'
|
||||
|
||||
MDTab:
|
||||
name: 'connections'
|
||||
text: "Total connections" # Why are these not set!!!
|
||||
MDLabel:
|
||||
font_style: 'Body1'
|
||||
theme_text_color: 'Primary'
|
||||
text: root.text_variable_1
|
||||
halign: 'center'
|
||||
MDTab:
|
||||
name: 'processes'
|
||||
text: 'Processes'
|
||||
ScrollView:
|
||||
do_scroll_x: False
|
||||
MDList:
|
||||
id: ml
|
||||
size_hint_y: None
|
||||
height: dp(500)
|
||||
OneLineListItem:
|
||||
text: "person-to-person"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .8, .6
|
||||
text: root.text_variable_2
|
||||
OneLineListItem:
|
||||
text: "Brodcast"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .8, .6
|
||||
text: root.text_variable_3
|
||||
OneLineListItem:
|
||||
text: "objects"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .8, .6
|
||||
text: root.text_variable_4
|
||||
|
||||
OneLineListItem:
|
||||
text: "publickeys"
|
||||
BoxLayout:
|
||||
AnchorLayout:
|
||||
MDRaisedButton:
|
||||
size_hint: .8, .6
|
||||
text: root.text_variable_5
|
||||
|
|
|
@ -38,6 +38,7 @@ from kivy.uix.label import Label
|
|||
from kivy.uix.recycleboxlayout import RecycleBoxLayout
|
||||
from kivy.uix.behaviors import FocusBehavior
|
||||
from kivy.uix.recycleview.layout import LayoutSelectionBehavior
|
||||
import time
|
||||
|
||||
class Navigatorss(MDNavigationDrawer):
|
||||
image_source = StringProperty('images/qidenticon_two.png')
|
||||
|
@ -80,6 +81,11 @@ class Inbox(Screen):
|
|||
if address.startswith(splitaddress[:-2]):
|
||||
return address
|
||||
|
||||
def get_address_via_split(self, splitaddress):
|
||||
for address in BMConfigParser().addresses():
|
||||
if address.startswith(splitaddress[:-2]):
|
||||
return address
|
||||
|
||||
|
||||
class MyAddress(Screen):
|
||||
"""MyAddress Screen uses screen to show widgets of screens."""
|
||||
|
@ -250,7 +256,7 @@ class MyTextInput(TextInput):
|
|||
# display the data in the recycleview
|
||||
display_data = []
|
||||
for i in matches:
|
||||
display_data.append({'text':i})
|
||||
display_data.append({'text': i})
|
||||
self.parent.parent.parent.parent.ids.rv.data = display_data
|
||||
# ensure the size is okay
|
||||
if len(matches) <= 10:
|
||||
|
@ -268,6 +274,26 @@ class MyTextInput(TextInput):
|
|||
class Payment(Screen):
|
||||
pass
|
||||
|
||||
class Login(Screen):
|
||||
pass
|
||||
|
||||
|
||||
class NetworkStat(Screen):
|
||||
text_variable_1 = StringProperty('{0}::{1}'.format('Total Connections', '0'))
|
||||
text_variable_2 = StringProperty('Processed {0} per-to-per messages'.format('0'))
|
||||
text_variable_3 = StringProperty('Processed {0} brodcast messages'.format('0'))
|
||||
text_variable_4 = StringProperty('Processed {0} public keys'.format('0'))
|
||||
text_variable_5 = StringProperty('Processed {0} object to be synced'.format('0'))
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(NetworkStat, self).__init__(*args, **kwargs)
|
||||
Clock.schedule_interval(self.init_ui, 1)
|
||||
|
||||
def init_ui(self, dt=0):
|
||||
"""Clock Schdule for method inbox accounts."""
|
||||
import network.stats
|
||||
self.text_variable_1 = '{0} :: {1}'.format('Total Connections', str(len(network.stats.connectedHostsList())))
|
||||
|
||||
|
||||
class Login(Screen):
|
||||
pass
|
||||
|
@ -523,4 +549,5 @@ class IconLeftSampleWidget(ILeftBodyTouch, MDIconButton):
|
|||
|
||||
|
||||
class IconRightSampleWidget(IRightBodyTouch, MDCheckbox):
|
||||
|
||||
pass
|
||||
|
|
|
@ -209,15 +209,16 @@ class Main:
|
|||
if daemon:
|
||||
state.enableGUI = False # run without a UI
|
||||
|
||||
# is the application already running? If yes then exit.
|
||||
|
||||
if state.enableGUI and not state.curses and not state.kivy and not depends.check_pyqt():
|
||||
# is the application already running? If yes then exit.
|
||||
sys.exit(
|
||||
'PyBitmessage requires PyQt unless you want'
|
||||
' to run it as a daemon and interact with it'
|
||||
' using the API. You can download PyQt from '
|
||||
'http://www.riverbankcomputing.com/software/pyqt/download'
|
||||
' or by searching Google for \'PyQt Download\'.'
|
||||
' If you want to run in daemon mode, see '
|
||||
' If you want to riverbankcomputingun in daemon mode, see '
|
||||
'https://bitmessage.org/wiki/Daemon\n'
|
||||
'You can also run PyBitmessage with'
|
||||
' the new curses interface by providing'
|
||||
|
@ -380,7 +381,7 @@ class Main:
|
|||
BMConfigParser().remove_option('bitmessagesettings', 'dontconnect')
|
||||
print("Thread 408 begins.....................................................................")
|
||||
from bitmessagekivy.mpybit import NavigateApp
|
||||
print("Thread 410 begins.....................................................................")
|
||||
print("Thread 4100 begins.....................................................................")
|
||||
NavigateApp().run()
|
||||
else:
|
||||
print("Thread 417 begins.....................................................................")
|
||||
|
|
After Width: | Height: | Size: 61 KiB |
BIN
src/images/BitMessageLogo.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
src/images/account_multiple.png
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
src/images/addressbookadd.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
src/images/avatar.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
src/images/circular.gif
Normal file
After Width: | Height: | Size: 111 KiB |
BIN
src/images/circular1.gif
Normal file
After Width: | Height: | Size: 858 KiB |
After Width: | Height: | Size: 68 KiB |
BIN
src/images/if_android_1220385.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
src/images/images.png
Normal file
After Width: | Height: | Size: 144 B |
BIN
src/images/images2.jpeg
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
src/images/index.jpeg
Normal file
After Width: | Height: | Size: 1.6 KiB |
48
src/images/logo.png
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 508.52 508.52" style="enable-background:new 0 0 508.52 508.52;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<path style="fill:#010002;" d="M254.26,0C113.845,0,0,113.845,0,254.26s113.845,254.26,254.26,254.26
|
||||
s254.26-113.845,254.26-254.26C508.52,113.813,394.675,0,254.26,0z M274.092,323.005c-18.593-1.43-26.379-10.647-40.936-19.514
|
||||
c-8.009,42.016-17.798,82.317-46.784,103.325c-8.963-63.47,13.126-111.143,23.392-161.773
|
||||
c-17.48-29.462,2.098-88.673,38.965-74.085c45.354,17.957-39.315,109.427,17.544,120.869
|
||||
c59.338,11.918,83.588-103.007,46.784-140.383c-53.204-53.967-154.781-1.24-142.29,76.024c3.051,18.879,22.534,24.6,7.787,50.693
|
||||
c-34.039-7.501-44.209-34.389-42.906-70.176c2.098-58.575,52.632-99.575,103.325-105.264
|
||||
c64.105-7.183,124.238,23.519,132.533,83.81C380.881,254.578,342.583,328.313,274.092,323.005z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/images/newaddress2.jpg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
src/images/newadsdress.png
Normal file
After Width: | Height: | Size: 61 KiB |
BIN
src/images/popup.jpeg
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
src/images/presplas.gif
Normal file
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 38 KiB |
|
@ -11,7 +11,7 @@ import sys
|
|||
import time
|
||||
from struct import pack, unpack
|
||||
from subprocess import call
|
||||
|
||||
from kivy.utils import platform
|
||||
import openclpow
|
||||
import paths
|
||||
import queues
|
||||
|
@ -328,7 +328,6 @@ def init():
|
|||
except Exception as e:
|
||||
bso = None
|
||||
print(e)
|
||||
|
||||
else:
|
||||
try:
|
||||
bso = ctypes.CDLL(os.path.join(paths.codePath(), "bitmsghash", bitmsglib))
|
||||
|
@ -346,8 +345,11 @@ def init():
|
|||
logger.info("Loaded C PoW DLL %s", bitmsglib)
|
||||
if bso:
|
||||
try:
|
||||
print("hey I am on line 303 sucess.....................................................")
|
||||
bmpow = bso.BitmessagePOW
|
||||
print("hey I am on line 305 sucess.....................................................")
|
||||
bmpow.restype = ctypes.c_ulonglong
|
||||
print("hey I am on line 307 sucess.....................................................")
|
||||
except:
|
||||
bmpow = None
|
||||
else:
|
||||
|
|