Merge pull request #14 from navjotcis/UiChanges

code quality stuff fixes with enhancement in kivy app
This commit is contained in:
surbhi 2019-10-01 16:18:19 +05:30 committed by GitHub
commit 137a10ddb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 312 additions and 286 deletions

View File

@ -1,24 +1,28 @@
from os import environ
from os.path import exists, join
"""
src/bitmessagekivy/android/python-for-android/recipes/kivymd/__init__.py
=================================
"""
# pylint: disable=import-error
from os.path import 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
"""This recipe installs KivyMD into the android dist from source"""
version = 'master'
url = 'https://github.com/surbhicis/kivymd/archive/master.zip'
depends = ['kivy']
site_packages_name = 'kivymd'
call_hostpython_via_targetpython = False
def should_build(self, arch):
def should_build(self, arch): # pylint: disable=no-self-use, unused-argument
"""Method helps to build the application"""
return True
def get_recipe_env(self, arch):
"""Method is used for getting all the env paths"""
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'
@ -30,8 +34,7 @@ class KivyMDRecipe(PythonRecipe):
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'),
])
join(self.ctx.bootstrap.build_dir, 'jni', 'SDL2_ttf'), ])
return env

View File

@ -2,11 +2,13 @@
src/identiconGeneration.py
=================================
"""
# pylint: disable=import-error
import hashlib
from io import BytesIO
from PIL import Image
from kivy.core.image import Image as CoreImage
from kivy.uix.image import Image as kiImage
from io import BytesIO
""" Core classes for loading images and converting them to a Texture.
The raw image data can be keep in memory for further access """

View File

@ -1,7 +1,13 @@
from helper_sql import *
"""
src/bitmessagekivy/kivy_helper_search.py
=================================
"""
from helper_sql import sqlQuery
def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, what=None, unreadOnly=False):
"""Method helping for searching mails"""
# pylint: disable=too-many-arguments, too-many-branches
if what is not None and what != "":
what = "%" + what + "%"
else:
@ -27,7 +33,7 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w
else:
sqlStatementParts.append(xAddress + " = ? ")
sqlArguments.append(account)
if folder is not "addressbook":
if folder != "addressbook":
if folder is not None:
if folder == "new":
folder = "inbox"
@ -50,7 +56,7 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w
sqlStatementParts.append(filter_col)
if unreadOnly:
sqlStatementParts.append("read = 0")
if len(sqlStatementParts) > 0:
if sqlStatementParts:
sqlStatementBase += "WHERE " + " AND ".join(sqlStatementParts)
if folder == "sent":
sqlStatementBase += " ORDER BY lastactiontime DESC"

View File

@ -72,9 +72,9 @@
on_text:app.getCurrentAccountData(self.text)
Image:
source: app.get_default_image()
x: self.width/4-2
y: self.parent.y + self.parent.height/2 - self.height + 14
size: 28, 28
x: self.width/6
y: self.parent.y + self.parent.height/4
size: self.parent.height/2, self.parent.height/2
ArrowImg:
NavigationDrawerIconButton:
id: inbox_cnt
@ -82,52 +82,52 @@
text: "Inbox"
on_release: app.root.ids.scr_mngr.current = 'inbox'
badge_text: "0"
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
id: send_cnt
icon: 'send'
text: "Sent"
on_release: app.root.ids.scr_mngr.current = 'sent'
badge_text: "0"
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
id: draft_cnt
icon: 'message-draw'
text: "Draft"
on_release: app.root.ids.scr_mngr.current = 'draft'
badge_text: "0"
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
text: "Starred"
icon:'star'
on_release: app.root.ids.scr_mngr.current = 'starred'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
icon: 'archive'
text: "Archieve"
on_release: app.root.ids.scr_mngr.current = 'archieve'
badge_text: "0"
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
icon: 'email-open-outline'
text: "Spam"
on_release: app.root.ids.scr_mngr.current = 'spam'
badge_text: "0"
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
id: trash_cnt
icon: 'delete'
text: "Trash"
on_release: app.root.ids.scr_mngr.current = 'trash'
badge_text: "0"
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
id: allmail_cnt
text: "All Mails"
icon:'contact-mail'
on_release: app.root.ids.scr_mngr.current = 'allmails'
badge_text: "0"
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerDivider:
NavigationDrawerSubheader:
text: "All labels"
@ -135,37 +135,37 @@
text: "Address Book"
icon:'book-multiple'
on_release: app.root.ids.scr_mngr.current = 'addressbook'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
text: "Settings"
icon:'settings'
on_release: app.root.ids.scr_mngr.current = 'set'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
text: "Subscriptions/Payment"
icon:'wallet'
on_release: app.root.ids.scr_mngr.current = 'payment'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
text: "Credits"
icon:'wallet'
on_release: app.root.ids.scr_mngr.current = 'credits'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
text: "new address"
icon:'account-plus'
on_release: app.root.ids.scr_mngr.current = 'login'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
text: "Network Status"
icon:'server-network'
on_release: app.root.ids.scr_mngr.current = 'networkstat'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationDrawerIconButton:
text: "My Addresses"
icon:'account-multiple'
on_release: app.root.ids.scr_mngr.current = 'myaddress'
on_press: app.check_search_screen(self)
on_press: app.refreshScreen(self)
NavigationLayout:
id: nav_layout
@ -186,18 +186,6 @@ NavigationLayout:
background_hue: '500'
left_action_items: [['menu', lambda x: app.root.toggle_nav_drawer()]]
right_action_items: [['account-plus', lambda x: app.addingtoaddressbook()]]
BoxLayout:
id: search_bar
size_hint_y: None
height: self.minimum_height
MDIconButton:
icon: 'magnify'
MDTextField:
id: search_field
hint_text: 'Search'
on_text: app.searchQuery(self)
ScreenManager:
id: scr_mngr
@ -246,21 +234,30 @@ NavigationLayout:
<Inbox>:
name: 'inbox'
FloatLayout:
MDScrollViewRefreshLayout:
id: refresh_layout
refresh_callback: root.refresh_callback
root_layout: root
MDList:
id: ml
BoxLayout:
orientation: 'vertical'
spacing: dp(10)
SearchBar:
FloatLayout:
MDScrollViewRefreshLayout:
id: refresh_layout
refresh_callback: root.refresh_callback
root_layout: root
MDList:
id: ml
ComposerButton:
<Sent>:
name: 'sent'
ScrollView:
do_scroll_x: False
MDList:
id: ml
BoxLayout:
orientation: 'vertical'
SearchBar:
BoxLayout:
orientation:'vertical'
ScrollView:
do_scroll_x: False
MDList:
id: ml
ComposerButton:
<Trash>:
@ -654,23 +651,29 @@ NavigationLayout:
<MyAddress>:
name: 'myaddress'
FloatLayout:
MDScrollViewRefreshLayout:
id: refresh_layout
refresh_callback: root.refresh_callback
root_layout: root
MDList:
id: ml
BoxLayout:
orientation: 'vertical'
SearchBar:
FloatLayout:
MDScrollViewRefreshLayout:
id: refresh_layout
refresh_callback: root.refresh_callback
root_layout: root
MDList:
id: ml
ComposerButton:
<AddressBook>:
name: 'addressbook'
BoxLayout:
orientation:'vertical'
ScrollView:
do_scroll_x: False
MDList:
id: ml
orientation: 'vertical'
SearchBar:
BoxLayout:
orientation:'vertical'
ScrollView:
do_scroll_x: False
MDList:
id: ml
ComposerButton:
<Payment>:
@ -821,11 +824,13 @@ NavigationLayout:
<GrashofPopup>:
id: popup
size_hint : (None,None)
height: 2*(label.height + address.height) + 10
width :app.window_size[0] - app.window_size[0]/10
title: 'add contact\'s'
background: './images/popup.jpeg'
title_size: sp(20)
title_color: 0.4, 0.3765, 0.3451, 1
size_hint: 1, 1
auto_dismiss: False
separator_color: 0.3529, 0.3922, 0.102, 0.7
BoxLayout:
@ -1050,19 +1055,23 @@ NavigationLayout:
<MyaddDetailPopup>:
id: myadd_popup
size_hint : (None,None)
height: 4.5*(myaddr_label.height+ my_add_btn.children[0].height)
width :app.window_size[0] - app.window_size[0]/10
background: './images/popup.jpeg'
separator_height: 0
auto_dismiss: False
separator_height: 0
BoxLayout:
id: myadd_popup_box
size_hint_y: None
spacing:dp(70)
id: myadd_popup_box
orientation: 'vertical'
BoxLayout:
size_hint_y: None
orientation: 'vertical'
spacing:dp(25)
MDLabel:
id: myaddr_label
font_style: 'Title'
theme_text_color: 'Primary'
text: "Label"
@ -1087,6 +1096,7 @@ NavigationLayout:
font_size: '15sp'
halign: 'left'
BoxLayout:
id: my_add_btn
spacing:5
orientation: 'horizontal'
MDRaisedButton:
@ -1125,6 +1135,9 @@ NavigationLayout:
<AddbookDetailPopup>:
id: addbook_popup
size_hint : (None,None)
height: 4*(add_label.height)
width :app.window_size[0] - app.window_size[0]/10
background: './images/popup.jpeg'
separator_height: 0
auto_dismiss: False
@ -1165,6 +1178,7 @@ NavigationLayout:
font_size: '15sp'
halign: 'left'
BoxLayout:
id: addbook_btn
spacing:5
orientation: 'horizontal'
MDRaisedButton:
@ -1212,3 +1226,17 @@ NavigationLayout:
size: 15, 15
x: self.parent.x + self.parent.width - self.width - 5
y: self.parent.y + self.parent.height/2 - self.height + 5
<SearchBar@BoxLayout>:
id: search_bar
size_hint_y: None
height: self.minimum_height
MDIconButton:
icon: 'magnify'
MDTextField:
id: search_field
hint_text: 'Search'
on_text: app.searchQuery(self)

View File

@ -2,6 +2,7 @@
src/bitmessagekivy/mpybit.py
=================================
"""
# pylint: disable=relative-import, unused-variable, import-error, no-name-in-module, too-many-lines
import os
import time
from functools import partial
@ -42,24 +43,19 @@ from kivymd.list import (
ILeftBody,
ILeftBodyTouch,
IRightBodyTouch,
ThreeLineAvatarIconListItem,
TwoLineAvatarIconListItem,
TwoLineListItem)
from kivymd.navigationdrawer import (
MDNavigationDrawer,
NavigationDrawerHeaderBase)
from kivymd.selectioncontrols import MDCheckbox
from kivymd.textfields import MDTextField
from kivymd.theming import ThemeManager
import queues
from semaphores import kivyuisignaler
import state
from uikivysignaler import UIkivySignaler
# pylint: disable=unused-argument, too-few-public-methods, import-error
import identiconGeneration
import os
from kivy.core.clipboard import Clipboard
# pylint: disable=unused-argument, too-few-public-methods
@ -82,8 +78,6 @@ class Navigatorss(MDNavigationDrawer):
class Inbox(Screen):
"""Inbox Screen uses screen to show widgets of screens."""
data = ListProperty()
def __init__(self, *args, **kwargs):
"""Method Parsing the address."""
super(Inbox, self).__init__(*args, **kwargs)
@ -171,7 +165,6 @@ class Inbox(Screen):
def inbox_detail(self, receivedTime, *args):
"""Load inbox page details."""
remove_search_bar(self)
state.detailPageType = 'inbox'
state.sentMailTime = receivedTime
if self.manager:
@ -187,8 +180,12 @@ class Inbox(Screen):
sqlExecute(
"UPDATE inbox SET folder = 'trash' WHERE received = {};".format(
data_index))
msg_count_objs = \
self.parent.parent.parent.parent.parent.children[2].children[0].ids
try:
msg_count_objs = \
self.parent.parent.parent.parent.children[2].children[0].ids
except Exception as e:
msg_count_objs = \
self.parent.parent.parent.parent.parent.children[2].children[0].ids
if int(state.inbox_count) > 0:
msg_count_objs.inbox_cnt.badge_text = str(
int(state.inbox_count) - 1)
@ -229,13 +226,10 @@ class Inbox(Screen):
"""Method updates the state of application, While the spinner remains on the screen."""
def refresh_callback(interval):
"""Method used for loading the inbox screen data."""
state.searcing_text = ''
self.children[2].children[1].ids.search_field.text = ''
self.ids.ml.clear_widgets()
self.remove_widget(self.children[1])
try:
screens_obj = self.parent.screens[0]
except Exception:
screens_obj = self.parent.parent.screens[0]
screens_obj.add_widget(Inbox())
self.loadMessagelist(state.association)
self.ids.refresh_layout.refresh_done()
self.tick = 0
@ -287,12 +281,11 @@ class MyAddress(Screen):
size_hint_y=None,
valign='top')
self.ids.ml.add_widget(content)
try:
self.manager.parent.parent\
.parent.ids.search_bar.clear_widgets()
self.manager.current = 'login'
except Exception:
pass
if not state.searcing_text:
try:
self.manager.current = 'login'
except Exception:
pass
@staticmethod
def myadd_detail(fromaddress, label, *args):
@ -306,13 +299,10 @@ class MyAddress(Screen):
"""Method updates the state of application, While the spinner remains on the screen."""
def refresh_callback(interval):
"""Method used for loading the myaddress screen data."""
state.searcing_text = ''
self.children[2].children[1].ids.search_field.text = ''
self.ids.ml.clear_widgets()
self.remove_widget(self.children[1])
try:
screens_obj = self.parent.screens[9]
except Exception:
screens_obj = self.parent.parent.screens[9]
screens_obj.add_widget(MyAddress())
self.init_ui()
self.ids.refresh_layout.refresh_done()
self.tick = 0
Clock.schedule_once(refresh_callback, 1)
@ -389,8 +379,8 @@ class AddressBook(Screen):
@staticmethod
def refreshs(*args):
"""Refresh the Widget."""
state.navinstance.ids.sc11.clear_widgets()
state.navinstance.ids.sc11.add_widget(AddressBook())
state.navinstance.ids.sc11.ids.ml.clear_widgets()
state.navinstance.ids.sc11.loadAddresslist(None, 'All', '')
@staticmethod
def addBook_detail(address, label, *args):
@ -526,8 +516,8 @@ class DropDownWidget(BoxLayout):
state.check_sent_acc = fromAddress
state.msg_counter_objs = self.parent.parent.parent.parent\
.parent.parent.children[0].children[2].children[0].ids
self.parent.parent.screens[3].clear_widgets()
self.parent.parent.screens[3].add_widget(Sent())
self.parent.parent.screens[3].ids.ml.clear_widgets()
self.parent.parent.screens[3].loadSent(state.association)
self.parent.parent.screens[16].clear_widgets()
self.parent.parent.screens[16].add_widget(Allmails())
toLabel = ''
@ -704,9 +694,8 @@ class Random(Screen):
self.ids.label.text = ''
self.parent.parent.parent.parent.ids.toolbar.opacity = 1
self.parent.parent.parent.parent.ids.toolbar.disabled = False
self.parent.parent.parent.parent.ids.sc10.clear_widgets()
self.parent.parent.parent.parent.ids.sc10.add_widget(MyAddress())
navApp.add_search_bar()
self.parent.parent.parent.parent.ids.sc10.ids.ml.clear_widgets()
self.parent.parent.parent.parent.ids.sc10.init_ui()
toast('New address created')
@ -718,9 +707,6 @@ class AddressSuccessful(Screen):
class Sent(Screen):
"""Sent Screen uses screen to show widgets of screens."""
data = ListProperty()
def __init__(self, *args, **kwargs):
"""Association with the screen."""
super(Sent, self).__init__(*args, **kwargs)
@ -745,6 +731,7 @@ class Sent(Screen):
where = ['subject', 'message']
what = state.searcing_text
xAddress = 'fromaddress'
data = []
queryreturn = kivy_helper_search.search_sql(
xAddress, account, "sent", where, what, False)
if state.msg_counter_objs and state.association == \
@ -760,13 +747,13 @@ class Sent(Screen):
src_mng_obj.send_cnt.badge_text = str(len(queryreturn))
state.sent_count = str(len(queryreturn))
for mail in queryreturn:
self.data.append({
data.append({
'text': mail[1].strip(),
'secondary_text': mail[2][:50] + '........' if len(
mail[2]) >= 50 else (
mail[2] + ',' + mail[3].replace('\n', ''))[0:50] + '........',
'lastactiontime': mail[6]})
for item in self.data:
for item in data:
meny = TwoLineAvatarIconListItem(
text=item['text'],
secondary_text=item['secondary_text'],
@ -811,7 +798,6 @@ class Sent(Screen):
def sent_detail(self, lastsenttime, *args):
"""Load sent mail details."""
remove_search_bar(self)
state.detailPageType = 'sent'
state.sentMailTime = lastsenttime
if self.manager:
@ -1034,16 +1020,9 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
BMConfigParser().get(text, 'label'), text)
self.root_window.children[1].ids.toolbar.title = address_label
state.association = text
self.root.ids.sc1.clear_widgets()
self.root.ids.sc1.add_widget(Inbox())
# self.root.ids.sc4.clear_widgets()
# self.root.ids.sc5.clear_widgets()
# self.root.ids.sc16.clear_widgets()
# self.root.ids.sc17.clear_widgets()
# self.root.ids.sc4.add_widget(Sent())
# self.root.ids.sc5.add_widget(Trash())
# self.root.ids.sc16.add_widget(Draft())
# self.root.ids.sc17.add_widget(Allmails())
state.searcing_text = ''
self.root.ids.sc1.ids.ml.clear_widgets()
self.root.ids.sc1.loadMessagelist(state.association)
self.root.ids.scr_mngr.current = 'inbox'
msg_counter_objs = \
@ -1091,7 +1070,13 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
if BMConfigParser().addresses():
img = identiconGeneration.generate(BMConfigParser().addresses()[0])
self.createFolder('./images/default_identicon/')
img.texture.save('./images/default_identicon/{}.png'.format(BMConfigParser().addresses()[0]))
if platform == 'android':
# android_path = os.path.expanduser("~/user/0/org.test.bitapp/files/app/")
android_path = os.path.join(os.environ['ANDROID_PRIVATE'] + '/app/')
img.texture.save('{1}/images/default_identicon/{0}.png'.format(
BMConfigParser().addresses()[0], android_path))
else:
img.texture.save('./images/default_identicon/{}.png'.format(BMConfigParser().addresses()[0]))
return BMConfigParser().addresses()[0]
return 'Select Address'
@ -1125,8 +1110,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
self.root.ids.scr_mngr.current = 'sent'\
if state.detailPageType == 'sent' else 'inbox' \
if state.detailPageType == 'inbox' else 'draft'
# if state.detailPageType in ['sent', 'inbox']:
# self.add_search_bar()
self.back_press()
elif self.root.ids.scr_mngr.current == "create":
composer_objs = self.root
@ -1142,7 +1125,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
self.root.ids.scr_mngr.current = 'login'
else:
self.root.ids.scr_mngr.current = 'inbox'
self.add_search_bar()
self.root.ids.scr_mngr.transition.direction = 'right'
self.root.ids.scr_mngr.transition.bind(on_complete=self.reset)
return True
@ -1162,7 +1144,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
def clear_composer(self):
"""If slow down the nwe will make new composer edit screen."""
self.set_navbar_for_composer()
self.root.ids.search_bar.clear_widgets()
# self.root.ids.search_bar.clear_widgets()
composer_obj = self.root.ids.sc3.children[0].ids
composer_obj.ti.text = ''
composer_obj.btn.text = 'Select'
@ -1190,8 +1172,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
self.root.ids.scr_mngr.transition.bind(on_complete=self.reset)
if state.is_allmail or state.detailPageType == 'draft':
state.is_allmail = False
else:
self.add_search_bar()
state.detailPageType = ''
state.in_composer = False
@ -1218,66 +1198,60 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
return label + address
return ''
def searchQuery(self, instance, *args):
def searchQuery(self, instance):
"""Method used for showing searched mails."""
state.search_screen = self.root.ids.scr_mngr.current
state.searcing_text = str(instance.text).strip()
if state.search_screen == 'inbox':
self.root.ids.sc1.clear_widgets()
self.root.ids.sc1.add_widget(Inbox())
self.root.ids.sc1.ids.ml.clear_widgets()
self.root.ids.sc1.loadMessagelist(state.association)
elif state.search_screen == 'addressbook':
self.root.ids.sc11.clear_widgets()
self.root.ids.sc11.add_widget(AddressBook())
self.root.ids.sc11.ids.ml.clear_widgets()
self.root.ids.sc11.loadAddresslist(None, 'All', '')
elif state.search_screen == 'myaddress':
self.root.ids.sc10.clear_widgets()
self.root.ids.sc10.add_widget(MyAddress())
self.root.ids.sc10.ids.ml.clear_widgets()
self.root.ids.sc10.init_ui()
else:
self.root.ids.sc4.clear_widgets()
self.root.ids.sc4.add_widget(Sent())
self.root.ids.sc4.ids.ml.clear_widgets()
self.root.ids.sc4.loadSent(state.association)
self.root.ids.scr_mngr.current = state.search_screen
def clearSreeen(self, text):
"""Method is used for clear screen"""
if text == 'Sent':
self.root.ids.sc4.clear_widgets()
self.root.ids.sc4.add_widget(Sent())
elif text == 'Draft':
def refreshScreen(self, instance):
"""Method show search button only on inbox or sent screen."""
state.searcing_text = ''
if instance.text == 'Sent':
self.root.ids.sc4.ids.ml.clear_widgets()
self.root.ids.sc4.children[1].children[1].ids.search_field.text = ''
self.root.ids.sc4.loadSent(state.association)
elif instance.text == 'Inbox':
self.root.ids.sc1.ids.ml.clear_widgets()
try:
self.root.ids.sc1.children[2].children[1].ids.search_field.text = ''
except Exception as e:
self.root.ids.sc1.children[1].children[1].ids.search_field.text = ''
self.root.ids.sc1.loadMessagelist(state.association)
elif instance.text == 'Draft':
self.root.ids.sc16.clear_widgets()
self.root.ids.sc16.add_widget(Draft())
elif text == 'Trash':
elif instance.text == 'Trash':
self.root.ids.sc5.clear_widgets()
self.root.ids.sc5.add_widget(Trash())
elif text == 'All Mails':
elif instance.text == 'All Mails':
self.root.ids.sc17.clear_widgets()
self.root.ids.sc17.add_widget(Allmails())
def check_search_screen(self, instance):
"""Method show search button only on inbox or sent screen."""
if instance.text in ['Sent', 'Draft', 'Trash', 'All Mails']:
self.clearSreeen(instance.text)
if instance.text in ['Inbox', 'Sent', 'Address Book', 'My Addresses']:
if not self.root.ids.search_bar.children:
self.root.ids.search_bar.add_widget(
MDIconButton(icon='magnify'))
text_field = MDTextField(
id='search_field', hint_text='Search')
text_field.bind(text=self.searchQuery)
self.root.ids.search_bar.add_widget(text_field)
self.root.ids.search_bar.children[0].text = ''
else:
self.root.ids.search_bar.clear_widgets()
state.searcing_text = ''
elif instance.text == 'Address Book':
self.root.ids.sc11.ids.ml.clear_widgets()
self.root.ids.sc11.children[1].children[1].ids.search_field.text = ''
self.root.ids.sc11.loadAddresslist(None, 'All', '')
elif instance.text == 'My Addresses':
self.root.ids.sc10.ids.ml.clear_widgets()
try:
self.root.ids.sc10.children[1].children[1].ids.search_field.text = ''
except Exception as e:
self.root.ids.sc10.children[2].children[1].ids.search_field.text = ''
self.root.ids.sc10.init_ui()
return
def add_search_bar(self):
"""Method used for adding search function on screen"""
if not self.root.ids.search_bar.children:
self.root.ids.search_bar.add_widget(MDIconButton(icon='magnify'))
text_field = MDTextField(
id='search_field', hint_text='Search')
text_field.bind(text=self.searchQuery)
self.root.ids.search_bar.add_widget(text_field)
def set_identicon(self, text):
"""This method is use for showing identicon in address spinner"""
img = identiconGeneration.generate(text)
@ -1306,16 +1280,9 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods
class GrashofPopup(Popup):
"""Methods for saving contacts, error messages."""
def __init__(self, **kwargs):
def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""Grash of pop screen settings."""
super(GrashofPopup, self).__init__(**kwargs)
print("sssssssssssssssssssiiiiiiiiiiiiiiizzzzzzzzzzeeeeee...............", state.screen_density)
if state.screen_density[0] <= 720:
self.size_hint_y = 0.4
self.size_hint_x = 0.9
else:
self.size_hint_y = 0.42
self.size_hint_x = 0.7
def savecontact(self):
"""Method is used for Saving Contacts."""
@ -1430,7 +1397,7 @@ class NavigationDrawerTwoLineListItem(
def _update_specific_text_color(self, instance, value):
pass
def _set_active(self, active, list): # pylint: disable=redefined-builtin
def _set_active(self, active, list_):
pass
@ -1491,17 +1458,17 @@ class MailDetail(Screen):
lastactiontime = {};".format(state.sentMailTime))
msg_count_objs.send_cnt.badge_text = str(int(state.sent_count) - 1)
state.sent_count = str(int(state.sent_count) - 1)
self.parent.screens[3].clear_widgets()
self.parent.screens[3].add_widget(Sent())
self.parent.screens[3].ids.ml.clear_widgets()
self.parent.screens[3].loadSent(state.association)
elif state.detailPageType == 'inbox':
sqlExecute(
"UPDATE inbox SET folder = 'trash' WHERE \
received = {};".format(state.sentMailTime))
# msg_count_objs.inbox_cnt.badge_text = str(
# int(state.inbox_count) - 1)
# int(state.inbox_count) - 1)
# state.inbox_count = str(int(state.inbox_count) - 1)
self.parent.screens[0].clear_widgets()
self.parent.screens[0].add_widget(Inbox())
self.parent.screens[0].ids.ml.clear_widgets()
self.parent.screens[0].loadMessagelist(state.association)
elif state.detailPageType == 'draft':
sqlExecute("DELETE FROM sent WHERE lastactiontime = '{}';".format(
state.sentMailTime))
@ -1533,6 +1500,7 @@ class MailDetail(Screen):
composer_obj.btn.text = data[0][0]
composer_obj.txt_input.text = data[0][1]
composer_obj.subject.text = data[0][2]
composer_obj.body.text = ''
state.kivyapp.root.ids.sc3.children[0].ids.rv.data = ''
self.parent.current = 'create'
state.kivyapp.set_navbar_for_composer()
@ -1571,15 +1539,9 @@ class MyaddDetailPopup(Popup):
address_label = StringProperty()
address = StringProperty()
def __init__(self, **kwargs):
def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""My Address Details screen setting."""
super(MyaddDetailPopup, self).__init__(**kwargs)
if state.screen_density[0] <= 720:
self.size_hint_y = 0.32
self.size_hint_x = 0.9
else:
self.size_hint_y = 0.32
self.size_hint_x = 0.7
def set_address(self, address, label):
"""Getting address for displaying details on popup."""
@ -1609,15 +1571,9 @@ class AddbookDetailPopup(Popup):
address_label = StringProperty()
address = StringProperty()
def __init__(self, **kwargs):
def __init__(self, **kwargs): # pylint: disable=useless-super-delegation
"""Method used set screen of address detail page."""
super(AddbookDetailPopup, self).__init__(**kwargs)
if state.screen_density[0] <= 720:
self.size_hint_y = 0.35
self.size_hint_x = 0.95
else:
self.size_hint_y = 0.35
self.size_hint_x = 0.7
def set_addbook_data(self, address, label):
"""Getting address book data for detial dipaly."""
@ -1629,8 +1585,8 @@ class AddbookDetailPopup(Popup):
if str(self.ids.add_label.text):
sqlExecute("UPDATE addressbook SET label = '{}' WHERE \
address = '{}';".format(str(self.ids.add_label.text), address))
self.parent.children[1].ids.sc11.clear_widgets()
self.parent.children[1].ids.sc11.add_widget(AddressBook())
self.parent.children[1].ids.sc11.ids.ml.clear_widgets()
self.parent.children[1].ids.sc11.loadAddresslist(None, 'All', '')
self.dismiss()
toast('Saved')
@ -1656,7 +1612,7 @@ class ShowQRCode(Screen):
def qrdisplay(self):
"""Method used for showing QR Code."""
self.manager.parent.parent.parent.ids.search_bar.clear_widgets()
# self.manager.parent.parent.parent.ids.search_bar.clear_widgets()
self.ids.qr.clear_widgets()
from kivy.garden.qrcode import QRCodeWidget
self.ids.qr.add_widget(QRCodeWidget(
@ -1685,19 +1641,15 @@ class Draft(Screen):
def sentaccounts(self):
"""Load draft accounts."""
account = state.association
self.loadSent(account, 'All', '')
self.loadDraft(account, 'All', '')
def loadSent(self, account, where="", what=""):
def loadDraft(self, account, where="", what=""):
"""Load draft list for Draft messages."""
xAddress = 'fromaddress'
queryreturn = kivy_helper_search.search_sql(
xAddress, account, "draft", where, what, False)
if state.msg_counter_objs:
state.msg_counter_objs.draft_cnt.badge_text = str(len(queryreturn))
# state.all_count = str(int(state.all_count) + 1)
# state.msg_counter_objs.allmail_cnt.badge_text = state.all_count
# state.msg_counter_objs = None
if queryreturn:
src_mng_obj = state.kivyapp.root.children[2].children[0].ids
src_mng_obj.draft_cnt.badge_text = str(len(queryreturn))
@ -1772,13 +1724,7 @@ class Draft(Screen):
if int(state.draft_count) > 0:
msg_count_objs.draft_cnt.badge_text = str(
int(state.draft_count) - 1)
# msg_count_objs.allmail_cnt.badge_text = str(
# int(state.all_count) - 1)
# msg_count_objs.trash_cnt.badge_text = str(
# int(state.trash_count) + 1)
state.draft_count = str(int(state.draft_count) - 1)
# state.all_count = str(int(state.all_count) - 1)
# state.trash_count = str(int(state.trash_count) + 1)
self.ids.ml.remove_widget(instance.parent.parent)
toast('Deleted')
@ -1840,19 +1786,9 @@ class CustomSpinner(Spinner):
def __init__(self, *args, **kwargs):
"""Method used for setting size of spinner."""
super(CustomSpinner, self).__init__(*args, **kwargs)
# max_value = 2.8
# self.dropdown_cls.max_height = self.height / 2 * max_value + max_value * 4
self.dropdown_cls.max_height = Window.size[1] / 3
def remove_search_bar(obj):
"""Remove search bar."""
try:
obj.parent.parent.parent.parent.parent.ids.search_bar.clear_widgets()
except Exception:
obj.parent.parent.parent.parent.ids.search_bar.clear_widgets()
class Allmails(Screen):
"""all mails Screen uses screen to show widgets of screens."""
@ -1932,7 +1868,6 @@ class Allmails(Screen):
def mail_detail(self, unique_id, folder, *args):
"""Load sent and inbox mail details."""
remove_search_bar(self)
state.detailPageType = folder
state.is_allmail = True
state.sentMailTime = unique_id
@ -1967,14 +1902,14 @@ class Allmails(Screen):
msg_count_objs.inbox_cnt.badge_text = str(
int(state.inbox_count) - 1)
state.inbox_count = str(int(state.inbox_count) - 1)
nav_lay_obj.sc1.clear_widgets()
nav_lay_obj.sc1.add_widget(Inbox())
nav_lay_obj.sc1.ids.ml.clear_widgets()
nav_lay_obj.sc1.loadMessagelist(state.association)
else:
msg_count_objs.send_cnt.badge_text = str(
int(state.sent_count) - 1)
state.sent_count = str(int(state.sent_count) - 1)
nav_lay_obj.sc4.clear_widgets()
nav_lay_obj.sc4.add_widget(Sent())
nav_lay_obj.sc4.ids.ml.clear_widgets()
nav_lay_obj.sc4.loadSent(state.association)
msg_count_objs.trash_cnt.badge_text = str(
int(state.trash_count) + 1)
msg_count_objs.allmail_cnt.badge_text = str(
@ -2026,6 +1961,7 @@ class Archieve(Screen):
pass
class Spam(Screen):
"""Spam Screen show widgets of page."""

View File

@ -17,11 +17,11 @@ resends getpubkey messages in 5 days (then 10 days, then 20 days, etc...)
resends msg messages in 5 days (then 10 days, then 20 days, etc...)
"""
# pylint: disable=relative-import, protected-access
import gc
import os
import shared
import time
import shared
import tr
from bmconfigparser import BMConfigParser
@ -36,11 +36,12 @@ import state
class singleCleaner(StoppableThread):
"""Base method that Cleanup knownnodes and handle possible severe exception"""
name = "singleCleaner"
cycleLength = 300
expireDiscoveredPeers = 300
def run(self):
def run(self): # pylint: disable=too-many-branches
gc.disable()
timeWeLastClearedInventoryAndPubkeysTables = 0
try:
@ -73,7 +74,7 @@ class singleCleaner(StoppableThread):
# If we are running as a daemon then we are going to fill up the UI
# queue which will never be handled by a UI. We should clear it to
# save memory.
# FIXME redundant?
# ..FIXME redundant?
if shared.thisapp.daemon or not state.enableGUI:
queues.UISignalQueue.queue.clear()
if timeWeLastClearedInventoryAndPubkeysTables < \
@ -128,9 +129,10 @@ class singleCleaner(StoppableThread):
"MainWindow",
'Alert: Your disk or data storage volume'
' is full. Bitmessage will now exit.'),
True)
True)
))
# FIXME redundant?
# ..FIXME redundant?
# pylint: disable=no-member
if shared.daemon or not state.enableGUI:
os._exit(1)
@ -153,7 +155,7 @@ class singleCleaner(StoppableThread):
del state.discoveredPeers[k]
except KeyError:
pass
# TODO: cleanup pending upload / download
# ..TODO: cleanup pending upload / download
gc.collect()
@ -162,6 +164,7 @@ class singleCleaner(StoppableThread):
def resendPubkeyRequest(address):
"""After a long time, method send getpubkey request"""
logger.debug(
'It has been a long time and we haven\'t heard a response to our'
' getpubkey request. Sending again.'
@ -186,6 +189,7 @@ def resendPubkeyRequest(address):
def resendMsg(ackdata):
"""After a long time, method send acknowledgement msg"""
logger.debug(
'It has been a long time and we haven\'t heard an acknowledgement'
' to our msg. Sending again.'

View File

@ -2,8 +2,8 @@
src/class_singleWorker.py
=========================
"""
# pylint: disable=protected-access,too-many-branches,too-many-statements,no-self-use,too-many-lines,too-many-locals
# pylint: disable=protected-access,too-many-branches,too-many-statements
# pylint: disable=no-self-use,too-many-lines,too-many-locals,relative-import
from __future__ import division
import hashlib
@ -34,6 +34,7 @@ from inventory import Inventory
# This thread, of which there is only one, does the heavy lifting:
# calculating POWs.
def sizeof_fmt(num, suffix='h/s'):
"""Format hashes per seconds nicely (SI prefix)"""
@ -469,7 +470,7 @@ class singleWorker(StoppableThread):
def sendOnionPeerObj(self, peer=None):
"""Send onionpeer object representing peer"""
if not peer: # find own onionhostname
for peer in state.ownAddresses:
for peer in state.ownAddresses: # pylint: disable=redefined-argument-from-local
if peer.host.endswith('.onion'):
break
else:
@ -478,7 +479,7 @@ class singleWorker(StoppableThread):
embeddedTime = int(time.time() + TTL)
streamNumber = 1 # Don't know yet what should be here
objectType = protocol.OBJECT_ONIONPEER
# FIXME: ideally the objectPayload should be signed
# ..FIXME: ideally the objectPayload should be signed
objectPayload = encodeVarint(peer.port) + protocol.encodeHost(peer.host)
tag = calculateInventoryHash(objectPayload)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 475 B

View File

@ -42,6 +42,7 @@ def constructObject(data):
else:
return returnObj
if paths.frozen is not None or platform == "android":
import messagetypes.message
import messagetypes.vote

View File

@ -4,6 +4,7 @@ src/messagetypes/message.py
"""
from debug import logger
from messagetypes import MsgBase
# pylint: disable=attribute-defined-outside-init
class Message(MsgBase):

View File

@ -4,6 +4,7 @@ src/messagetypes/vote.py
"""
from debug import logger
from messagetypes import MsgBase
# pylint: disable=attribute-defined-outside-init
class Vote(MsgBase):

View File

@ -1,3 +1,8 @@
"""
src/paths.py
============
"""
# pylint: disable=import-error
from os import environ, path
import sys
import re
@ -7,9 +12,14 @@ from kivy.utils import platform
# When using py2exe or py2app, the variable frozen is added to the sys
# namespace. This can be used to setup a different code path for
# binary distributions vs source distributions.
frozen = getattr(sys,'frozen', None)
frozen = getattr(sys, 'frozen', None)
def lookupExeFolder():
"""
Folder with PyBitmessage binary (.exe, .app, ...). If it is run from source, it returns the source root
directory
"""
if frozen:
if frozen == "macosx_app":
# targetdir/Bitmessage.app/Contents/MacOS/Bitmessage
@ -22,10 +32,12 @@ def lookupExeFolder():
exeFolder = ''
return exeFolder
def lookupAppdataFolder():
def lookupAppdataFolder(): # pylint: disable=too-many-branches
"""Folder with runtime data (like configuration, database, ...)"""
# flake8: noqa=F821
import traceback
print(traceback.print_tb)
print traceback.print_tb
APPNAME = "PyBitmessage"
if "BITMESSAGE_HOME" in environ:
dataFolder = environ["BITMESSAGE_HOME"]
@ -35,9 +47,11 @@ def lookupAppdataFolder():
if "HOME" in environ:
dataFolder = path.join(environ["HOME"], "Library/Application Support/", APPNAME) + '/'
else:
stringToLog = 'Could not find home folder, please report this message and your OS X version to the BitMessage Github.'
stringToLog = (
'Could not find home folder, please report this message'
' and your OS X version to the BitMessage Github.')
if 'logger' in globals():
logger.critical(stringToLog)
logger.critical(stringToLog) # pylint: disable=undefined-variable
else:
print stringToLog
sys.exit()
@ -58,7 +72,7 @@ def lookupAppdataFolder():
move(path.join(environ["HOME"], ".%s" % APPNAME), dataFolder)
stringToLog = "Moving data folder to %s" % (dataFolder)
if 'logger' in globals():
logger.info(stringToLog)
logger.info(stringToLog) # pylint: disable=undefined-variable
else:
print stringToLog
except IOError:
@ -67,16 +81,21 @@ def lookupAppdataFolder():
dataFolder = dataFolder + '/'
return dataFolder
def codePath():
"""Return the code path of the running instance"""
# pylint: disable=redefined-outer-name
if frozen == "macosx_app":
codePath = environ.get("RESOURCEPATH")
elif frozen: # windows
codePath = sys._MEIPASS
elif frozen: # windows
codePath = sys._MEIPASS # pylint: disable=no-member,protected-access
else:
codePath = path.dirname(__file__)
return codePath
def tail(f, lines=20):
"""Read last lines of a file. Like tail(1)"""
total_lines_wanted = lines
BLOCK_SIZE = 1024
@ -84,12 +103,13 @@ def tail(f, lines=20):
block_end_byte = f.tell()
lines_to_go = total_lines_wanted
block_number = -1
blocks = [] # blocks of size BLOCK_SIZE, in reverse order starting
# from the end of the file
blocks = []
# blocks of size BLOCK_SIZE, in reverse order starting
# from the end of the file
while lines_to_go > 0 and block_end_byte > 0:
if (block_end_byte - BLOCK_SIZE > 0):
if block_end_byte - BLOCK_SIZE > 0:
# read the last block we haven't yet read
f.seek(block_number*BLOCK_SIZE, 2)
f.seek(block_number * BLOCK_SIZE, 2)
blocks.append(f.read(BLOCK_SIZE))
else:
# file too small, start from begining
@ -105,6 +125,7 @@ def tail(f, lines=20):
def lastCommit():
"""Git commitish of the currently checked out repository"""
githeadfile = path.join(codePath(), '..', '.git', 'logs', 'HEAD')
result = {}
if path.isfile(githeadfile):

View File

@ -2,6 +2,7 @@
src/pyelliptic/openssl.py
=================================
"""
# pylint: disable=import-error
import sys
import ctypes
from kivy.utils import platform
@ -21,8 +22,6 @@ src/pyelliptic/openssl.py
# pylint: disable=protected-access
class CipherName:
"""Class returns cipher name, pointer and blocksize"""

View File

@ -1,20 +1,21 @@
"""
src/state.py
=================================
"""
import collections
neededPubkeys = {}
streamsInWhichIAmParticipating = []
# For UPnP
extPort = None
# for Tor hidden service
socksIP = None
# Network protocols availability, initialised below
networkProtocolAvailability = None
appdata = '' # holds the location of the application data storage directory
# Set to 1 by the doCleanShutdown function.
# Used to tell the proof of work worker threads to exit.
shutdown = 0
# Component control flags - set on startup, do not change during runtime
# The defaults are for standalone GUI (default operating mode)
enableNetwork = True # enable network threads
@ -23,18 +24,13 @@ enableAPI = True # enable API (if configured)
enableGUI = True # enable GUI (QT or ncurses)
enableSTDIO = False # enable STDIO threads
curses = False
sqlReady = False # set to true by sqlTread when ready for processing
maximumNumberOfHalfOpenConnections = 0
invThread = None
addrThread = None
downloadThread = None
uploadThread = None
ownAddresses = {}
# If the trustedpeer option is specified in keys.dat then this will
# contain a Peer which will be connected to instead of using the
# addresses advertised by other peers. The client will only connect to
@ -46,11 +42,19 @@ ownAddresses = {}
# it will sync with the network a lot faster without compromising
# security.
trustedPeer = None
discoveredPeers = {}
Peer = collections.namedtuple('Peer', ['host', 'port'])
def resetNetworkProtocolAvailability():
"""This method helps to reset the availability of network protocol"""
# pylint: disable=global-statement
global networkProtocolAvailability
networkProtocolAvailability = {'IPv4': None, 'IPv6': None, 'onion': None}
resetNetworkProtocolAvailability()
dandelion = 0
testmode = False

View File

@ -1,25 +1,43 @@
"""
src/tr.py
=================================
"""
# pylint: disable=relative-import
import os
import state
# This is used so that the translateText function can be used when we are in daemon mode and not using any QT functions.
class translateClass:
"""This is used so that the translateText function can be used """
"""when we are in daemon mode and not using any QT functions."""
class translateClass: # pylint: disable=old-style-class, too-few-public-methods
"""
This is used so that the translateText function can be used when we are
in daemon mode and not using any QT functions.
"""
def __init__(self, context, text):
self.context = context
self.text = text
def arg(self,argument):
if '%' in self.text:
return translateClass(self.context, self.text.replace('%','',1)) # This doesn't actually do anything with the arguments because we don't have a UI in which to display this information anyway.
else:
return self.text
def _translate(context, text, disambiguation = None, encoding = None, n = None):
def arg(self, argument): # pylint: disable=unused-argument
"""Replace argument placeholders"""
if '%' in self.text:
return translateClass(self.context, self.text.replace('%', '', 1))
# This doesn't actually do anything with the arguments
# because we don't have a UI in which to display this information anyway.
return self.text
def _translate(context, text, disambiguation=None, encoding=None, n=None): # pylint: disable=unused-argument
return translateText(context, text, n)
# def _translate(context, text, disambiguation = None, encoding = None, n = None):
# return translateClass(context, text.replace('%','',1))
def translateText(context, text, n = None):
def translateText(context, text, n=None):
"""Translate text in context"""
try:
enableGUI = state.enableGUI
except AttributeError: # inside the plugin
@ -28,15 +46,16 @@ def translateText(context, text, n = None):
try:
from PyQt4 import QtCore, QtGui
except Exception as err:
print '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 https://bitmessage.org/wiki/Daemon'
print '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 https://bitmessage.org/wiki/Daemon'
print 'Error message:', err
os._exit(0)
os._exit(0) # pylint: disable=protected-access
if n is None:
return QtGui.QApplication.translate(context, text)
else:
return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n)
return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n)
else:
if '%' in text:
return translateClass(context, text.replace('%','',1))
else:
return text
return translateClass(context, text.replace('%', '', 1))
return text