2019-09-17 16:44:26 +02:00
"""
2019-11-29 13:12:38 +01:00
Bitmessage android ( mobile ) interface
2019-09-17 16:44:26 +02:00
"""
2019-11-22 12:33:20 +01:00
# pylint: disable=relative-import, import-error, no-name-in-module
# pylint: disable=too-few-public-methods, too-many-lines, unused-argument
2019-09-12 11:11:33 +02:00
import os
2019-08-17 14:43:10 +02:00
import time
from bmconfigparser import BMConfigParser
2019-11-29 13:12:38 +01:00
from functools import partial
2019-08-17 14:43:10 +02:00
from helper_sql import sqlExecute , sqlQuery
2018-07-09 13:17:59 +02:00
from kivy . app import App
2019-08-17 14:43:10 +02:00
from kivy . clock import Clock
2019-09-12 11:11:33 +02:00
from kivy . core . clipboard import Clipboard
2019-08-17 14:43:10 +02:00
from kivy . core . window import Window
2018-07-18 14:49:39 +02:00
from kivy . lang import Builder
2019-05-09 14:48:29 +02:00
from kivy . metrics import dp
2019-08-17 14:43:10 +02:00
from kivy . properties import (
BooleanProperty ,
ListProperty ,
NumericProperty ,
ObjectProperty ,
2019-10-15 15:12:23 +02:00
StringProperty
)
2019-08-17 14:43:10 +02:00
from kivy . uix . behaviors import FocusBehavior
from kivy . uix . boxlayout import BoxLayout
from kivy . uix . button import Button
from kivy . uix . carousel import Carousel
2019-05-09 14:48:29 +02:00
from kivy . uix . image import Image
2019-08-17 14:43:10 +02:00
from kivy . uix . label import Label
from kivy . uix . popup import Popup
from kivy . uix . recycleboxlayout import RecycleBoxLayout
from kivy . uix . recycleview import RecycleView
from kivy . uix . recycleview . layout import LayoutSelectionBehavior
from kivy . uix . recycleview . views import RecycleDataViewBehavior
2019-08-03 13:49:28 +02:00
from kivy . uix . screenmanager import Screen
2019-08-17 14:43:10 +02:00
from kivy . uix . spinner import Spinner
from kivy . uix . textinput import TextInput
from kivy . utils import platform
2019-11-06 15:04:22 +01:00
2019-08-17 14:43:10 +02:00
import kivy_helper_search
2019-05-09 14:48:29 +02:00
from kivymd . button import MDIconButton
from kivymd . dialog import MDDialog
from kivymd . label import MDLabel
2019-08-17 14:43:10 +02:00
from kivymd . list import (
ILeftBody ,
ILeftBodyTouch ,
IRightBodyTouch ,
TwoLineAvatarIconListItem ,
2019-10-15 15:12:23 +02:00
TwoLineListItem
)
2019-08-05 12:19:19 +02:00
from kivymd . navigationdrawer import (
MDNavigationDrawer ,
2019-10-15 15:12:23 +02:00
NavigationDrawerHeaderBase
)
2019-05-09 14:48:29 +02:00
from kivymd . selectioncontrols import MDCheckbox
2018-07-25 12:25:47 +02:00
from kivymd . theming import ThemeManager
2019-11-06 15:04:22 +01:00
2019-05-09 14:48:29 +02:00
import queues
from semaphores import kivyuisignaler
2019-11-06 15:04:22 +01:00
2019-08-17 14:43:10 +02:00
import state
from uikivysignaler import UIkivySignaler
2019-09-12 11:11:33 +02:00
2019-09-20 13:19:04 +02:00
import identiconGeneration
2019-09-19 18:30:26 +02:00
2019-08-03 13:49:28 +02:00
2019-08-13 09:28:15 +02:00
def toast ( text ) :
2019-11-29 13:12:38 +01:00
""" Function displays toast message """
2019-10-15 15:12:23 +02:00
# pylint: disable=redefined-outer-name
from kivymd . toast . kivytoast import toast
2019-10-09 18:34:42 +02:00
toast ( text )
2019-08-13 09:28:15 +02:00
return
2019-08-13 13:54:04 +02:00
2019-05-09 14:48:29 +02:00
class Navigatorss ( MDNavigationDrawer ) :
2019-11-29 13:12:38 +01:00
""" Navigator class (image, title and logo) """
2019-05-09 14:48:29 +02:00
image_source = StringProperty ( ' images/qidenticon_two.png ' )
title = StringProperty ( ' Navigation ' )
drawer_logo = StringProperty ( )
2018-08-31 13:19:57 +02:00
2018-07-03 11:08:02 +02:00
2019-05-09 14:48:29 +02:00
class Inbox ( Screen ) :
2019-12-04 16:45:45 +01:00
""" Inbox Screen uses screen to show widgets of screens. """
2019-11-19 16:58:30 +01:00
queryreturn = ListProperty ( )
has_refreshed = True
2019-12-04 16:45:45 +01:00
account = StringProperty ( )
2019-08-03 13:49:28 +02:00
2019-05-09 14:48:29 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-12-04 16:45:45 +01:00
""" Method Parsing the address. """
2019-05-09 14:48:29 +02:00
super ( Inbox , self ) . __init__ ( * args , * * kwargs )
2019-12-04 16:45:45 +01:00
Clock . schedule_once ( self . init_ui , 0 )
def set_defaultAddress ( self ) :
""" This method set default address """
2019-05-13 13:31:33 +02:00
if state . association == ' ' :
if BMConfigParser ( ) . addresses ( ) :
state . association = BMConfigParser ( ) . addresses ( ) [ 0 ]
2018-08-31 13:19:57 +02:00
2019-05-09 14:48:29 +02:00
def init_ui ( self , dt = 0 ) :
2019-12-04 16:45:45 +01:00
""" Clock schdule for method inbox accounts. """
self . loadMessagelist ( )
2019-05-13 13:31:33 +02:00
2019-12-04 16:45:45 +01:00
def loadMessagelist ( self , where = " " , what = " " ) :
""" Load Inbox list for Inbox messages. """
2019-09-19 18:30:26 +02:00
# pylint: disable=too-many-locals
2019-12-04 16:45:45 +01:00
self . set_defaultAddress ( )
self . account = state . association
2019-08-02 11:11:33 +02:00
if state . searcing_text :
2019-11-26 14:19:44 +01:00
self . children [ 2 ] . children [ 0 ] . children [ 0 ] . scroll_y = 1.0
2019-08-02 11:11:33 +02:00
where = [ ' subject ' , ' message ' ]
what = state . searcing_text
2019-05-13 13:31:33 +02:00
xAddress = ' toaddress '
data = [ ]
2019-12-04 16:45:45 +01:00
self . inboxDataQuery ( xAddress , where , what )
2019-11-19 16:58:30 +01:00
if self . queryreturn :
2019-12-04 16:45:45 +01:00
state . kivyapp . get_inbox_count ( )
2019-09-19 18:30:26 +02:00
src_mng_obj = state . kivyapp . root . children [ 2 ] . children [ 0 ] . ids
2019-12-04 16:45:45 +01:00
src_mng_obj . inbox_cnt . badge_text = state . inbox_count
for mail in self . queryreturn :
2019-11-22 12:33:20 +01:00
# third_text = mail[3].replace('\n', ' ')
2019-08-03 13:49:28 +02:00
data . append ( {
' text ' : mail [ 4 ] . strip ( ) ,
2019-09-07 16:41:42 +02:00
' secondary_text ' : mail [ 5 ] [ : 50 ] + ' ........ ' if len (
2019-11-21 15:50:14 +01:00
mail [ 5 ] ) > = 50 else ( mail [ 5 ] + ' , ' + mail [ 3 ] . replace (
' \n ' , ' ' ) ) [ 0 : 50 ] + ' ........ ' ,
2019-10-03 18:27:54 +02:00
' msgid ' : mail [ 1 ] } )
2019-11-19 16:58:30 +01:00
self . has_refreshed = True
self . set_mdList ( data )
2019-11-21 15:50:14 +01:00
self . children [ 2 ] . children [ 0 ] . children [ 0 ] . bind (
scroll_y = self . check_scroll_y )
2019-05-09 14:48:29 +02:00
else :
2019-08-05 12:19:19 +02:00
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Primary ' ,
2019-08-13 13:54:04 +02:00
text = " No message found! " if state . searcing_text
else " yet no message for this account!!!!!!!!!!!!! " ,
2019-08-05 12:19:19 +02:00
halign = ' center ' ,
bold = True ,
size_hint_y = None ,
valign = ' top ' )
2019-05-13 13:31:33 +02:00
self . ids . ml . add_widget ( content )
2019-05-09 14:48:29 +02:00
2019-12-04 16:45:45 +01:00
def inboxDataQuery ( self , xAddress , where , what , start_indx = 0 , end_indx = 20 ) :
""" This method used for retrieving inbox data """
self . queryreturn = kivy_helper_search . search_sql (
xAddress , self . account , " inbox " , where , what , False , start_indx , end_indx )
2019-11-19 16:58:30 +01:00
def set_mdList ( self , data ) :
""" This method is used to create the mdList """
2019-12-04 16:45:45 +01:00
total_message = len ( self . ids . ml . children )
2019-11-19 16:58:30 +01:00
for item in data :
meny = TwoLineAvatarIconListItem (
text = item [ ' text ' ] ,
secondary_text = item [ ' secondary_text ' ] ,
theme_text_color = ' Custom ' ,
text_color = NavigateApp ( ) . theme_cls . primary_color )
2019-11-29 13:12:38 +01:00
meny . add_widget (
AvatarSampleWidget (
source = ' ./images/text_images/ {} .png ' . format (
avatarImageFirstLetter (
item [ ' secondary_text ' ] . strip ( ) ) ) ) )
meny . bind (
on_press = partial (
self . inbox_detail , item [ ' msgid ' ] ) )
2019-11-19 16:58:30 +01:00
carousel = Carousel ( direction = ' right ' )
carousel . height = meny . height
carousel . size_hint_y = None
carousel . ignore_perpendicular_swipes = True
carousel . data_index = 0
carousel . min_move = 0.2
del_btn = Button ( text = ' Delete ' )
del_btn . background_normal = ' '
del_btn . background_color = ( 1 , 0 , 0 , 1 )
2019-11-29 13:12:38 +01:00
del_btn . bind (
on_press = partial (
self . delete , item [ ' msgid ' ] ) )
2019-11-19 16:58:30 +01:00
carousel . add_widget ( del_btn )
carousel . add_widget ( meny )
ach_btn = Button ( text = ' Achieve ' )
ach_btn . background_color = ( 0 , 1 , 0 , 1 )
2019-11-29 13:12:38 +01:00
ach_btn . bind (
on_press = partial (
self . archive , item [ ' msgid ' ] ) )
2019-11-19 16:58:30 +01:00
carousel . add_widget ( ach_btn )
carousel . index = 1
self . ids . ml . add_widget ( carousel )
2019-12-04 16:45:45 +01:00
update_message = len ( self . ids . ml . children )
self . has_refreshed = True if total_message != update_message else False
2019-11-19 16:58:30 +01:00
def check_scroll_y ( self , instance , somethingelse ) :
""" This method is used to load data on scroll """
2019-11-21 15:50:14 +01:00
if self . children [ 2 ] . children [ 0 ] . children [
0 ] . scroll_y < = - 0.0 and self . has_refreshed :
2019-11-19 16:58:30 +01:00
self . children [ 2 ] . children [ 0 ] . children [ 0 ] . scroll_y = 0.06
total_message = len ( self . ids . ml . children )
2019-12-04 16:45:45 +01:00
self . update_inbox_screen_on_scroll ( total_message )
2019-11-19 16:58:30 +01:00
else :
pass
2019-12-04 16:45:45 +01:00
def update_inbox_screen_on_scroll ( self , total_message , where = " " , what = " " ) :
2019-11-19 16:58:30 +01:00
""" This method is used to load more data on scroll down """
data = [ ]
2019-12-04 16:45:45 +01:00
if state . searcing_text :
where = [ ' subject ' , ' message ' ]
what = state . searcing_text
self . inboxDataQuery ( ' toaddress ' , where , what , total_message , 5 )
for mail in self . queryreturn :
# third_text = mail[3].replace('\n', ' ')
2019-11-19 16:58:30 +01:00
data . append ( {
' text ' : mail [ 4 ] . strip ( ) ,
' secondary_text ' : mail [ 5 ] [ : 50 ] + ' ........ ' if len (
2019-11-21 15:50:14 +01:00
mail [ 5 ] ) > = 50 else ( mail [ 5 ] + ' , ' + mail [ 3 ] . replace (
' \n ' , ' ' ) ) [ 0 : 50 ] + ' ........ ' ,
2019-11-19 16:58:30 +01:00
' msgid ' : mail [ 1 ] } )
self . set_mdList ( data )
2019-10-03 18:27:54 +02:00
def inbox_detail ( self , msg_id , * args ) :
2019-11-29 13:12:38 +01:00
""" Load inbox page details """
2019-06-06 15:48:20 +02:00
state . detailPageType = ' inbox '
2019-10-03 18:27:54 +02:00
state . mail_id = msg_id
2019-06-06 15:48:20 +02:00
if self . manager :
src_mng_obj = self . manager
else :
src_mng_obj = self . parent . parent
src_mng_obj . screens [ 13 ] . clear_widgets ( )
src_mng_obj . screens [ 13 ] . add_widget ( MailDetail ( ) )
src_mng_obj . current = ' mailDetail '
def delete ( self , data_index , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Delete inbox mail from inbox listing """
2019-08-05 12:19:19 +02:00
sqlExecute (
2019-10-04 15:54:58 +02:00
" UPDATE inbox SET folder = ' trash ' WHERE msgid = ?; " , str (
2019-08-05 12:19:19 +02:00
data_index ) )
2019-09-27 18:31:37 +02:00
try :
2019-11-21 15:50:14 +01:00
msg_count_objs = (
self . parent . parent . parent . parent . children [ 2 ] . children [ 0 ] . ids )
2019-10-15 15:12:23 +02:00
except Exception :
2019-11-21 15:50:14 +01:00
msg_count_objs = (
self . parent . parent . parent . parent . parent . children [
2 ] . children [ 0 ] . ids )
2019-07-17 10:50:27 +02:00
if int ( state . inbox_count ) > 0 :
2019-08-05 12:19:19 +02:00
msg_count_objs . inbox_cnt . badge_text = str (
int ( state . inbox_count ) - 1 )
msg_count_objs . trash_cnt . badge_text = str (
int ( state . trash_count ) + 1 )
2019-09-19 18:30:26 +02:00
msg_count_objs . allmail_cnt . badge_text = str (
int ( state . all_count ) - 1 )
2019-08-20 15:11:18 +02:00
state . inbox_count = str (
int ( state . inbox_count ) - 1 )
state . trash_count = str (
int ( state . trash_count ) + 1 )
2019-09-19 18:30:26 +02:00
state . all_count = str (
int ( state . all_count ) - 1 )
2019-08-20 15:11:18 +02:00
self . ids . ml . remove_widget (
instance . parent . parent )
2019-08-13 09:28:15 +02:00
toast ( ' Deleted ' )
2019-06-06 15:48:20 +02:00
self . update_trash ( )
def archive ( self , data_index , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Archive inbox mail from inbox listing """
2019-08-20 15:11:18 +02:00
sqlExecute (
2019-10-04 15:54:58 +02:00
" UPDATE inbox SET folder = ' trash ' WHERE msgid = ?; " , str (
2019-08-20 15:11:18 +02:00
data_index ) )
2019-06-06 15:48:20 +02:00
self . ids . ml . remove_widget ( instance . parent . parent )
self . update_trash ( )
def update_trash ( self ) :
2019-11-29 13:12:38 +01:00
""" Update trash screen mails which is deleted from inbox """
2019-06-06 15:48:20 +02:00
try :
self . parent . screens [ 4 ] . clear_widgets ( )
self . parent . screens [ 4 ] . add_widget ( Trash ( ) )
2019-08-13 14:46:19 +02:00
except Exception :
2019-06-06 15:48:20 +02:00
self . parent . parent . screens [ 4 ] . clear_widgets ( )
self . parent . parent . screens [ 4 ] . add_widget ( Trash ( ) )
2019-08-21 16:24:56 +02:00
# pylint: disable=attribute-defined-outside-init
2019-08-02 11:11:33 +02:00
def refresh_callback ( self , * args ) :
2019-11-21 15:50:14 +01:00
""" Method updates the state of application,
2019-11-29 13:12:38 +01:00
While the spinner remains on the screen """
2019-08-02 11:11:33 +02:00
def refresh_callback ( interval ) :
2019-11-29 13:12:38 +01:00
""" Method used for loading the inbox screen data """
2019-09-27 18:31:37 +02:00
state . searcing_text = ' '
2019-11-08 13:08:26 +01:00
self . children [ 2 ] . children [ 1 ] . ids . search_field . text = ' '
2019-08-02 11:11:33 +02:00
self . ids . ml . clear_widgets ( )
2019-09-27 18:31:37 +02:00
self . loadMessagelist ( state . association )
2019-11-19 16:58:30 +01:00
self . has_refreshed = True
2019-08-02 11:11:33 +02:00
self . ids . refresh_layout . refresh_done ( )
self . tick = 0
Clock . schedule_once ( refresh_callback , 1 )
2019-06-06 15:48:20 +02:00
2019-11-08 13:08:26 +01:00
def set_root_layout ( self ) :
2019-11-21 15:50:14 +01:00
""" Setting root layout """
2019-11-08 13:08:26 +01:00
return self . parent . parent . parent
2019-05-09 14:48:29 +02:00
class MyAddress ( Screen ) :
2019-12-04 16:45:45 +01:00
""" MyAddress screen uses screen to show widgets of screens. """
2019-11-19 16:58:30 +01:00
addresses_list = ListProperty ( )
has_refreshed = True
2019-12-04 16:45:45 +01:00
is_add_created = False
2019-08-03 13:49:28 +02:00
2019-05-09 14:48:29 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-12-04 16:45:45 +01:00
""" Clock schdule for method Myaddress accounts. """
2019-05-09 14:48:29 +02:00
super ( MyAddress , self ) . __init__ ( * args , * * kwargs )
Clock . schedule_once ( self . init_ui , 0 )
def init_ui ( self , dt = 0 ) :
2019-12-04 16:45:45 +01:00
""" Clock schdule for method Myaddress accounts """
2019-09-09 16:17:07 +02:00
# pylint: disable=unnecessary-lambda, deprecated-lambda
2019-11-19 16:58:30 +01:00
self . addresses_list = state . kivyapp . variable_1
2019-08-13 09:28:15 +02:00
if state . searcing_text :
2019-11-26 14:19:44 +01:00
self . ids . refresh_layout . scroll_y = 1.0
2019-09-09 16:17:07 +02:00
filtered_list = filter (
lambda addr : self . filter_address (
addr ) , BMConfigParser ( ) . addresses ( ) )
2019-11-19 16:58:30 +01:00
self . addresses_list = filtered_list
self . addresses_list = [ obj for obj in reversed ( self . addresses_list ) ]
if self . addresses_list :
self . has_refreshed = True
self . set_mdList ( 0 , 15 )
self . ids . refresh_layout . bind ( scroll_y = self . check_scroll_y )
2019-05-13 13:31:33 +02:00
else :
2019-08-05 12:19:19 +02:00
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Primary ' ,
2019-08-13 13:54:04 +02:00
text = " No address found! " if state . searcing_text
else " yet no address is created by user!!!!!!!!!!!!! " ,
2019-08-05 12:19:19 +02:00
halign = ' center ' ,
bold = True ,
size_hint_y = None ,
valign = ' top ' )
2019-05-13 13:31:33 +02:00
self . ids . ml . add_widget ( content )
2019-12-04 16:45:45 +01:00
if not state . searcing_text and not self . is_add_created :
2019-09-27 18:31:37 +02:00
try :
self . manager . current = ' login '
except Exception :
pass
2019-05-09 14:48:29 +02:00
2019-11-19 16:58:30 +01:00
def set_mdList ( self , first_index , last_index ) :
2019-11-29 13:12:38 +01:00
""" Creating the mdlist """
2019-11-19 16:58:30 +01:00
data = [ ]
for address in self . addresses_list [ first_index : last_index ] :
data . append ( {
' text ' : BMConfigParser ( ) . get ( address , ' label ' ) ,
' secondary_text ' : address } )
for item in data :
meny = TwoLineAvatarIconListItem (
text = item [ ' text ' ] ,
secondary_text = item [ ' secondary_text ' ] ,
theme_text_color = ' Custom ' ,
text_color = NavigateApp ( ) . theme_cls . primary_color )
meny . add_widget ( AvatarSampleWidget (
2019-11-21 15:50:14 +01:00
source = ' ./images/text_images/ {} .png ' . format (
avatarImageFirstLetter ( item [ ' text ' ] . strip ( ) ) ) ) )
2019-11-19 16:58:30 +01:00
meny . bind ( on_press = partial (
self . myadd_detail , item [ ' secondary_text ' ] , item [ ' text ' ] ) )
self . ids . ml . add_widget ( meny )
def check_scroll_y ( self , instance , somethingelse ) :
2019-11-29 13:12:38 +01:00
""" Load data on scroll down """
2019-11-19 16:58:30 +01:00
if self . ids . refresh_layout . scroll_y < = - 0.0 and self . has_refreshed :
self . ids . refresh_layout . scroll_y = 0.06
my_addresses = len ( self . ids . ml . children )
if my_addresses != len ( self . addresses_list ) :
self . update_addressBook_on_scroll ( my_addresses )
2019-11-21 15:50:14 +01:00
self . has_refreshed = True if my_addresses != len (
self . addresses_list ) else False
2019-11-19 16:58:30 +01:00
else :
pass
def update_addressBook_on_scroll ( self , my_addresses ) :
2019-11-29 13:12:38 +01:00
""" Loads more data on scroll down """
2019-11-21 15:50:14 +01:00
self . set_mdList ( my_addresses , my_addresses + 20 )
2019-11-19 16:58:30 +01:00
2019-08-16 16:49:55 +02:00
@staticmethod
def myadd_detail ( fromaddress , label , * args ) :
2019-11-29 13:12:38 +01:00
""" Load myaddresses details """
2019-06-06 15:48:20 +02:00
p = MyaddDetailPopup ( )
p . open ( )
2019-06-28 16:54:47 +02:00
p . set_address ( fromaddress , label )
2019-06-06 15:48:20 +02:00
2019-08-21 16:24:56 +02:00
# pylint: disable=attribute-defined-outside-init
2019-08-02 11:11:33 +02:00
def refresh_callback ( self , * args ) :
2019-11-21 15:50:14 +01:00
""" Method updates the state of application,
2019-11-29 13:12:38 +01:00
While the spinner remains on the screen """
2019-08-02 11:11:33 +02:00
def refresh_callback ( interval ) :
2019-11-29 13:12:38 +01:00
""" Method used for loading the myaddress screen data """
2019-09-27 18:31:37 +02:00
state . searcing_text = ' '
2019-11-04 17:27:53 +01:00
state . kivyapp . root . ids . sc10 . children [ 2 ] . active = False
2019-11-08 13:08:26 +01:00
self . children [ 2 ] . children [ 1 ] . ids . search_field . text = ' '
2019-11-19 16:58:30 +01:00
self . has_refreshed = True
2019-08-02 11:11:33 +02:00
self . ids . ml . clear_widgets ( )
2019-09-27 18:31:37 +02:00
self . init_ui ( )
2019-08-02 11:11:33 +02:00
self . ids . refresh_layout . refresh_done ( )
self . tick = 0
Clock . schedule_once ( refresh_callback , 1 )
2019-08-16 16:49:55 +02:00
@staticmethod
def filter_address ( address ) :
2019-11-29 13:12:38 +01:00
""" Method will filter the my address list data """
# if filter(lambda x: (state.searcing_text).lower() in x, [
# BMConfigParser().get(
# address, 'label').lower(), address.lower()]):
if [ x for x in [ BMConfigParser ( ) . get ( address , ' label ' ) . lower ( ) , address . lower ( ) ] ] :
2019-08-08 18:20:58 +02:00
return True
return False
2019-11-08 13:08:26 +01:00
def set_root_layout ( self ) :
2019-11-21 15:50:14 +01:00
""" Setting root layout """
2019-11-08 13:08:26 +01:00
return self . manager . parent . parent
2019-05-09 14:48:29 +02:00
class AddressBook ( Screen ) :
2019-11-29 13:12:38 +01:00
""" AddressBook Screen uses screen to show widgets of screens """
2019-11-19 16:58:30 +01:00
queryreturn = ListProperty ( )
has_refreshed = True
2019-08-03 13:49:28 +02:00
2019-05-09 14:48:29 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Getting AddressBook Details """
2019-05-09 14:48:29 +02:00
super ( AddressBook , self ) . __init__ ( * args , * * kwargs )
Clock . schedule_once ( self . init_ui , 0 )
2018-07-03 12:06:20 +02:00
2019-05-09 14:48:29 +02:00
def init_ui ( self , dt = 0 ) :
2019-11-29 13:12:38 +01:00
""" Clock Schdule for method AddressBook """
2019-08-07 17:39:46 +02:00
self . loadAddresslist ( None , ' All ' , ' ' )
2019-08-13 14:46:19 +02:00
print dt
2019-08-07 17:39:46 +02:00
def loadAddresslist ( self , account , where = " " , what = " " ) :
2019-11-29 13:12:38 +01:00
""" Clock Schdule for method AddressBook """
2019-08-07 17:39:46 +02:00
if state . searcing_text :
2019-11-26 14:19:44 +01:00
self . ids . scroll_y . scroll_y = 1.0
2019-08-07 17:39:46 +02:00
where = [ ' label ' , ' address ' ]
what = state . searcing_text
xAddress = ' '
2019-11-19 16:58:30 +01:00
self . queryreturn = kivy_helper_search . search_sql (
2019-08-07 17:39:46 +02:00
xAddress , account , " addressbook " , where , what , False )
2019-11-19 16:58:30 +01:00
self . queryreturn = [ obj for obj in reversed ( self . queryreturn ) ]
if self . queryreturn :
self . has_refreshed = True
2019-11-21 15:50:14 +01:00
self . set_mdList ( 0 , 20 )
2019-11-19 16:58:30 +01:00
self . ids . scroll_y . bind ( scroll_y = self . check_scroll_y )
2019-05-09 14:48:29 +02:00
else :
2019-08-13 13:54:04 +02:00
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Primary ' ,
text = " No contact found! " if state . searcing_text
else " No contact found yet...... " ,
halign = ' center ' ,
bold = True ,
size_hint_y = None ,
valign = ' top ' )
2019-05-09 14:48:29 +02:00
self . ids . ml . add_widget ( content )
2019-11-19 16:58:30 +01:00
def set_mdList ( self , start_index , end_index ) :
2019-11-29 13:12:38 +01:00
""" Creating the mdList """
2019-11-19 16:58:30 +01:00
for item in self . queryreturn [ start_index : end_index ] :
meny = TwoLineAvatarIconListItem (
text = item [ 0 ] ,
secondary_text = item [ 1 ] ,
theme_text_color = ' Custom ' ,
text_color = NavigateApp ( ) . theme_cls . primary_color )
meny . add_widget ( AvatarSampleWidget (
2019-11-21 15:50:14 +01:00
source = ' ./images/text_images/ {} .png ' . format (
avatarImageFirstLetter ( item [ 0 ] . strip ( ) ) ) ) )
2019-11-19 16:58:30 +01:00
meny . bind ( on_press = partial (
self . addBook_detail , item [ 1 ] , item [ 0 ] ) )
carousel = Carousel ( direction = ' right ' )
carousel . height = meny . height
carousel . size_hint_y = None
carousel . ignore_perpendicular_swipes = True
carousel . data_index = 0
carousel . min_move = 0.2
del_btn = Button ( text = ' Delete ' )
del_btn . background_normal = ' '
del_btn . background_color = ( 1 , 0 , 0 , 1 )
del_btn . bind ( on_press = partial ( self . delete_address , item [ 1 ] ) )
carousel . add_widget ( del_btn )
carousel . add_widget ( meny )
carousel . index = 1
self . ids . ml . add_widget ( carousel )
def check_scroll_y ( self , instance , somethingelse ) :
2019-11-29 13:12:38 +01:00
""" Load data on scroll """
2019-11-19 16:58:30 +01:00
if self . ids . scroll_y . scroll_y < = - 0.0 and self . has_refreshed :
self . ids . scroll_y . scroll_y = 0.06
exist_addresses = len ( self . ids . ml . children )
if exist_addresses != len ( self . queryreturn ) :
self . update_addressBook_on_scroll ( exist_addresses )
2019-11-21 15:50:14 +01:00
self . has_refreshed = True if exist_addresses != len (
self . queryreturn ) else False
2019-11-19 16:58:30 +01:00
else :
pass
def update_addressBook_on_scroll ( self , exist_addresses ) :
2019-11-29 13:12:38 +01:00
""" Load more data on scroll down """
2019-11-28 15:50:00 +01:00
self . set_mdList ( exist_addresses , exist_addresses + 5 )
2019-11-19 16:58:30 +01:00
2019-08-16 16:49:55 +02:00
@staticmethod
def refreshs ( * args ) :
2019-11-29 13:12:38 +01:00
""" Refresh the Widget """
2019-10-09 18:34:42 +02:00
# state.navinstance.ids.sc11.ids.ml.clear_widgets()
# state.navinstance.ids.sc11.loadAddresslist(None, 'All', '')
pass
2019-05-09 14:48:29 +02:00
2019-08-16 16:49:55 +02:00
@staticmethod
def addBook_detail ( address , label , * args ) :
2019-11-29 13:12:38 +01:00
""" Addressbook details """
2019-06-28 16:54:47 +02:00
p = AddbookDetailPopup ( )
p . open ( )
p . set_addbook_data ( address , label )
2019-05-13 13:31:33 +02:00
2019-07-17 10:50:27 +02:00
def delete_address ( self , address , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Delete inbox mail from inbox listing """
2019-07-17 10:50:27 +02:00
self . ids . ml . remove_widget ( instance . parent . parent )
2019-08-05 12:19:19 +02:00
sqlExecute (
" DELETE FROM addressbook WHERE address = ' {} ' ; " . format ( address ) )
2019-07-17 10:50:27 +02:00
2019-11-21 15:50:14 +01:00
class SelectableRecycleBoxLayout (
FocusBehavior , LayoutSelectionBehavior , RecycleBoxLayout ) :
2019-11-29 13:12:38 +01:00
""" Adds selection and focus behaviour to the view """
2019-11-21 15:50:14 +01:00
# pylint: disable = too-many-ancestors
2019-05-13 13:31:33 +02:00
pass
2019-05-09 14:48:29 +02:00
class SelectableLabel ( RecycleDataViewBehavior , Label ) :
2019-11-29 13:12:38 +01:00
""" Add selection support to the Label """
2019-05-09 14:48:29 +02:00
index = None
selected = BooleanProperty ( False )
selectable = BooleanProperty ( True )
def refresh_view_attrs ( self , rv , index , data ) :
2019-11-29 13:12:38 +01:00
""" Catch and handle the view changes """
2019-05-09 14:48:29 +02:00
self . index = index
return super ( SelectableLabel , self ) . refresh_view_attrs (
rv , index , data )
2019-08-20 15:11:18 +02:00
# pylint: disable=inconsistent-return-statements
2019-05-09 14:48:29 +02:00
def on_touch_down ( self , touch ) :
2019-11-29 13:12:38 +01:00
""" Add selection on touch down """
2019-05-09 14:48:29 +02:00
if super ( SelectableLabel , self ) . on_touch_down ( touch ) :
2018-09-05 12:12:41 +02:00
return True
2019-05-09 14:48:29 +02:00
if self . collide_point ( * touch . pos ) and self . selectable :
return self . parent . select_with_touch ( self . index , touch )
2018-09-05 12:12:41 +02:00
2019-05-09 14:48:29 +02:00
def apply_selection ( self , rv , index , is_selected ) :
2019-11-29 13:12:38 +01:00
""" Respond to the selection of items in the view """
2019-05-09 14:48:29 +02:00
self . selected = is_selected
if is_selected :
2019-08-13 14:46:19 +02:00
print " selection changed to {0} " . format ( rv . data [ index ] )
2019-08-03 13:49:28 +02:00
rv . parent . txt_input . text = rv . parent . txt_input . text . replace (
rv . parent . txt_input . text , rv . data [ index ] [ ' text ' ] )
2018-09-05 12:12:41 +02:00
2018-08-07 08:14:14 +02:00
2019-05-09 14:48:29 +02:00
class RV ( RecycleView ) :
2019-11-29 13:12:38 +01:00
""" Recycling View """
2019-08-03 13:49:28 +02:00
2019-11-29 13:12:38 +01:00
def __init__ ( self , * * kwargs ) : # pylint: disable=useless-super-delegation
""" Recycling Method """
2019-05-09 14:48:29 +02:00
super ( RV , self ) . __init__ ( * * kwargs )
2018-07-03 12:06:20 +02:00
2018-08-21 14:48:16 +02:00
2019-05-09 14:48:29 +02:00
class DropDownWidget ( BoxLayout ) :
2019-11-29 13:12:38 +01:00
""" Adding Dropdown Widget """
2019-11-21 15:50:14 +01:00
# pylint: disable=too-many-statements, too-many-locals
# pylint: disable=inconsistent-return-statements
2019-05-09 14:48:29 +02:00
txt_input = ObjectProperty ( )
rv = ObjectProperty ( )
2018-08-21 14:48:16 +02:00
2019-10-15 15:12:23 +02:00
def send ( self , navApp ) :
2019-11-29 13:12:38 +01:00
""" Send message from one address to another """
2019-05-09 14:48:29 +02:00
fromAddress = str ( self . ids . ti . text )
toAddress = str ( self . ids . txt_input . text )
2019-09-06 17:20:58 +02:00
subject = self . ids . subject . text . encode ( ' utf-8 ' ) . strip ( )
message = self . ids . body . text . encode ( ' utf-8 ' ) . strip ( )
2019-05-09 14:48:29 +02:00
encoding = 3
2019-08-13 14:46:19 +02:00
print " message: " , self . ids . body . text
2019-05-09 14:48:29 +02:00
sendMessageToPeople = True
if sendMessageToPeople :
2019-05-13 13:31:33 +02:00
if toAddress != ' ' and subject and message :
2019-05-09 14:48:29 +02:00
from addresses import decodeAddress
2019-11-21 15:50:14 +01:00
status , addressVersionNumber , streamNumber , ripe = (
decodeAddress ( toAddress ) )
2019-05-09 14:48:29 +02:00
if status == ' success ' :
2019-11-08 13:08:26 +01:00
navApp . root . ids . sc3 . children [ 0 ] . active = True
2019-11-22 12:33:20 +01:00
if state . detailPageType == ' draft ' \
and state . send_draft_mail :
2019-08-19 13:06:24 +02:00
sqlExecute (
2019-10-15 15:12:23 +02:00
" UPDATE sent SET toaddress = ? "
" , fromaddress = ? , subject = ? "
" , message = ?, folder = ' sent ' "
" WHERE ackdata = ?; " ,
2019-10-04 15:54:58 +02:00
toAddress ,
fromAddress ,
subject ,
message ,
str ( state . send_draft_mail ) )
2019-08-19 13:06:24 +02:00
self . parent . parent . screens [ 15 ] . clear_widgets ( )
self . parent . parent . screens [ 15 ] . add_widget ( Draft ( ) )
2019-08-23 12:26:35 +02:00
state . detailPageType = ' '
state . send_draft_mail = None
2019-08-19 13:06:24 +02:00
else :
from addresses import addBMIfNotPresent
toAddress = addBMIfNotPresent ( toAddress )
statusIconColor = ' red '
2019-11-21 15:50:14 +01:00
if ( addressVersionNumber > 4 ) or (
addressVersionNumber < = 1 ) :
print " addressVersionNumber > 4 " \
" or addressVersionNumber <= 1 "
2019-08-19 13:06:24 +02:00
if streamNumber > 1 or streamNumber == 0 :
print " streamNumber > 1 or streamNumber == 0 "
if statusIconColor == ' red ' :
print " shared.statusIconColor == ' red ' "
stealthLevel = BMConfigParser ( ) . safeGetInt (
' bitmessagesettings ' , ' ackstealthlevel ' )
from helper_ackPayload import genAckPayload
ackdata = genAckPayload ( streamNumber , stealthLevel )
2019-11-22 12:33:20 +01:00
# t = ()
2019-08-19 13:06:24 +02:00
sqlExecute (
''' INSERT INTO sent VALUES
( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ''' ,
' ' ,
toAddress ,
ripe ,
fromAddress ,
subject ,
message ,
ackdata ,
int ( time . time ( ) ) ,
int ( time . time ( ) ) ,
0 ,
' msgqueued ' ,
0 ,
' sent ' ,
encoding ,
2019-08-21 16:24:56 +02:00
BMConfigParser ( ) . getint (
' bitmessagesettings ' , ' ttl ' ) )
2019-06-28 16:54:47 +02:00
state . check_sent_acc = fromAddress
2019-08-05 12:19:19 +02:00
state . msg_counter_objs = self . parent . parent . parent . parent \
2019-11-08 13:08:26 +01:00
. parent . parent . children [ 2 ] . children [ 0 ] . ids
2019-11-19 16:58:30 +01:00
# self.parent.parent.screens[0].ids.ml.clear_widgets()
# self.parent.parent.screens[0].loadMessagelist(state.association)
self . parent . parent . screens [ 3 ] . update_sent_messagelist ( )
2019-08-19 13:06:24 +02:00
self . parent . parent . screens [ 16 ] . clear_widgets ( )
self . parent . parent . screens [ 16 ] . add_widget ( Allmails ( ) )
2019-11-19 16:58:30 +01:00
Clock . schedule_once ( self . callback_for_msgsend , 3 )
2019-05-09 14:48:29 +02:00
queues . workerQueue . put ( ( ' sendmessage ' , toAddress ) )
2019-08-13 14:46:19 +02:00
print " sqlExecute successfully ####################### "
2019-09-11 17:03:51 +02:00
state . in_composer = True
2019-11-08 13:08:26 +01:00
return
2019-05-13 13:31:33 +02:00
else :
msg = ' Enter a valid recipients address '
elif not toAddress :
2019-05-28 13:12:51 +02:00
msg = ' Please fill the form '
else :
msg = ' Please fill the form '
self . address_error_message ( msg )
2019-05-13 13:31:33 +02:00
2019-11-21 15:50:14 +01:00
@staticmethod
def callback_for_msgsend ( dt = 0 ) :
""" Callback method for messagesend """
2019-11-08 13:08:26 +01:00
state . kivyapp . root . ids . sc3 . children [ 0 ] . active = False
state . in_sent_method = True
state . kivyapp . back_press ( )
toast ( ' sent ' )
2019-08-21 16:24:56 +02:00
# pylint: disable=attribute-defined-outside-init
2019-05-13 13:31:33 +02:00
def address_error_message ( self , msg ) :
2019-11-29 13:12:38 +01:00
""" Generates error message """
2019-09-11 17:03:51 +02:00
msg_dialog = MDDialog (
2019-08-05 12:19:19 +02:00
text = msg ,
2019-09-11 17:03:51 +02:00
title = ' ' , size_hint = ( .8 , .25 ) , text_button_ok = ' Ok ' ,
events_callback = self . callback_for_menu_items )
msg_dialog . open ( )
2019-09-12 11:43:11 +02:00
@staticmethod
def callback_for_menu_items ( text_item ) :
2019-11-29 13:12:38 +01:00
""" Callback of alert box """
2019-09-11 17:03:51 +02:00
toast ( text_item )
2018-08-31 13:19:57 +02:00
2019-08-13 09:28:15 +02:00
def reset_composer ( self ) :
2019-11-29 13:12:38 +01:00
""" Method will reset composer """
2019-08-13 09:28:15 +02:00
self . ids . ti . text = ' '
self . ids . btn . text = ' Select '
self . ids . txt_input . text = ' '
self . ids . subject . text = ' '
self . ids . body . text = ' '
2019-10-10 18:08:52 +02:00
toast ( " Reset message " )
2019-08-13 09:28:15 +02:00
2019-08-21 10:07:47 +02:00
def auto_fill_fromaddr ( self ) :
2019-11-29 13:12:38 +01:00
""" Fill the text automatically From Address """
2019-08-21 10:07:47 +02:00
self . ids . ti . text = self . ids . btn . text
self . ids . ti . focus = True
2018-07-24 12:05:39 +02:00
2019-05-09 14:48:29 +02:00
class MyTextInput ( TextInput ) :
2019-11-29 13:12:38 +01:00
""" Takes the text input in the field """
2019-05-09 14:48:29 +02:00
txt_input = ObjectProperty ( )
flt_list = ObjectProperty ( )
word_list = ListProperty ( )
starting_no = NumericProperty ( 3 )
suggestion_text = ' '
2019-11-29 13:12:38 +01:00
def __init__ ( self , * * kwargs ) : # pylint: disable=useless-super-delegation
""" Getting Text Input """
2019-05-09 14:48:29 +02:00
super ( MyTextInput , self ) . __init__ ( * * kwargs )
def on_text ( self , instance , value ) :
2019-11-29 13:12:38 +01:00
""" Find all the occurrence of the word """
2019-05-09 14:48:29 +02:00
self . parent . parent . parent . parent . ids . rv . data = [ ]
2019-08-05 09:24:32 +02:00
matches = [ self . word_list [ i ] for i in range (
2019-08-05 12:19:19 +02:00
len ( self . word_list ) ) if self . word_list [
2019-08-13 14:46:19 +02:00
i ] [ : self . starting_no ] == value [ : self . starting_no ] ]
2019-05-09 14:48:29 +02:00
display_data = [ ]
for i in matches :
display_data . append ( { ' text ' : i } )
self . parent . parent . parent . parent . ids . rv . data = display_data
if len ( matches ) < = 10 :
2019-05-13 13:31:33 +02:00
self . parent . height = ( 250 + ( len ( matches ) * 20 ) )
else :
2019-05-09 14:48:29 +02:00
self . parent . height = 400
def keyboard_on_key_down ( self , window , keycode , text , modifiers ) :
2019-11-29 13:12:38 +01:00
""" Key Down """
2019-05-09 14:48:29 +02:00
if self . suggestion_text and keycode [ 1 ] == ' tab ' :
self . insert_text ( self . suggestion_text + ' ' )
return True
2019-08-05 12:19:19 +02:00
return super ( MyTextInput , self ) . keyboard_on_key_down (
window , keycode , text , modifiers )
2018-08-31 13:19:57 +02:00
2019-05-09 14:48:29 +02:00
class Payment ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Payment module """
2019-08-20 15:11:18 +02:00
2019-11-29 13:12:38 +01:00
def get_available_credits ( self , instance ) : # pylint: disable=no-self-use
""" Get the available credits """
2019-09-16 12:21:05 +02:00
state . availabe_credit = instance . parent . children [ 1 ] . text
2019-11-21 15:50:14 +01:00
existing_credits = (
state . kivyapp . root . ids . sc18 . ids . ml . children [ 0 ] . children [
0 ] . children [ 0 ] . children [ 0 ] . text )
2019-09-16 12:21:05 +02:00
if len ( existing_credits . split ( ' ' ) ) > 1 :
2019-11-21 15:50:14 +01:00
toast (
' We already have added free coins '
' for the subscription to your account! ' )
2019-09-16 12:21:05 +02:00
else :
toast ( ' Coins added to your account! ' )
2019-11-21 15:50:14 +01:00
state . kivyapp . root . ids . sc18 . ids . ml . children [ 0 ] . children [
0 ] . children [ 0 ] . children [ 0 ] . text = ' {0} ' . format (
state . availabe_credit )
2019-09-16 12:21:05 +02:00
class Credits ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Credits Module """
2019-11-22 12:33:20 +01:00
available_credits = StringProperty ( ' {0} ' . format ( ' 0 ' ) )
2018-07-03 12:06:20 +02:00
2019-05-13 13:31:33 +02:00
2019-05-09 14:48:29 +02:00
class Login ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Login Screeen """
2019-05-09 14:48:29 +02:00
pass
2018-07-03 12:06:20 +02:00
2018-08-31 13:19:57 +02:00
2019-05-09 14:48:29 +02:00
class NetworkStat ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Method used to show network stat """
2019-08-05 12:19:19 +02:00
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 ' ) )
2019-05-09 14:48:29 +02:00
text_variable_4 = StringProperty ( ' Processed {0} public keys ' . format ( ' 0 ' ) )
2019-08-05 12:19:19 +02:00
text_variable_5 = StringProperty (
' Processed {0} object to be synced ' . format ( ' 0 ' ) )
2018-08-21 14:48:16 +02:00
2018-08-04 10:30:12 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Init method for network stat """
2019-05-09 14:48:29 +02:00
super ( NetworkStat , self ) . __init__ ( * args , * * kwargs )
Clock . schedule_interval ( self . init_ui , 1 )
2018-08-04 10:30:12 +02:00
def init_ui ( self , dt = 0 ) :
2019-12-04 16:45:45 +01:00
""" Clock Schdule for method networkstat screen """
2019-05-09 14:48:29 +02:00
import network . stats
import shared
2019-05-13 13:31:33 +02:00
from network import objectracker
2019-08-05 12:19:19 +02:00
self . text_variable_1 = ' {0} :: {1} ' . format (
' Total Connections ' , str ( len ( network . stats . connectedHostsList ( ) ) ) )
self . text_variable_2 = ' Processed {0} per-to-per messages ' . format (
str ( shared . numberOfMessagesProcessed ) )
self . text_variable_3 = ' Processed {0} brodcast messages ' . format (
str ( shared . numberOfBroadcastsProcessed ) )
self . text_variable_4 = ' Processed {0} public keys ' . format (
str ( shared . numberOfPubkeysProcessed ) )
self . text_variable_5 = ' {0} object to be synced ' . format (
len ( objectracker . missingObjects ) )
2018-08-04 10:30:12 +02:00
2018-08-07 08:14:14 +02:00
2019-05-09 14:48:29 +02:00
class ContentNavigationDrawer ( Navigatorss ) :
2019-11-29 13:12:38 +01:00
""" Navigate Content Drawer """
2019-05-09 14:48:29 +02:00
pass
2018-08-04 10:30:12 +02:00
2019-05-09 14:48:29 +02:00
class Random ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Generates Random Address """
2019-05-09 14:48:29 +02:00
is_active = BooleanProperty ( False )
checked = StringProperty ( " " )
2019-08-21 10:07:47 +02:00
def generateaddress ( self , navApp ) :
2019-11-29 13:12:38 +01:00
""" Method for Address Generator """
2019-11-19 16:58:30 +01:00
entered_label = str ( self . ids . label . text ) . strip ( )
2019-05-09 14:48:29 +02:00
streamNumberForAddress = 1
label = self . ids . label . text
eighteenByteRipe = False
nonceTrialsPerByte = 1000
payloadLengthExtraBytes = 1000
2019-11-21 15:50:14 +01:00
lables = [ BMConfigParser ( ) . get ( obj , ' label ' )
for obj in BMConfigParser ( ) . addresses ( ) ]
2019-11-19 16:58:30 +01:00
if entered_label and entered_label not in lables :
2019-11-04 17:27:53 +01:00
toast ( ' Address Creating... ' )
2019-05-13 13:31:33 +02:00
queues . addressGeneratorQueue . put ( (
' createRandomAddress ' ,
4 , streamNumberForAddress ,
label , 1 , " " , eighteenByteRipe ,
nonceTrialsPerByte ,
2019-08-13 14:46:19 +02:00
payloadLengthExtraBytes ) )
2019-05-13 13:31:33 +02:00
self . ids . label . text = ' '
2019-11-08 13:08:26 +01:00
self . parent . parent . children [ 1 ] . opacity = 1
self . parent . parent . children [ 1 ] . disabled = False
state . kivyapp . root . ids . sc10 . children [ 1 ] . active = True
2019-10-10 18:08:52 +02:00
self . manager . current = ' myaddress '
2019-11-08 13:08:26 +01:00
Clock . schedule_once ( self . address_created_callback , 6 )
2018-08-04 10:30:12 +02:00
2019-11-04 17:27:53 +01:00
def address_created_callback ( self , dt = 0 ) :
2019-11-06 15:04:22 +01:00
""" New address created """
2019-11-04 17:27:53 +01:00
state . kivyapp . root . ids . sc10 . children [ 1 ] . active = False
2019-11-08 13:08:26 +01:00
state . kivyapp . root . ids . sc10 . ids . ml . clear_widgets ( )
2019-12-04 16:45:45 +01:00
state . kivyapp . root . ids . sc10 . is_add_created = True
2019-11-04 17:27:53 +01:00
state . kivyapp . root . ids . sc10 . init_ui ( )
toast ( ' New address created ' )
2018-07-03 11:08:02 +02:00
2019-11-19 16:58:30 +01:00
def add_validation ( self , instance ) :
2019-11-29 13:12:38 +01:00
""" Checking validation at address creation time """
2019-11-19 16:58:30 +01:00
entered_label = str ( instance . text . strip ( ) )
2019-11-21 15:50:14 +01:00
lables = [ BMConfigParser ( ) . get ( obj , ' label ' )
for obj in BMConfigParser ( ) . addresses ( ) ]
2019-11-19 16:58:30 +01:00
if entered_label in lables :
self . ids . label . error = True
2019-11-30 14:53:41 +01:00
self . ids . label . helper_text = ' Label name is already exist you ' \
' can try this Ex. ( {0} _1, {0} _2 ) ' . format (
entered_label )
2019-11-19 16:58:30 +01:00
elif entered_label :
self . ids . label . error = False
else :
self . ids . label . error = False
self . ids . label . helper_text = ' This field is required '
2019-11-29 15:57:39 +01:00
def reset_address_label ( self ) :
2019-11-30 14:53:41 +01:00
""" Resetting address labels """
2019-11-29 15:57:39 +01:00
self . ids . label . text = ' '
2018-07-24 12:05:39 +02:00
2018-07-18 14:49:39 +02:00
class Sent ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Sent Screen uses screen to show widgets of screens """
2019-11-19 16:58:30 +01:00
queryreturn = ListProperty ( )
has_refreshed = True
2019-12-04 16:45:45 +01:00
account = StringProperty ( )
2019-11-19 16:58:30 +01:00
2018-08-09 12:20:20 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-12-04 16:45:45 +01:00
""" Association with the screen. """
2018-08-09 12:20:20 +02:00
super ( Sent , self ) . __init__ ( * args , * * kwargs )
2018-09-04 14:44:28 +02:00
if state . association == ' ' :
2019-05-09 14:48:29 +02:00
if BMConfigParser ( ) . addresses ( ) :
state . association = BMConfigParser ( ) . addresses ( ) [ 0 ]
2018-08-09 12:20:20 +02:00
Clock . schedule_once ( self . init_ui , 0 )
def init_ui ( self , dt = 0 ) :
2019-11-29 13:12:38 +01:00
""" Clock Schdule for method sent accounts """
2018-08-21 14:48:16 +02:00
self . sentaccounts ( )
2019-08-13 14:46:19 +02:00
print dt
2018-08-09 12:20:20 +02:00
2018-08-21 14:48:16 +02:00
def sentaccounts ( self ) :
2019-12-04 16:45:45 +01:00
""" Load sent accounts. """
self . account = state . association
self . loadSent ( )
2018-08-09 12:20:20 +02:00
2019-12-04 16:45:45 +01:00
def loadSent ( self , where = " " , what = " " ) :
""" Load Sent list for Sent messages. """
2019-08-02 11:11:33 +02:00
if state . searcing_text :
2019-11-26 14:19:44 +01:00
self . ids . scroll_y . scroll_y = 1.0
2019-08-02 11:11:33 +02:00
where = [ ' subject ' , ' message ' ]
what = state . searcing_text
2018-08-09 12:20:20 +02:00
xAddress = ' fromaddress '
2019-09-27 18:31:37 +02:00
data = [ ]
2019-12-04 16:45:45 +01:00
self . sentDataQuery ( xAddress , where , what )
2019-11-19 16:58:30 +01:00
if self . queryreturn :
2019-12-04 16:45:45 +01:00
self . set_sentCount ( state . sent_count )
for mail in self . queryreturn :
2019-09-27 18:31:37 +02:00
data . append ( {
2019-08-05 09:24:32 +02:00
' text ' : mail [ 1 ] . strip ( ) ,
2019-09-07 16:41:42 +02:00
' secondary_text ' : mail [ 2 ] [ : 50 ] + ' ........ ' if len (
2019-11-21 15:50:14 +01:00
mail [ 2 ] ) > = 50 else ( mail [ 2 ] + ' , ' + mail [ 3 ] . replace (
' \n ' , ' ' ) ) [ 0 : 50 ] + ' ........ ' ,
2019-10-03 18:27:54 +02:00
' ackdata ' : mail [ 5 ] } )
2019-11-19 16:58:30 +01:00
self . set_mdlist ( data , 0 )
self . has_refreshed = True
self . ids . scroll_y . bind ( scroll_y = self . check_scroll_y )
2018-08-09 12:20:20 +02:00
else :
2019-08-05 12:19:19 +02:00
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Primary ' ,
2019-08-13 13:54:04 +02:00
text = " No message found! " if state . searcing_text
else " yet no message for this account!!!!!!!!!!!!! " ,
2019-08-05 12:19:19 +02:00
halign = ' center ' ,
bold = True ,
size_hint_y = None ,
valign = ' top ' )
2019-05-09 14:48:29 +02:00
self . ids . ml . add_widget ( content )
2018-07-24 12:05:39 +02:00
2019-12-04 16:45:45 +01:00
def sentDataQuery ( self , xAddress , where , what , start_indx = 0 , end_indx = 20 ) :
""" This method is used to retrieving data from sent table """
self . queryreturn = kivy_helper_search . search_sql (
xAddress , self . account , " sent " , where , what , False , start_indx , end_indx )
def set_mdlist ( self , data , set_index = 0 ) :
2019-11-19 16:58:30 +01:00
""" This method is used to create the mdList """
2019-12-04 16:45:45 +01:00
total_sent_msg = len ( self . ids . ml . children )
2019-11-19 16:58:30 +01:00
for item in data :
meny = TwoLineAvatarIconListItem (
text = item [ ' text ' ] ,
secondary_text = item [ ' secondary_text ' ] ,
theme_text_color = ' Custom ' ,
text_color = NavigateApp ( ) . theme_cls . primary_color )
meny . add_widget ( AvatarSampleWidget (
source = ' ./images/text_images/ {} .png ' . format (
avatarImageFirstLetter ( item [ ' secondary_text ' ] . strip ( ) ) ) ) )
meny . bind ( on_press = partial (
self . sent_detail , item [ ' ackdata ' ] ) )
carousel = Carousel ( direction = ' right ' )
carousel . height = meny . height
carousel . size_hint_y = None
carousel . ignore_perpendicular_swipes = True
carousel . data_index = 0
carousel . min_move = 0.2
del_btn = Button ( text = ' Delete ' )
del_btn . background_normal = ' '
del_btn . background_color = ( 1 , 0 , 0 , 1 )
del_btn . bind ( on_press = partial (
self . delete , item [ ' ackdata ' ] ) )
carousel . add_widget ( del_btn )
carousel . add_widget ( meny )
ach_btn = Button ( text = ' Achieve ' )
ach_btn . background_color = ( 0 , 1 , 0 , 1 )
ach_btn . bind ( on_press = partial (
self . archive , item [ ' ackdata ' ] ) )
carousel . add_widget ( ach_btn )
carousel . index = 1
self . ids . ml . add_widget ( carousel , index = set_index )
2019-12-04 16:45:45 +01:00
updated_msgs = len ( self . ids . ml . children )
self . has_refreshed = True if total_sent_msg != updated_msgs else False
2019-11-19 16:58:30 +01:00
def update_sent_messagelist ( self ) :
""" This method is used to update screen when new mail is sent """
2019-11-21 15:50:14 +01:00
if len ( self . ids . ml . children ) < 3 :
2019-12-04 16:45:45 +01:00
self . account = state . association
2019-11-19 16:58:30 +01:00
self . ids . ml . clear_widgets ( )
2019-12-04 16:45:45 +01:00
self . loadSent ( )
total_sent = int ( state . sent_count ) + 1
self . set_sentCount ( total_sent )
2019-11-19 16:58:30 +01:00
else :
account = state . association
data = [ ]
2019-12-04 16:45:45 +01:00
self . sentDataQuery ( ' fromaddress ' , ' ' , ' ' , 0 , 1 )
total_sent = int ( state . sent_count ) + 1
2019-11-19 16:58:30 +01:00
self . set_sentCount ( total_sent )
2019-12-04 16:45:45 +01:00
for mail in self . queryreturn :
2019-11-19 16:58:30 +01:00
data . append ( {
' text ' : mail [ 1 ] . strip ( ) ,
' secondary_text ' : mail [ 2 ] [ : 50 ] + ' ........ ' if len (
2019-11-21 15:50:14 +01:00
mail [ 2 ] ) > = 50 else ( mail [ 2 ] + ' , ' + mail [ 3 ] . replace (
' \n ' , ' ' ) ) [ 0 : 50 ] + ' ........ ' ,
2019-11-19 16:58:30 +01:00
' ackdata ' : mail [ 5 ] } )
2019-11-21 15:50:14 +01:00
self . set_mdlist ( data , total_sent - 1 )
2019-12-04 16:45:45 +01:00
if state . msg_counter_objs and state . association == (
state . check_sent_acc ) :
state . all_count = str ( int ( state . all_count ) + 1 )
state . msg_counter_objs . allmail_cnt . badge_text = state . all_count
state . check_sent_acc = None
2019-11-19 16:58:30 +01:00
def check_scroll_y ( self , instance , somethingelse ) :
2019-11-29 13:12:38 +01:00
""" Load data on scroll down """
2019-11-19 16:58:30 +01:00
if self . ids . scroll_y . scroll_y < = - 0.0 and self . has_refreshed :
self . ids . scroll_y . scroll_y = 0.06
total_sent_msg = len ( self . ids . ml . children )
2019-12-04 16:45:45 +01:00
self . update_sent_screen_on_scroll ( total_sent_msg )
2019-11-19 16:58:30 +01:00
else :
pass
2019-12-04 16:45:45 +01:00
def update_sent_screen_on_scroll ( self , total_sent_msg , where = " " , what = " " ) :
""" This method is used to load more data on scroll down """
if state . searcing_text :
where = [ ' subject ' , ' message ' ]
what = state . searcing_text
self . sentDataQuery ( ' fromaddress ' , where , what , total_sent_msg , 5 )
2019-11-19 16:58:30 +01:00
data = [ ]
2019-12-04 16:45:45 +01:00
for mail in self . queryreturn :
2019-11-19 16:58:30 +01:00
data . append ( {
' text ' : mail [ 1 ] . strip ( ) ,
' secondary_text ' : mail [ 2 ] [ : 50 ] + ' ........ ' if len (
2019-11-21 15:50:14 +01:00
mail [ 2 ] ) > = 50 else ( mail [ 2 ] + ' , ' + mail [ 3 ] . replace (
' \n ' , ' ' ) ) [ 0 : 50 ] + ' ........ ' ,
2019-11-19 16:58:30 +01:00
' ackdata ' : mail [ 5 ] } )
self . set_mdlist ( data , 0 )
2019-11-21 15:50:14 +01:00
@staticmethod
def set_sentCount ( total_sent ) :
2019-11-19 16:58:30 +01:00
""" Set the total no. of sent message count """
src_mng_obj = state . kivyapp . root . children [ 2 ] . children [ 0 ] . ids
src_mng_obj . send_cnt . badge_text = str ( total_sent )
state . sent_count = str ( total_sent )
2019-10-03 18:27:54 +02:00
def sent_detail ( self , ackdata , * args ) :
2019-11-29 13:12:38 +01:00
""" Load sent mail details """
2019-06-06 15:48:20 +02:00
state . detailPageType = ' sent '
2019-10-03 18:27:54 +02:00
state . mail_id = ackdata
2019-05-28 13:12:51 +02:00
if self . manager :
src_mng_obj = self . manager
else :
src_mng_obj = self . parent . parent
src_mng_obj . screens [ 13 ] . clear_widgets ( )
2019-06-06 15:48:20 +02:00
src_mng_obj . screens [ 13 ] . add_widget ( MailDetail ( ) )
src_mng_obj . current = ' mailDetail '
def delete ( self , data_index , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Delete sent mail from sent mail listing """
2019-06-28 16:54:47 +02:00
try :
2019-08-05 12:19:19 +02:00
msg_count_objs = self . parent . parent . parent . parent . children [
2 ] . children [ 0 ] . ids
2019-08-13 14:46:19 +02:00
except Exception :
2019-08-05 12:19:19 +02:00
msg_count_objs = self . parent . parent . parent . parent . parent . children [
2 ] . children [ 0 ] . ids
2019-06-28 16:54:47 +02:00
if int ( state . sent_count ) > 0 :
2019-08-05 12:19:19 +02:00
msg_count_objs . send_cnt . badge_text = str (
int ( state . sent_count ) - 1 )
msg_count_objs . trash_cnt . badge_text = str (
int ( state . trash_count ) + 1 )
2019-08-14 16:55:34 +02:00
msg_count_objs . allmail_cnt . badge_text = str (
int ( state . all_count ) - 1 )
2019-06-28 16:54:47 +02:00
state . sent_count = str ( int ( state . sent_count ) - 1 )
state . trash_count = str ( int ( state . trash_count ) + 1 )
2019-08-14 16:55:34 +02:00
state . all_count = str ( int ( state . all_count ) - 1 )
2019-08-05 12:19:19 +02:00
sqlExecute (
2019-10-15 15:12:23 +02:00
" UPDATE sent SET folder = ' trash ' "
" WHERE ackdata = ?; " , str ( data_index ) )
2019-06-06 15:48:20 +02:00
self . ids . ml . remove_widget ( instance . parent . parent )
2019-08-13 09:28:15 +02:00
toast ( ' Deleted ' )
2019-06-06 15:48:20 +02:00
self . update_trash ( )
def archive ( self , data_index , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Archive sent mail from sent mail listing """
2019-08-05 12:19:19 +02:00
sqlExecute (
2019-10-15 15:12:23 +02:00
" UPDATE sent SET folder = ' trash ' "
" WHERE ackdata = ?; " , str ( data_index ) )
2019-06-06 15:48:20 +02:00
self . ids . ml . remove_widget ( instance . parent . parent )
self . update_trash ( )
def update_trash ( self ) :
2019-11-29 13:12:38 +01:00
""" Update trash screen mails which is deleted from inbox """
2019-06-06 15:48:20 +02:00
try :
self . parent . screens [ 4 ] . clear_widgets ( )
self . parent . screens [ 4 ] . add_widget ( Trash ( ) )
2019-09-06 17:20:58 +02:00
self . parent . screens [ 16 ] . clear_widgets ( )
self . parent . screens [ 16 ] . add_widget ( Allmails ( ) )
2019-08-13 14:46:19 +02:00
except Exception :
2019-06-06 15:48:20 +02:00
self . parent . parent . screens [ 4 ] . clear_widgets ( )
self . parent . parent . screens [ 4 ] . add_widget ( Trash ( ) )
2019-09-06 17:20:58 +02:00
self . parent . parent . screens [ 16 ] . clear_widgets ( )
self . parent . parent . screens [ 16 ] . add_widget ( Allmails ( ) )
2019-05-28 13:12:51 +02:00
2019-05-13 13:31:33 +02:00
2018-07-18 14:49:39 +02:00
class Trash ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Trash Screen uses screen to show widgets of screens """
2019-11-19 16:58:30 +01:00
trash_messages = ListProperty ( )
has_refreshed = True
2019-11-26 14:19:44 +01:00
delete_index = StringProperty ( )
table_name = StringProperty ( )
2019-08-20 15:11:18 +02:00
2018-08-21 14:48:16 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Trash method, delete sent message and add in Trash """
2018-08-21 14:48:16 +02:00
super ( Trash , self ) . __init__ ( * args , * * kwargs )
Clock . schedule_once ( self . init_ui , 0 )
def init_ui ( self , dt = 0 ) :
2019-12-04 16:45:45 +01:00
""" Clock Schdule for method trash screen. """
2019-06-28 16:54:47 +02:00
if state . association == ' ' :
if BMConfigParser ( ) . addresses ( ) :
state . association = BMConfigParser ( ) . addresses ( ) [ 0 ]
2019-12-04 16:45:45 +01:00
self . trashDataQuery ( 0 , 20 )
2019-11-19 16:58:30 +01:00
if self . trash_messages :
2019-09-19 18:30:26 +02:00
src_mng_obj = state . kivyapp . root . children [ 2 ] . children [ 0 ] . ids
2019-12-04 16:45:45 +01:00
src_mng_obj . trash_cnt . badge_text = state . trash_count
self . set_mdList ( )
2019-11-19 16:58:30 +01:00
self . ids . scroll_y . bind ( scroll_y = self . check_scroll_y )
2019-09-06 17:20:58 +02:00
else :
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Primary ' ,
text = " yet no trashed message for this account!!!!!!!!!!!!! " ,
halign = ' center ' ,
bold = True ,
size_hint_y = None ,
valign = ' top ' )
self . ids . ml . add_widget ( content )
2019-12-04 16:45:45 +01:00
def trashDataQuery ( self , start_indx , end_indx ) :
self . trash_messages = sqlQuery (
" SELECT toaddress, fromaddress, subject, message, folder || ' , ' || ' sent ' as folder, ackdata As id, DATE(lastactiontime) "
" As actionTime FROM sent WHERE folder = ' trash ' and fromaddress = ' {0} ' UNION "
" SELECT toaddress, fromaddress, subject, message, folder || ' , ' || ' inbox ' as folder, msgid As id, DATE(received) As "
" actionTime FROM inbox WHERE folder = ' trash ' and toaddress = ' {0} ' ORDER BY actionTime DESC limit {1} , {2} " . format ( state . association , start_indx , end_indx ) )
def set_mdList ( self ) :
""" This method is used to create the mdlist """
total_trash_msg = len ( self . ids . ml . children )
for item in self . trash_messages :
2019-11-19 16:58:30 +01:00
meny = TwoLineAvatarIconListItem (
text = item [ 1 ] ,
secondary_text = item [ 2 ] [ : 50 ] + ' ........ ' if len (
2019-11-21 15:50:14 +01:00
item [ 2 ] ) > = 50 else ( item [ 2 ] + ' , ' + item [ 3 ] . replace (
' \n ' , ' ' ) ) [ 0 : 50 ] + ' ........ ' ,
2019-11-19 16:58:30 +01:00
theme_text_color = ' Custom ' ,
text_color = NavigateApp ( ) . theme_cls . primary_color )
img_latter = ' ./images/text_images/ {} .png ' . format (
item [ 2 ] [ 0 ] . upper ( ) if ( item [ 2 ] [ 0 ] . upper ( ) > = ' A ' and item [
2 ] [ 0 ] . upper ( ) < = ' Z ' ) else ' ! ' )
meny . add_widget ( AvatarSampleWidget ( source = img_latter ) )
carousel = Carousel ( direction = ' right ' )
carousel . height = meny . height
carousel . size_hint_y = None
carousel . ignore_perpendicular_swipes = True
carousel . data_index = 0
carousel . min_move = 0.2
del_btn = Button ( text = ' Delete ' )
del_btn . background_normal = ' '
del_btn . background_color = ( 1 , 0 , 0 , 1 )
del_btn . bind ( on_press = partial (
2019-11-26 14:19:44 +01:00
self . delete_permanently , item [ 5 ] , item [ 4 ] ) )
2019-11-19 16:58:30 +01:00
carousel . add_widget ( del_btn )
carousel . add_widget ( meny )
carousel . index = 1
self . ids . ml . add_widget ( carousel )
2019-12-04 16:45:45 +01:00
self . has_refreshed = True if total_trash_msg != len (
self . ids . ml . children ) else False
2019-11-19 16:58:30 +01:00
def check_scroll_y ( self , instance , somethingelse ) :
2019-11-29 13:12:38 +01:00
""" Load data on scroll """
2019-11-19 16:58:30 +01:00
if self . ids . scroll_y . scroll_y < = - 0.0 and self . has_refreshed :
self . ids . scroll_y . scroll_y = 0.06
total_trash_msg = len ( self . ids . ml . children )
2019-12-04 16:45:45 +01:00
self . update_trash_screen_on_scroll ( total_trash_msg )
2019-11-19 16:58:30 +01:00
else :
pass
def update_trash_screen_on_scroll ( self , total_trash_msg ) :
2019-11-29 13:12:38 +01:00
""" Load more data on scroll down """
2019-12-04 16:45:45 +01:00
self . trashDataQuery ( total_trash_msg , 5 )
self . set_mdList ( )
2019-11-19 16:58:30 +01:00
2019-11-26 14:19:44 +01:00
def delete_permanently ( self , data_index , folder , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Deleting trash mail permanently """
2019-11-26 14:19:44 +01:00
self . table_name = folder . split ( ' , ' ) [ 1 ]
self . delete_index = data_index
self . delete_confirmation ( )
def callback_for_screen_load ( self , dt = 0 ) :
""" This methos is for loading screen """
self . ids . ml . clear_widgets ( )
self . init_ui ( 0 )
self . children [ 1 ] . active = False
toast ( ' Message is permanently deleted ' )
def delete_confirmation ( self ) :
2019-11-29 13:12:38 +01:00
""" Show confirmation delete popup """
2019-11-26 14:19:44 +01:00
delete_msg_dialog = MDDialog (
2019-11-30 14:53:41 +01:00
text = ' Are you sure you want to delete this '
2019-11-28 15:50:00 +01:00
' message permanently from trash? ' ,
title = ' ' ,
size_hint = ( .8 , .25 ) ,
text_button_ok = ' Yes ' ,
text_button_cancel = ' No ' ,
events_callback = self . callback_for_delete_msg )
2019-11-26 14:19:44 +01:00
delete_msg_dialog . open ( )
def callback_for_delete_msg ( self , text_item ) :
2019-11-29 13:12:38 +01:00
""" Getting the callback of alert box """
2019-11-26 14:19:44 +01:00
if text_item == ' Yes ' :
self . delete_message_from_trash ( )
else :
toast ( text_item )
def delete_message_from_trash ( self ) :
2019-11-29 13:12:38 +01:00
""" Deleting message from trash """
2019-11-26 14:19:44 +01:00
self . children [ 1 ] . active = True
if self . table_name == ' inbox ' :
sqlExecute ( " DELETE FROM inbox WHERE msgid = ?; " , str (
self . delete_index ) )
elif self . table_name == ' sent ' :
sqlExecute ( " DELETE FROM sent WHERE ackdata = ?; " , str (
self . delete_index ) )
msg_count_objs = state . kivyapp . root . children [ 2 ] . children [ 0 ] . ids
if int ( state . trash_count ) > 0 :
msg_count_objs . trash_cnt . badge_text = str (
2019-11-28 15:50:00 +01:00
int ( state . trash_count ) - 1 )
2019-11-26 14:19:44 +01:00
state . trash_count = str ( int ( state . trash_count ) - 1 )
Clock . schedule_once ( self . callback_for_screen_load , 1 )
2018-08-21 14:48:16 +02:00
2019-08-05 09:24:32 +02:00
2019-05-09 14:48:29 +02:00
class Page ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Page Screen show widgets of page """
2019-05-09 14:48:29 +02:00
pass
2018-07-03 11:08:02 +02:00
2019-05-09 14:48:29 +02:00
class Create ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Creates the screen widgets """
2019-05-09 14:48:29 +02:00
def __init__ ( self , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Getting Labels and address from addressbook """
2019-05-09 14:48:29 +02:00
super ( Create , self ) . __init__ ( * * kwargs )
widget_1 = DropDownWidget ( )
2019-08-05 12:19:19 +02:00
widget_1 . ids . txt_input . word_list = [
addr [ 1 ] for addr in sqlQuery (
" SELECT label, address from addressbook " ) ]
2019-05-09 14:48:29 +02:00
widget_1 . ids . txt_input . starting_no = 2
self . add_widget ( widget_1 )
2018-08-31 14:34:20 +02:00
2019-05-13 13:31:33 +02:00
2019-05-09 14:48:29 +02:00
class Setting ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Setting the Screen components """
2018-07-18 14:49:39 +02:00
pass
2018-07-03 11:08:02 +02:00
2018-07-07 14:11:58 +02:00
2019-11-29 13:12:38 +01:00
class NavigateApp ( App ) : # pylint: disable=too-many-public-methods
""" Navigation Layout of class """
2019-05-09 14:48:29 +02:00
theme_cls = ThemeManager ( )
previous_date = ObjectProperty ( )
obj_1 = ObjectProperty ( )
variable_1 = ListProperty ( BMConfigParser ( ) . addresses ( ) )
nav_drawer = ObjectProperty ( )
2019-06-28 16:54:47 +02:00
state . screen_density = Window . size
2019-09-11 17:03:51 +02:00
window_size = state . screen_density
2019-05-13 13:31:33 +02:00
title = " PyBitmessage "
2019-07-17 10:50:27 +02:00
imgstatus = False
2019-05-09 14:48:29 +02:00
count = 0
menu_items = [
{ ' viewclass ' : ' MDMenuItem ' ,
' text ' : ' Example item ' } ,
{ ' viewclass ' : ' MDMenuItem ' ,
' text ' : ' Example item ' } ,
{ ' viewclass ' : ' MDMenuItem ' ,
' text ' : ' Example item ' } ,
{ ' viewclass ' : ' MDMenuItem ' ,
' text ' : ' Example item ' } ,
{ ' viewclass ' : ' MDMenuItem ' ,
' text ' : ' Example item ' } ,
{ ' viewclass ' : ' MDMenuItem ' ,
' text ' : ' Example item ' } ,
{ ' viewclass ' : ' MDMenuItem ' ,
' text ' : ' Example item ' } ,
]
2018-07-24 12:05:39 +02:00
2019-05-09 14:48:29 +02:00
def build ( self ) :
2019-11-29 13:12:38 +01:00
""" Method builds the widget """
2019-05-09 14:48:29 +02:00
main_widget = Builder . load_file (
os . path . join ( os . path . dirname ( __file__ ) , ' main.kv ' ) )
self . nav_drawer = Navigatorss ( )
self . obj_1 = AddressBook ( )
kivysignalthread = UIkivySignaler ( )
kivysignalthread . daemon = True
kivysignalthread . start ( )
2019-06-06 15:48:20 +02:00
Window . bind ( on_keyboard = self . on_key )
2019-05-09 14:48:29 +02:00
return main_widget
2018-07-24 12:05:39 +02:00
2019-05-09 14:48:29 +02:00
def run ( self ) :
2019-11-29 13:12:38 +01:00
""" Running the widgets """
2019-05-09 14:48:29 +02:00
kivyuisignaler . release ( )
super ( NavigateApp , self ) . run ( )
2018-07-24 14:42:53 +02:00
2019-08-20 15:11:18 +02:00
# pylint: disable=inconsistent-return-statements
2019-05-09 14:48:29 +02:00
@staticmethod
def showmeaddresses ( name = " text " ) :
2019-11-29 13:12:38 +01:00
""" Show the addresses in spinner to make as dropdown """
2019-05-09 14:48:29 +02:00
if name == " text " :
2019-08-05 09:24:32 +02:00
if BMConfigParser ( ) . addresses ( ) :
2019-05-09 14:48:29 +02:00
return BMConfigParser ( ) . addresses ( ) [ 0 ] [ : 16 ] + ' .. '
2019-08-20 15:11:18 +02:00
return " textdemo "
2019-05-09 14:48:29 +02:00
elif name == " values " :
if BMConfigParser ( ) . addresses ( ) :
2019-08-06 12:05:03 +02:00
return [ address [ : 16 ] + ' .. '
for address in BMConfigParser ( ) . addresses ( ) ]
2019-08-20 15:11:18 +02:00
return " valuesdemo "
2018-07-24 12:05:39 +02:00
2019-05-09 14:48:29 +02:00
def getCurrentAccountData ( self , text ) :
2019-11-29 13:12:38 +01:00
""" Get Current Address Account Data """
2019-09-18 09:44:00 +02:00
self . set_identicon ( text )
2019-08-05 12:19:19 +02:00
address_label = self . current_address_label (
2019-08-22 17:37:50 +02:00
BMConfigParser ( ) . get ( text , ' label ' ) , text )
2019-07-17 10:50:27 +02:00
self . root_window . children [ 1 ] . ids . toolbar . title = address_label
2019-05-09 14:48:29 +02:00
state . association = text
2019-09-27 18:31:37 +02:00
state . searcing_text = ' '
2019-10-31 11:54:18 +01:00
LoadingPopup ( ) . open ( )
2019-09-27 18:31:37 +02:00
self . root . ids . sc1 . ids . ml . clear_widgets ( )
self . root . ids . sc1 . loadMessagelist ( state . association )
2019-10-31 11:54:18 +01:00
self . root . ids . sc4 . ids . ml . clear_widgets ( )
2019-11-19 16:58:30 +01:00
self . root . ids . sc4 . children [ 2 ] . children [ 1 ] . ids . search_field . text = ' '
2019-10-31 11:54:18 +01:00
self . root . ids . sc4 . loadSent ( state . association )
self . root . ids . sc16 . clear_widgets ( )
self . root . ids . sc16 . add_widget ( Draft ( ) )
self . root . ids . sc5 . clear_widgets ( )
self . root . ids . sc5 . add_widget ( Trash ( ) )
self . root . ids . sc17 . clear_widgets ( )
self . root . ids . sc17 . add_widget ( Allmails ( ) )
2019-06-06 15:48:20 +02:00
self . root . ids . scr_mngr . current = ' inbox '
2019-12-04 16:45:45 +01:00
self . set_message_count ( )
2019-06-28 16:54:47 +02:00
2019-05-09 14:48:29 +02:00
@staticmethod
def getCurrentAccount ( ) :
2019-11-29 13:12:38 +01:00
""" It uses to get current account label """
2019-05-09 14:48:29 +02:00
if state . association :
return state . association
2019-08-20 15:11:18 +02:00
return " Bitmessage Login "
2018-09-05 16:18:57 +02:00
2019-08-16 16:49:55 +02:00
@staticmethod
def addingtoaddressbook ( ) :
2019-11-29 13:12:38 +01:00
""" Adding to address Book """
2019-05-09 14:48:29 +02:00
p = GrashofPopup ( )
p . open ( )
2019-09-06 17:20:58 +02:00
def getDefaultAccData ( self ) :
2019-11-29 13:12:38 +01:00
""" Getting Default Account Data """
2019-05-09 14:48:29 +02:00
if BMConfigParser ( ) . addresses ( ) :
2019-09-18 09:44:00 +02:00
img = identiconGeneration . generate ( BMConfigParser ( ) . addresses ( ) [ 0 ] )
self . createFolder ( ' ./images/default_identicon/ ' )
2019-09-24 17:21:34 +02:00
if platform == ' android ' :
2019-11-21 15:50:14 +01:00
# android_path = os.path.expanduser
# ("~/user/0/org.test.bitapp/files/app/")
android_path = os . path . join (
os . environ [ ' ANDROID_PRIVATE ' ] + ' /app/ ' )
2019-09-25 13:45:45 +02:00
img . texture . save ( ' {1} /images/default_identicon/ {0} .png ' . format (
BMConfigParser ( ) . addresses ( ) [ 0 ] , android_path ) )
2019-09-24 17:21:34 +02:00
else :
2019-11-21 15:50:14 +01:00
img . texture . save (
' ./images/default_identicon/ {} .png ' . format (
BMConfigParser ( ) . addresses ( ) [ 0 ] ) )
2019-05-09 14:48:29 +02:00
return BMConfigParser ( ) . addresses ( ) [ 0 ]
return ' Select Address '
2019-09-09 16:17:07 +02:00
@staticmethod
def createFolder ( directory ) :
2019-11-29 13:12:38 +01:00
""" Create directory when app starts """
2019-09-06 17:20:58 +02:00
try :
if not os . path . exists ( directory ) :
os . makedirs ( directory )
except OSError :
2019-09-09 16:17:07 +02:00
print ' Error: Creating directory. ' + directory
2019-09-06 17:20:58 +02:00
2019-09-09 16:17:07 +02:00
@staticmethod
def get_default_image ( ) :
""" Getting default image on address """
2019-09-06 17:20:58 +02:00
if BMConfigParser ( ) . addresses ( ) :
2019-11-21 15:50:14 +01:00
return ' ./images/default_identicon/ {} .png ' . format (
BMConfigParser ( ) . addresses ( ) [ 0 ] )
2019-10-09 18:34:42 +02:00
return ' ./images/no_identicons.png '
2019-09-06 17:20:58 +02:00
2019-08-16 16:49:55 +02:00
@staticmethod
def addressexist ( ) :
2019-11-29 13:12:38 +01:00
""" Checking address existence """
2019-05-28 13:12:51 +02:00
if BMConfigParser ( ) . addresses ( ) :
return True
return False
2019-06-06 15:48:20 +02:00
def on_key ( self , window , key , * args ) :
2019-11-29 13:12:38 +01:00
""" Method is used for going on previous screen """
2019-08-05 12:19:19 +02:00
if key == 27 :
2019-11-21 15:50:14 +01:00
if state . in_search_mode and self . root . ids . scr_mngr . current != (
" mailDetail " ) :
2019-11-19 16:58:30 +01:00
self . closeSearchScreen ( )
elif self . root . ids . scr_mngr . current == " mailDetail " :
2019-08-21 16:24:56 +02:00
self . root . ids . scr_mngr . current = ' sent ' \
if state . detailPageType == ' sent ' else ' inbox ' \
if state . detailPageType == ' inbox ' else ' draft '
2019-09-11 17:03:51 +02:00
self . back_press ( )
2019-07-17 10:50:27 +02:00
elif self . root . ids . scr_mngr . current == " create " :
2019-11-08 13:08:26 +01:00
self . save_draft ( )
self . set_common_header ( )
state . in_composer = False
2019-06-06 15:48:20 +02:00
self . root . ids . scr_mngr . current = ' inbox '
2019-07-17 10:50:27 +02:00
elif self . root . ids . scr_mngr . current == " showqrcode " :
self . root . ids . scr_mngr . current = ' myaddress '
elif self . root . ids . scr_mngr . current == " random " :
2019-08-02 11:11:33 +02:00
self . root . ids . scr_mngr . current = ' login '
2019-06-06 15:48:20 +02:00
else :
2019-07-17 10:50:27 +02:00
self . root . ids . scr_mngr . current = ' inbox '
self . root . ids . scr_mngr . transition . direction = ' right '
2019-08-21 10:07:47 +02:00
self . root . ids . scr_mngr . transition . bind ( on_complete = self . reset )
2019-07-17 10:50:27 +02:00
return True
2019-11-19 16:58:30 +01:00
elif key == 13 :
if state . search_screen == ' inbox ' and state . searcing_text :
self . root . ids . sc1 . children [ 1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
2019-11-04 17:27:53 +01:00
elif state . search_screen == ' addressbook ' :
2019-11-19 16:58:30 +01:00
self . root . ids . sc11 . children [ 1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
2019-11-04 17:27:53 +01:00
elif state . search_screen == ' myaddress ' :
2019-11-19 16:58:30 +01:00
self . root . ids . sc10 . children [ 1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
elif state . search_screen == ' sent ' :
self . root . ids . sc4 . children [ 1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
def search_callback ( self , dt = 0 ) :
2019-11-29 13:12:38 +01:00
""" Show data after loader is loaded """
2019-11-19 16:58:30 +01:00
if state . search_screen == ' inbox ' :
self . root . ids . sc1 . ids . ml . clear_widgets ( )
self . root . ids . sc1 . loadMessagelist ( state . association )
self . root . ids . sc1 . children [ 1 ] . active = False
elif state . search_screen == ' addressbook ' :
self . root . ids . sc11 . ids . ml . clear_widgets ( )
self . root . ids . sc11 . loadAddresslist ( None , ' All ' , ' ' )
self . root . ids . sc11 . children [ 1 ] . active = False
elif state . search_screen == ' myaddress ' :
self . root . ids . sc10 . ids . ml . clear_widgets ( )
self . root . ids . sc10 . init_ui ( )
self . root . ids . sc10 . children [ 1 ] . active = False
else :
self . root . ids . sc4 . ids . ml . clear_widgets ( )
self . root . ids . sc4 . loadSent ( state . association )
self . root . ids . sc4 . children [ 1 ] . active = False
self . root . ids . scr_mngr . current = state . search_screen
2019-07-17 10:50:27 +02:00
2019-11-08 13:08:26 +01:00
def save_draft ( self ) :
2019-11-21 15:50:14 +01:00
""" Saving drafts messages """
2019-11-08 13:08:26 +01:00
composer_objs = self . root
from_addr = str ( self . root . ids . sc3 . children [ 1 ] . ids . ti . text )
to_addr = str ( self . root . ids . sc3 . children [ 1 ] . ids . txt_input . text )
2019-11-22 12:33:20 +01:00
if from_addr and to_addr and state . detailPageType != ' draft ' \
and not state . in_sent_method :
2019-11-08 13:08:26 +01:00
Draft ( ) . draft_msg ( composer_objs )
return
2019-08-21 10:07:47 +02:00
def reset ( self , * args ) :
2019-11-29 13:12:38 +01:00
""" Set transition direction """
2019-07-17 10:50:27 +02:00
self . root . ids . scr_mngr . transition . direction = ' left '
2019-08-21 10:07:47 +02:00
self . root . ids . scr_mngr . transition . unbind ( on_complete = self . reset )
2019-06-06 15:48:20 +02:00
2019-08-16 16:49:55 +02:00
@staticmethod
def status_dispatching ( data ) :
2019-11-29 13:12:38 +01:00
""" Dispatching Status acknowledgment """
2019-06-06 15:48:20 +02:00
ackData , message = data
if state . ackdata == ackData :
state . status . status = message
2019-06-28 16:54:47 +02:00
def clear_composer ( self ) :
2019-11-29 13:12:38 +01:00
""" If slow down, the new composer edit screen """
2019-08-26 17:28:12 +02:00
self . set_navbar_for_composer ( )
2019-11-08 13:08:26 +01:00
composer_obj = self . root . ids . sc3 . children [ 1 ] . ids
2019-06-28 16:54:47 +02:00
composer_obj . ti . text = ' '
2019-07-17 10:50:27 +02:00
composer_obj . btn . text = ' Select '
2019-06-28 16:54:47 +02:00
composer_obj . txt_input . text = ' '
composer_obj . subject . text = ' '
2019-08-23 12:26:35 +02:00
composer_obj . body . text = ' '
2019-09-11 17:03:51 +02:00
state . in_composer = True
2019-11-08 13:08:26 +01:00
state . in_sent_method = False
2019-06-28 16:54:47 +02:00
2019-08-26 17:28:12 +02:00
def set_navbar_for_composer ( self ) :
2019-11-29 13:12:38 +01:00
""" Clearing toolbar data when composer open """
2019-08-26 17:28:12 +02:00
self . root . ids . toolbar . left_action_items = [
[ ' arrow-left ' , lambda x : self . back_press ( ) ] ]
2019-09-11 17:03:51 +02:00
self . root . ids . toolbar . right_action_items = [
2019-11-21 15:50:14 +01:00
[ ' refresh ' ,
2019-11-22 12:33:20 +01:00
lambda x : self . root . ids . sc3 . children [ 1 ] . reset_composer ( ) ] ,
2019-11-21 15:50:14 +01:00
[ ' send ' ,
2019-11-22 12:33:20 +01:00
lambda x : self . root . ids . sc3 . children [ 1 ] . send ( self ) ] ]
2019-08-26 17:28:12 +02:00
2019-11-08 13:08:26 +01:00
def set_common_header ( self ) :
2019-11-29 13:12:38 +01:00
""" Common header for all window """
2019-11-21 15:50:14 +01:00
self . root . ids . toolbar . right_action_items = [
[ ' account-plus ' , lambda x : self . addingtoaddressbook ( ) ] ]
self . root . ids . toolbar . left_action_items = [
[ ' menu ' , lambda x : self . root . toggle_nav_drawer ( ) ] ]
2019-11-08 13:08:26 +01:00
return
def back_press ( self ) :
2019-11-29 13:12:38 +01:00
""" Method for, reverting composer to previous page """
2019-11-08 13:08:26 +01:00
self . save_draft ( )
2019-11-29 13:12:38 +01:00
if self . root . ids . scr_mngr . current == \
' mailDetail ' and state . in_search_mode :
2019-11-19 16:58:30 +01:00
toolbar_obj = self . root . ids . toolbar
2019-11-21 15:50:14 +01:00
toolbar_obj . left_action_items = [
[ ' arrow-left ' , lambda x : self . closeSearchScreen ( ) ] ]
2019-11-19 16:58:30 +01:00
toolbar_obj . right_action_items = [ ]
self . root . ids . toolbar . title = ' '
else :
self . set_common_header ( )
2019-09-12 11:11:33 +02:00
self . root . ids . scr_mngr . current = ' inbox ' \
2019-10-11 11:14:32 +02:00
if state . in_composer else ' allmails ' \
if state . is_allmail else state . detailPageType \
if state . detailPageType else ' inbox '
2019-08-21 10:07:47 +02:00
self . root . ids . scr_mngr . transition . direction = ' right '
self . root . ids . scr_mngr . transition . bind ( on_complete = self . reset )
2019-09-11 17:03:51 +02:00
if state . is_allmail or state . detailPageType == ' draft ' :
state . is_allmail = False
2019-08-23 12:26:35 +02:00
state . detailPageType = ' '
2019-09-11 17:03:51 +02:00
state . in_composer = False
2019-08-21 10:07:47 +02:00
2019-12-04 16:45:45 +01:00
def get_inbox_count ( self ) :
state . inbox_count = str (
sqlQuery (
" SELECT COUNT(*) FROM inbox WHERE toaddress = ' {} ' and "
" folder = ' inbox ' ; " . format ( state . association ) ) [ 0 ] [ 0 ] )
def get_sent_count ( self ) :
state . sent_count = str (
sqlQuery (
" SELECT COUNT(*) FROM sent WHERE fromaddress = ' {} ' and "
" folder = ' sent ' ; " . format ( state . association ) ) [ 0 ] [ 0 ] )
def set_message_count ( self ) :
try :
msg_counter_objs = (
self . root_window . children [ 0 ] . children [ 2 ] . children [ 0 ] . ids )
except Exception as e :
msg_counter_objs = (
self . root_window . children [ 2 ] . children [ 2 ] . children [ 0 ] . ids )
self . get_inbox_count ( )
self . get_sent_count ( )
state . trash_count = str ( sqlQuery (
" SELECT (SELECT count(*) FROM sent "
" where fromaddress = ' {0} ' and folder = ' trash ' ) "
" +(SELECT count(*) FROM inbox where toaddress = ' {0} ' and "
" folder = ' trash ' ) AS SumCount " . format ( state . association ) ) [ 0 ] [ 0 ] )
state . draft_count = str (
sqlQuery (
" SELECT COUNT(*) FROM sent WHERE fromaddress = ' {} ' and "
" folder = ' draft ' ; " . format ( state . association ) ) [ 0 ] [ 0 ] )
state . all_count = str ( int ( state . sent_count ) + int ( state . inbox_count ) )
if msg_counter_objs :
msg_counter_objs . send_cnt . badge_text = state . sent_count
msg_counter_objs . inbox_cnt . badge_text = state . inbox_count
msg_counter_objs . trash_cnt . badge_text = state . trash_count
msg_counter_objs . draft_cnt . badge_text = state . draft_count
msg_counter_objs . allmail_cnt . badge_text = state . all_count
def on_start ( self ) :
self . set_message_count ( )
2019-08-16 16:49:55 +02:00
@staticmethod
2019-08-17 14:43:10 +02:00
def on_stop ( ) :
2019-11-29 13:12:38 +01:00
""" On stop methos is used for stoping the runing script """
2019-08-13 14:46:19 +02:00
print " *******************EXITING FROM APPLICATION******************* "
2019-06-28 16:54:47 +02:00
import shutdown
shutdown . doCleanShutdown ( )
2019-08-16 16:49:55 +02:00
@staticmethod
2019-09-06 17:20:58 +02:00
def current_address_label ( current_add_label = None , current_addr = None ) :
2019-11-29 13:12:38 +01:00
""" Getting current address labels """
2019-08-22 17:37:50 +02:00
if BMConfigParser ( ) . addresses ( ) :
if current_add_label :
first_name = current_add_label
addr = current_addr
2019-08-02 11:11:33 +02:00
else :
2019-08-22 17:37:50 +02:00
addr = BMConfigParser ( ) . addresses ( ) [ 0 ]
first_name = BMConfigParser ( ) . get ( addr , ' label ' )
2019-07-17 10:50:27 +02:00
f_name = first_name . split ( )
2019-11-21 15:50:14 +01:00
label = f_name [ 0 ] [ : 14 ] . capitalize ( ) + ' ... ' if len (
f_name [ 0 ] ) > 15 else f_name [ 0 ] . capitalize ( )
2019-09-19 18:30:26 +02:00
address = ' ( ' + addr + ' ...) '
2019-08-22 17:37:50 +02:00
return label + address
2019-07-17 10:50:27 +02:00
return ' '
2019-06-28 16:54:47 +02:00
2019-09-27 18:31:37 +02:00
def searchQuery ( self , instance ) :
2019-11-29 13:12:38 +01:00
""" Showing searched mails """
2019-08-06 12:35:07 +02:00
state . search_screen = self . root . ids . scr_mngr . current
state . searcing_text = str ( instance . text ) . strip ( )
2019-11-04 17:27:53 +01:00
if instance . focus and state . searcing_text :
toolbar_obj = self . root . ids . toolbar
2019-11-21 15:50:14 +01:00
toolbar_obj . left_action_items = [
[ ' arrow-left ' , lambda x : self . closeSearchScreen ( ) ] ]
2019-11-04 17:27:53 +01:00
toolbar_obj . right_action_items = [ ]
self . root . ids . toolbar . title = ' '
2019-11-19 16:58:30 +01:00
state . in_search_mode = True
2019-11-04 17:27:53 +01:00
def closeSearchScreen ( self ) :
2019-11-29 13:12:38 +01:00
""" Function for close search screen """
2019-11-08 13:08:26 +01:00
self . set_common_header ( )
2019-11-04 17:27:53 +01:00
address_label = self . current_address_label (
2019-11-21 15:50:14 +01:00
BMConfigParser ( ) . get (
state . association , ' label ' ) , state . association )
2019-11-04 17:27:53 +01:00
self . root . ids . toolbar . title = address_label
2019-11-19 16:58:30 +01:00
state . searcing_text = ' '
2019-11-04 17:27:53 +01:00
self . refreshScreen ( )
2019-11-19 16:58:30 +01:00
state . in_search_mode = False
2019-11-04 17:27:53 +01:00
2019-11-26 14:19:44 +01:00
def refreshScreen ( self ) : # pylint: disable=unused-variable
2019-11-29 13:12:38 +01:00
""" Method show search button only on inbox or sent screen """
2019-11-26 14:19:44 +01:00
state . searcing_text = ' '
if state . search_screen == ' inbox ' :
try :
self . root . ids . sc1 . children [
3 ] . children [ 1 ] . ids . search_field . text = ' '
except Exception :
self . root . ids . sc1 . children [
2019-11-22 12:33:20 +01:00
2 ] . children [ 1 ] . ids . search_field . text = ' '
2019-11-26 14:19:44 +01:00
self . root . ids . sc1 . children [ 1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
elif state . search_screen == ' addressbook ' :
self . root . ids . sc11 . children [
2 ] . children [ 1 ] . ids . search_field . text = ' '
self . root . ids . sc11 . children [
1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
elif state . search_screen == ' myaddress ' :
try :
self . root . ids . sc10 . children [
3 ] . children [ 1 ] . ids . search_field . text = ' '
except Exception :
self . root . ids . sc10 . children [
2019-11-22 12:33:20 +01:00
2 ] . children [ 1 ] . ids . search_field . text = ' '
2019-11-26 14:19:44 +01:00
self . root . ids . sc10 . children [ 1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
else :
self . root . ids . sc4 . children [
2 ] . children [ 1 ] . ids . search_field . text = ' '
self . root . ids . sc4 . children [ 1 ] . active = True
Clock . schedule_once ( self . search_callback , 0.5 )
return
2019-08-02 11:11:33 +02:00
2019-09-06 17:20:58 +02:00
def set_identicon ( self , text ) :
2019-11-29 13:12:38 +01:00
""" Show identicon in address spinner """
2019-09-06 17:20:58 +02:00
img = identiconGeneration . generate ( text )
2019-11-21 15:50:14 +01:00
self . root . children [ 2 ] . children [ 0 ] . ids . btn . children [ 1 ] . texture = (
img . texture )
2019-09-06 17:20:58 +02:00
2019-09-11 17:03:51 +02:00
def set_mail_detail_header ( self ) :
2019-11-29 13:12:38 +01:00
""" Setting the details of the page """
2019-09-11 17:03:51 +02:00
toolbar_obj = self . root . ids . toolbar
2019-11-21 15:50:14 +01:00
toolbar_obj . left_action_items = [
[ ' arrow-left ' , lambda x : self . back_press ( ) ] ]
delete_btn = [ ' delete-forever ' ,
lambda x : self . root . ids . sc14 . delete_mail ( ) ]
2019-09-11 17:03:51 +02:00
dynamic_list = [ ]
if state . detailPageType == ' inbox ' :
2019-11-21 15:50:14 +01:00
dynamic_list = [
[ ' reply ' , lambda x : self . root . ids . sc14 . inbox_reply ( ) ] ,
delete_btn ]
2019-09-11 17:03:51 +02:00
elif state . detailPageType == ' sent ' :
dynamic_list = [ delete_btn ]
elif state . detailPageType == ' draft ' :
2019-11-21 15:50:14 +01:00
dynamic_list = [
[ ' pencil ' , lambda x : self . root . ids . sc14 . write_msg ( self ) ] ,
delete_btn ]
2019-09-11 17:03:51 +02:00
toolbar_obj . right_action_items = dynamic_list
2019-11-29 15:57:39 +01:00
def load_screen ( self , instance ) :
""" This method is used for loading screen on every click """
if instance . text == ' Inbox ' :
self . root . ids . scr_mngr . current = ' inbox '
self . root . ids . sc1 . children [ 1 ] . active = True
self . root . ids . sc1 . ids . ml . clear_widgets ( )
Clock . schedule_once ( partial ( self . load_screen_callback , instance ) , 0.5 )
def load_screen_callback ( self , instance , dt = 0 ) :
""" This method is rotating loader for few seconds """
if instance . text == ' Inbox ' :
self . root . ids . sc1 . loadMessagelist ( state . association )
self . root . ids . sc1 . children [ 1 ] . active = False
2019-08-07 10:12:41 +02:00
2019-05-09 14:48:29 +02:00
class GrashofPopup ( Popup ) :
2019-11-29 13:12:38 +01:00
""" Moule for save contacts and error messages """
2019-08-05 09:24:32 +02:00
2019-11-29 13:12:38 +01:00
def __init__ ( self , * * kwargs ) : # pylint: disable=useless-super-delegation
""" Grash of pop screen settings """
2019-05-09 14:48:29 +02:00
super ( GrashofPopup , self ) . __init__ ( * * kwargs )
def savecontact ( self ) :
2019-11-29 13:12:38 +01:00
""" Method is used for saving contacts """
2019-09-06 17:20:58 +02:00
label = self . ids . label . text . strip ( )
address = self . ids . address . text . strip ( )
if label == ' ' and address == ' ' :
self . ids . label . focus = True
self . ids . address . focus = True
elif address == ' ' :
self . ids . address . focus = True
elif label == ' ' :
2019-07-17 10:50:27 +02:00
self . ids . label . focus = True
2019-08-13 13:54:04 +02:00
stored_address = [ addr [ 1 ] for addr in kivy_helper_search . search_sql (
folder = " addressbook " ) ]
2019-11-19 16:58:30 +01:00
stored_labels = [ labels [ 0 ] for labels in kivy_helper_search . search_sql (
folder = " addressbook " ) ]
2019-11-22 12:33:20 +01:00
if label and address and address not in stored_address \
and label not in stored_labels :
2019-10-09 18:34:42 +02:00
# state.navinstance = self.parent.children[1]
2019-05-09 14:48:29 +02:00
queues . UISignalQueue . put ( ( ' rerenderAddressBook ' , ' ' ) )
self . dismiss ( )
sqlExecute ( " INSERT INTO addressbook VALUES(?,?) " , label , address )
2019-11-19 16:58:30 +01:00
self . parent . children [ 1 ] . ids . sc11 . ids . ml . clear_widgets ( )
self . parent . children [ 1 ] . ids . sc11 . loadAddresslist ( None , ' All ' , ' ' )
2019-06-28 16:54:47 +02:00
self . parent . children [ 1 ] . ids . scr_mngr . current = ' addressbook '
2019-08-13 09:28:15 +02:00
toast ( ' Saved ' )
2019-05-09 14:48:29 +02:00
2019-08-21 16:24:56 +02:00
# pylint: disable=attribute-defined-outside-init
2019-05-09 14:48:29 +02:00
def show_error_message ( self ) :
2019-11-29 13:12:38 +01:00
""" Showing error message """
2019-08-06 12:05:03 +02:00
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Secondary ' ,
text = " Hey you are not allowed to save blank address contact. "
" That ' s wrong! " ,
size_hint_y = None ,
valign = ' top ' )
2019-05-09 14:48:29 +02:00
content . bind ( texture_size = content . setter ( ' size ' ) )
self . dialog = MDDialog ( content = content ,
size_hint = ( .8 , None ) ,
height = dp ( 200 ) ,
auto_dismiss = False )
self . dialog . add_action_button ( " ok " ,
action = lambda * x : self . dialog . dismiss ( ) )
self . dialog . open ( )
2019-08-17 14:43:10 +02:00
@staticmethod
def close_pop ( ) :
2019-11-29 13:12:38 +01:00
""" Pop is Canceled """
2019-08-13 09:28:15 +02:00
toast ( ' Canceled ' )
2019-05-09 14:48:29 +02:00
2019-09-06 17:20:58 +02:00
def checkAddress_valid ( self , instance ) :
2019-11-19 16:58:30 +01:00
""" Checking address is valid or not """
2019-11-21 15:50:14 +01:00
my_addresses = (
self . parent . children [ 1 ] . children [ 2 ] . children [ 0 ] . ids . btn . values )
2019-09-06 17:20:58 +02:00
add_book = [ addr [ 1 ] for addr in kivy_helper_search . search_sql (
folder = " addressbook " ) ]
entered_text = str ( instance . text ) . strip ( )
if entered_text in add_book :
text = ' Address is already in the addressbook. '
elif entered_text in my_addresses :
text = ' You can not save your own address. '
if entered_text in my_addresses or entered_text in add_book :
2019-11-19 16:58:30 +01:00
self . ids . address . error = True
self . ids . address . helper_text = text
elif entered_text :
self . ids . address . error = False
else :
self . ids . address . error = False
self . ids . address . helper_text = ' This field is required '
def checkLabel_valid ( self , instance ) :
2019-11-29 13:12:38 +01:00
""" Checking address label is unique or not """
2019-11-19 16:58:30 +01:00
entered_label = instance . text . strip ( )
2019-11-22 12:33:20 +01:00
addr_labels = [ labels [ 0 ] for labels in kivy_helper_search . search_sql (
2019-11-21 15:50:14 +01:00
folder = " addressbook " ) ]
2019-11-19 16:58:30 +01:00
if entered_label in addr_labels :
self . ids . label . error = True
self . ids . label . helper_text = ' label name already exists. '
elif entered_label :
self . ids . label . error = False
else :
self . ids . label . error = False
self . ids . label . helper_text = ' This field is required '
2019-09-06 17:20:58 +02:00
2019-05-09 14:48:29 +02:00
class AvatarSampleWidget ( ILeftBody , Image ) :
2019-11-29 13:12:38 +01:00
""" Avatar Sample Widget """
2019-05-09 14:48:29 +02:00
pass
2018-09-05 16:12:55 +02:00
2019-05-09 14:48:29 +02:00
class IconLeftSampleWidget ( ILeftBodyTouch , MDIconButton ) :
2019-11-29 13:12:38 +01:00
""" Left icon sample widget """
2019-05-09 14:48:29 +02:00
pass
2018-09-05 16:12:55 +02:00
2019-05-09 14:48:29 +02:00
class IconRightSampleWidget ( IRightBodyTouch , MDCheckbox ) :
2019-11-29 13:12:38 +01:00
""" Right icon sample widget """
2019-05-09 14:48:29 +02:00
pass
class NavigationDrawerTwoLineListItem (
TwoLineListItem , NavigationDrawerHeaderBase ) :
2019-11-29 13:12:38 +01:00
""" Navigation Drawer in Listitems """
2019-05-09 14:48:29 +02:00
address_property = StringProperty ( )
def __init__ ( self , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Method for Navigation Drawer """
2019-05-09 14:48:29 +02:00
super ( NavigationDrawerTwoLineListItem , self ) . __init__ ( * * kwargs )
Clock . schedule_once ( lambda dt : self . setup ( ) )
def setup ( self ) :
2019-11-29 13:12:38 +01:00
""" Bind Controller.current_account property """
2019-05-09 14:48:29 +02:00
pass
def on_current_account ( self , account ) :
2019-11-29 13:12:38 +01:00
""" Account detail """
2019-05-09 14:48:29 +02:00
pass
def _update_specific_text_color ( self , instance , value ) :
pass
2019-09-30 16:27:08 +02:00
def _set_active ( self , active , list_ ) :
2019-05-28 13:12:51 +02:00
pass
2019-06-06 15:48:20 +02:00
class MailDetail ( Screen ) :
2019-11-29 13:12:38 +01:00
""" MailDetail Screen uses to show the detail of mails """
2019-05-28 13:12:51 +02:00
to_addr = StringProperty ( )
from_addr = StringProperty ( )
subject = StringProperty ( )
message = StringProperty ( )
2019-06-06 15:48:20 +02:00
status = StringProperty ( )
2019-08-05 09:24:32 +02:00
page_type = StringProperty ( )
2019-05-28 13:12:51 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Mail Details method """
2019-06-06 15:48:20 +02:00
super ( MailDetail , self ) . __init__ ( * args , * * kwargs )
2019-05-28 13:12:51 +02:00
Clock . schedule_once ( self . init_ui , 0 )
def init_ui ( self , dt = 0 ) :
2019-11-29 13:12:38 +01:00
""" Clock Schdule for method MailDetail mails """
2019-06-28 16:54:47 +02:00
self . page_type = state . detailPageType if state . detailPageType else ' '
2019-08-19 13:06:24 +02:00
if state . detailPageType == ' sent ' or state . detailPageType == ' draft ' :
2019-08-05 09:24:32 +02:00
data = sqlQuery (
2019-10-15 15:12:23 +02:00
" select toaddress, fromaddress, subject, message, status, "
" ackdata from sent where ackdata = ?; " , state . mail_id )
2019-06-06 15:48:20 +02:00
state . status = self
state . ackdata = data [ 0 ] [ 5 ]
self . assign_mail_details ( data )
2019-09-11 17:03:51 +02:00
state . kivyapp . set_mail_detail_header ( )
2019-06-06 15:48:20 +02:00
elif state . detailPageType == ' inbox ' :
2019-08-05 09:24:32 +02:00
data = sqlQuery (
2019-10-15 15:12:23 +02:00
" select toaddress, fromaddress, subject, message from inbox "
" where msgid = ?; " , str ( state . mail_id ) )
2019-06-06 15:48:20 +02:00
self . assign_mail_details ( data )
2019-09-11 17:03:51 +02:00
state . kivyapp . set_mail_detail_header ( )
2019-06-06 15:48:20 +02:00
2019-08-05 09:24:32 +02:00
def assign_mail_details ( self , data ) :
2019-11-29 13:12:38 +01:00
""" Assigning mail details """
2019-06-06 15:48:20 +02:00
self . to_addr = data [ 0 ] [ 0 ]
self . from_addr = data [ 0 ] [ 1 ]
2019-08-21 16:24:56 +02:00
self . subject = data [ 0 ] [ 2 ] . upper (
) if data [ 0 ] [ 2 ] . upper ( ) else ' (no subject) '
2019-06-06 15:48:20 +02:00
self . message = data [ 0 ] [ 3 ]
if len ( data [ 0 ] ) == 6 :
self . status = data [ 0 ] [ 4 ]
2019-09-11 17:03:51 +02:00
state . write_msg = { ' to_addr ' : self . to_addr ,
' from_addr ' : self . from_addr ,
' subject ' : self . subject ,
' message ' : self . message }
2019-06-06 15:48:20 +02:00
def delete_mail ( self ) :
2019-11-29 13:12:38 +01:00
""" Method for mail delete """
2019-09-11 17:03:51 +02:00
msg_count_objs = state . kivyapp . root . children [ 2 ] . children [ 0 ] . ids
2019-11-19 16:58:30 +01:00
state . searcing_text = ' '
2019-11-29 15:57:39 +01:00
self . children [ 0 ] . children [ 0 ] . active = True
2019-06-06 15:48:20 +02:00
if state . detailPageType == ' sent ' :
2019-11-28 15:50:00 +01:00
state . kivyapp . root . ids . sc4 . children [
2 ] . children [ 1 ] . ids . search_field . text = ' '
2019-08-06 12:05:03 +02:00
sqlExecute (
2019-10-15 15:12:23 +02:00
" UPDATE sent SET folder = ' trash ' WHERE "
" ackdata = ?; " , str ( state . mail_id ) )
2019-07-17 10:50:27 +02:00
msg_count_objs . send_cnt . badge_text = str ( int ( state . sent_count ) - 1 )
state . sent_count = str ( int ( state . sent_count ) - 1 )
2019-09-27 18:31:37 +02:00
self . parent . screens [ 3 ] . ids . ml . clear_widgets ( )
self . parent . screens [ 3 ] . loadSent ( state . association )
2019-06-28 16:54:47 +02:00
elif state . detailPageType == ' inbox ' :
2019-11-28 15:50:00 +01:00
state . kivyapp . root . ids . sc1 . children [
2 ] . children [ 1 ] . ids . search_field . text = ' '
self . parent . screens [ 0 ] . children [ 2 ] . children [
1 ] . ids . search_field . text = ' '
2019-08-06 12:05:03 +02:00
sqlExecute (
2019-10-15 15:12:23 +02:00
" UPDATE inbox SET folder = ' trash ' WHERE "
" msgid = ?; " , str ( state . mail_id ) )
2019-11-21 15:50:14 +01:00
msg_count_objs . inbox_cnt . badge_text = str (
int ( state . inbox_count ) - 1 )
2019-10-10 18:08:52 +02:00
state . inbox_count = str ( int ( state . inbox_count ) - 1 )
2019-09-27 18:31:37 +02:00
self . parent . screens [ 0 ] . ids . ml . clear_widgets ( )
self . parent . screens [ 0 ] . loadMessagelist ( state . association )
2019-11-28 15:50:00 +01:00
2019-09-11 17:03:51 +02:00
elif state . detailPageType == ' draft ' :
2019-10-04 15:54:58 +02:00
sqlExecute ( " DELETE FROM sent WHERE ackdata = ?; " , str (
2019-10-03 18:27:54 +02:00
state . mail_id ) )
2019-11-21 15:50:14 +01:00
msg_count_objs . draft_cnt . badge_text = str (
int ( state . draft_count ) - 1 )
2019-09-11 17:03:51 +02:00
state . draft_count = str ( int ( state . draft_count ) - 1 )
self . parent . screens [ 15 ] . clear_widgets ( )
self . parent . screens [ 15 ] . add_widget ( Draft ( ) )
2019-11-26 14:19:44 +01:00
# self.parent.current = 'allmails' \
# if state.is_allmail else state.detailPageType
2019-09-11 17:03:51 +02:00
if state . detailPageType != ' draft ' :
2019-11-21 15:50:14 +01:00
msg_count_objs . trash_cnt . badge_text = str (
int ( state . trash_count ) + 1 )
msg_count_objs . allmail_cnt . badge_text = str (
int ( state . all_count ) - 1 )
2019-09-11 17:03:51 +02:00
state . trash_count = str ( int ( state . trash_count ) + 1 )
state . all_count = str ( int ( state . all_count ) - 1 )
2019-11-29 15:57:39 +01:00
self . parent . screens [ 4 ] . ids . ml . clear_widgets ( )
self . parent . screens [ 4 ] . init_ui ( dt = 0 )
self . parent . screens [ 16 ] . ids . ml . clear_widgets ( )
self . parent . screens [ 16 ] . init_ui ( dt = 0 )
Clock . schedule_once ( self . callback_for_delete , 4 )
2019-11-26 14:19:44 +01:00
def callback_for_delete ( self , dt = 0 ) :
2019-11-28 15:50:00 +01:00
""" Delete method from allmails """
2019-11-26 14:19:44 +01:00
self . children [ 0 ] . children [ 0 ] . active = False
state . kivyapp . set_common_header ( )
self . parent . current = ' allmails ' \
if state . is_allmail else state . detailPageType
state . detailPageType = ' '
2019-08-13 09:28:15 +02:00
toast ( ' Deleted ' )
2019-06-06 15:48:20 +02:00
2019-06-28 16:54:47 +02:00
def inbox_reply ( self ) :
2019-11-29 13:12:38 +01:00
""" Reply inbox messages """
2019-08-05 09:24:32 +02:00
data = sqlQuery (
2019-10-15 15:12:23 +02:00
" select toaddress, fromaddress, subject, message from inbox where "
" msgid = ?; " , str ( state . mail_id ) )
2019-11-08 13:08:26 +01:00
composer_obj = self . parent . screens [ 2 ] . children [ 1 ] . ids
2019-09-11 17:03:51 +02:00
composer_obj . ti . text = data [ 0 ] [ 0 ]
composer_obj . btn . text = data [ 0 ] [ 0 ]
composer_obj . txt_input . text = data [ 0 ] [ 1 ]
2019-06-28 16:54:47 +02:00
composer_obj . subject . text = data [ 0 ] [ 2 ]
2019-09-27 18:31:37 +02:00
composer_obj . body . text = ' '
2019-11-08 13:08:26 +01:00
state . kivyapp . root . ids . sc3 . children [ 1 ] . ids . rv . data = ' '
2019-09-11 17:03:51 +02:00
self . parent . current = ' create '
state . kivyapp . set_navbar_for_composer ( )
2019-06-28 16:54:47 +02:00
2019-08-23 12:26:35 +02:00
def write_msg ( self , navApp ) :
2019-11-29 13:12:38 +01:00
""" Write on draft mail """
2019-10-03 18:27:54 +02:00
state . send_draft_mail = state . mail_id
2019-11-21 15:50:14 +01:00
composer_ids = (
self . parent . parent . parent . parent . parent . ids . sc3 . children [ 1 ] . ids )
2019-09-11 17:03:51 +02:00
composer_ids . ti . text = state . write_msg [ ' from_addr ' ]
composer_ids . btn . text = state . write_msg [ ' from_addr ' ]
composer_ids . txt_input . text = state . write_msg [ ' to_addr ' ]
2019-11-21 15:50:14 +01:00
composer_ids . subject . text = state . write_msg [
' subject ' ] if state . write_msg [ ' subject ' ] != ' (no subject) ' else ' '
2019-09-11 17:03:51 +02:00
composer_ids . body . text = state . write_msg [ ' message ' ]
self . parent . current = ' create '
2019-08-26 17:28:12 +02:00
navApp . set_navbar_for_composer ( )
2019-08-19 13:06:24 +02:00
2019-09-09 16:17:07 +02:00
@staticmethod
def copy_composer_text ( instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Copy the data from mail detail page """
2019-09-06 17:20:58 +02:00
if len ( instance . parent . text . split ( ' : ' ) ) > 1 :
cpy_text = instance . parent . text . split ( ' : ' ) [ 1 ] . strip ( )
else :
cpy_text = instance . parent . text
Clipboard . copy ( cpy_text )
toast ( ' Copied ' )
2019-06-06 15:48:20 +02:00
class MyaddDetailPopup ( Popup ) :
2019-11-29 13:12:38 +01:00
""" MyaddDetailPopup pop is used for showing my address detail """
2019-06-06 15:48:20 +02:00
address_label = StringProperty ( )
address = StringProperty ( )
2019-11-29 13:12:38 +01:00
def __init__ ( self , * * kwargs ) : # pylint: disable=useless-super-delegation
""" My Address Details screen setting """
2019-06-06 15:48:20 +02:00
super ( MyaddDetailPopup , self ) . __init__ ( * * kwargs )
2019-06-28 16:54:47 +02:00
def set_address ( self , address , label ) :
2019-11-29 13:12:38 +01:00
""" Getting address for displaying details on popup """
2019-06-28 16:54:47 +02:00
self . address_label = label
self . address = address
def send_message_from ( self ) :
2019-11-29 13:12:38 +01:00
""" Method used to fill from address of composer autofield """
2019-11-08 13:08:26 +01:00
state . kivyapp . set_navbar_for_composer ( )
2019-06-28 16:54:47 +02:00
window_obj = self . parent . children [ 1 ] . ids
2019-11-08 13:08:26 +01:00
window_obj . sc3 . children [ 1 ] . ids . ti . text = self . address
window_obj . sc3 . children [ 1 ] . ids . btn . text = self . address
window_obj . sc3 . children [ 1 ] . ids . txt_input . text = ' '
window_obj . sc3 . children [ 1 ] . ids . subject . text = ' '
window_obj . sc3 . children [ 1 ] . ids . body . text = ' '
2019-06-28 16:54:47 +02:00
window_obj . scr_mngr . current = ' create '
self . dismiss ( )
2019-08-16 16:49:55 +02:00
@staticmethod
def close_pop ( ) :
2019-11-29 13:12:38 +01:00
""" Pop is Canceled """
2019-08-13 09:28:15 +02:00
toast ( ' Canceled ' )
2019-08-05 09:24:32 +02:00
2019-06-28 16:54:47 +02:00
class AddbookDetailPopup ( Popup ) :
2019-11-29 13:12:38 +01:00
""" AddbookDetailPopup pop is used for showing my address detail """
2019-06-28 16:54:47 +02:00
address_label = StringProperty ( )
address = StringProperty ( )
2019-10-15 15:12:23 +02:00
def __init__ ( self , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Set screen of address detail page """
2019-10-15 15:12:23 +02:00
# pylint: disable=useless-super-delegation
2019-06-28 16:54:47 +02:00
super ( AddbookDetailPopup , self ) . __init__ ( * * kwargs )
def set_addbook_data ( self , address , label ) :
2019-11-29 13:12:38 +01:00
""" Getting address book data for detial dipaly """
2019-06-28 16:54:47 +02:00
self . address_label = label
self . address = address
def update_addbook_label ( self , address ) :
2019-11-29 13:12:38 +01:00
""" Updating the label of address book address """
2019-11-19 16:58:30 +01:00
address_list = kivy_helper_search . search_sql ( folder = " addressbook " )
stored_labels = [ labels [ 0 ] for labels in address_list ]
add_dict = dict ( address_list )
label = str ( self . ids . add_label . text )
if label in stored_labels and self . address == add_dict [ label ] :
stored_labels . remove ( label )
if label and label not in stored_labels :
2019-10-15 15:12:23 +02:00
sqlExecute (
" UPDATE addressbook SET label = ' {} ' WHERE "
2019-11-21 15:50:14 +01:00
" address = ' {} ' ; " . format (
str ( self . ids . add_label . text ) , address ) )
2019-09-27 18:31:37 +02:00
self . parent . children [ 1 ] . ids . sc11 . ids . ml . clear_widgets ( )
self . parent . children [ 1 ] . ids . sc11 . loadAddresslist ( None , ' All ' , ' ' )
2019-06-28 16:54:47 +02:00
self . dismiss ( )
2019-08-13 09:28:15 +02:00
toast ( ' Saved ' )
2019-06-28 16:54:47 +02:00
def send_message_to ( self ) :
2019-11-29 13:12:38 +01:00
""" Method used to fill to_address of composer autofield """
2019-11-08 13:08:26 +01:00
state . kivyapp . set_navbar_for_composer ( )
2019-06-28 16:54:47 +02:00
window_obj = self . parent . children [ 1 ] . ids
2019-11-08 13:08:26 +01:00
window_obj . sc3 . children [ 1 ] . ids . txt_input . text = self . address
window_obj . sc3 . children [ 1 ] . ids . ti . text = ' '
window_obj . sc3 . children [ 1 ] . ids . btn . text = ' Select '
window_obj . sc3 . children [ 1 ] . ids . subject . text = ' '
window_obj . sc3 . children [ 1 ] . ids . body . text = ' '
2019-06-28 16:54:47 +02:00
window_obj . scr_mngr . current = ' create '
self . dismiss ( )
2019-08-16 16:49:55 +02:00
@staticmethod
def close_pop ( ) :
2019-11-29 13:12:38 +01:00
""" Pop is Canceled """
2019-08-13 09:28:15 +02:00
toast ( ' Canceled ' )
2019-11-19 16:58:30 +01:00
def checkLabel_valid ( self , instance ) :
""" Checking address label is unique of not """
entered_label = str ( instance . text . strip ( ) )
address_list = kivy_helper_search . search_sql ( folder = " addressbook " )
addr_labels = [ labels [ 0 ] for labels in address_list ]
add_dict = dict ( address_list )
2019-11-22 12:33:20 +01:00
if self . address and entered_label in addr_labels \
and self . address != add_dict [ entered_label ] :
2019-11-19 16:58:30 +01:00
self . ids . add_label . error = True
self . ids . add_label . helper_text = ' label name already exists. '
elif entered_label :
self . ids . add_label . error = False
else :
self . ids . add_label . error = False
self . ids . add_label . helper_text = ' This field is required '
2019-06-28 16:54:47 +02:00
class ShowQRCode ( Screen ) :
2019-11-29 13:12:38 +01:00
""" ShowQRCode Screen uses to show the detail of mails """
2019-08-20 15:11:18 +02:00
2019-06-28 16:54:47 +02:00
def qrdisplay ( self ) :
2019-11-29 13:12:38 +01:00
""" Showing QR Code """
2019-09-27 18:31:37 +02:00
# self.manager.parent.parent.parent.ids.search_bar.clear_widgets()
2019-06-28 16:54:47 +02:00
self . ids . qr . clear_widgets ( )
2019-08-05 09:41:56 +02:00
from kivy . garden . qrcode import QRCodeWidget
2019-08-06 13:01:05 +02:00
self . ids . qr . add_widget ( QRCodeWidget (
data = self . manager . get_parent_window ( ) . children [ 0 ] . address ) )
2019-08-13 09:28:15 +02:00
toast ( ' Show QR code ' )
2019-07-17 10:50:27 +02:00
class Draft ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Draft screen is used to show the list of draft messages """
2019-07-17 10:50:27 +02:00
data = ListProperty ( )
2019-12-04 16:45:45 +01:00
account = StringProperty ( )
2019-11-19 16:58:30 +01:00
queryreturn = ListProperty ( )
has_refreshed = True
2019-07-17 10:50:27 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Method used for storing draft messages """
2019-07-17 10:50:27 +02:00
super ( Draft , self ) . __init__ ( * args , * * kwargs )
if state . association == ' ' :
if BMConfigParser ( ) . addresses ( ) :
state . association = BMConfigParser ( ) . addresses ( ) [ 0 ]
Clock . schedule_once ( self . init_ui , 0 )
def init_ui ( self , dt = 0 ) :
2019-11-29 13:12:38 +01:00
""" Clock Schdule for method draft accounts """
2019-07-17 10:50:27 +02:00
self . sentaccounts ( )
2019-08-13 14:46:19 +02:00
print dt
2019-07-17 10:50:27 +02:00
def sentaccounts ( self ) :
2019-12-04 16:45:45 +01:00
""" Load draft accounts. """
self . account = state . association
self . loadDraft ( )
2019-07-17 10:50:27 +02:00
2019-12-04 16:45:45 +01:00
def loadDraft ( self , where = " " , what = " " ) :
""" Load draft list for Draft messages. """
2019-07-17 10:50:27 +02:00
xAddress = ' fromaddress '
2019-12-04 16:45:45 +01:00
self . draftDataQuery ( xAddress , where , what )
2019-07-17 10:50:27 +02:00
if state . msg_counter_objs :
2019-11-21 15:50:14 +01:00
state . msg_counter_objs . draft_cnt . badge_text = str (
len ( self . queryreturn ) )
2019-11-19 16:58:30 +01:00
if self . queryreturn :
2019-09-19 18:30:26 +02:00
src_mng_obj = state . kivyapp . root . children [ 2 ] . children [ 0 ] . ids
2019-12-04 16:45:45 +01:00
src_mng_obj . draft_cnt . badge_text = state . draft_count
self . set_mdList ( )
2019-11-19 16:58:30 +01:00
self . ids . scroll_y . bind ( scroll_y = self . check_scroll_y )
2019-07-17 10:50:27 +02:00
else :
2019-08-06 12:05:03 +02:00
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Primary ' ,
text = " yet no message for this account!!!!!!!!!!!!! " ,
halign = ' center ' ,
bold = True ,
size_hint_y = None ,
valign = ' top ' )
2019-07-17 10:50:27 +02:00
self . ids . ml . add_widget ( content )
2019-12-04 16:45:45 +01:00
def draftDataQuery ( self , xAddress , where , what , start_indx = 0 , end_indx = 20 ) :
""" This methosd is for retrieving draft messages """
self . queryreturn = kivy_helper_search . search_sql (
xAddress , self . account , " draft " , where , what , False , start_indx , end_indx )
def set_mdList ( self ) :
""" This method is used to create mdlist """
2019-11-19 16:58:30 +01:00
data = [ ]
2019-12-04 16:45:45 +01:00
total_draft_msg = len ( self . ids . ml . children )
for mail in self . queryreturn :
2019-11-19 16:58:30 +01:00
third_text = mail [ 3 ] . replace ( ' \n ' , ' ' )
data . append ( {
' text ' : mail [ 1 ] . strip ( ) ,
' secondary_text ' : mail [ 2 ] [ : 10 ] + ' ........... ' if len (
mail [ 2 ] ) > 10 else mail [ 2 ] + ' \n ' + " " + (
third_text [ : 25 ] + ' ...! ' ) if len (
third_text ) > 25 else third_text ,
' ackdata ' : mail [ 5 ] } )
for item in data :
meny = TwoLineAvatarIconListItem (
text = ' Draft ' ,
secondary_text = item [ ' text ' ] ,
theme_text_color = ' Custom ' ,
text_color = NavigateApp ( ) . theme_cls . primary_color )
meny . add_widget ( AvatarSampleWidget (
source = ' ./images/avatar.png ' ) )
meny . bind ( on_press = partial (
self . draft_detail , item [ ' ackdata ' ] ) )
carousel = Carousel ( direction = ' right ' )
carousel . height = meny . height
carousel . size_hint_y = None
carousel . ignore_perpendicular_swipes = True
carousel . data_index = 0
carousel . min_move = 0.2
del_btn = Button ( text = ' Delete ' )
del_btn . background_normal = ' '
del_btn . background_color = ( 1 , 0 , 0 , 1 )
del_btn . bind ( on_press = partial (
self . delete_draft , item [ ' ackdata ' ] ) )
carousel . add_widget ( del_btn )
carousel . add_widget ( meny )
carousel . index = 1
self . ids . ml . add_widget ( carousel )
2019-12-04 16:45:45 +01:00
updated_msg = len ( self . ids . ml . children )
self . has_refreshed = True if total_draft_msg != updated_msg else False
2019-11-19 16:58:30 +01:00
def check_scroll_y ( self , instance , somethingelse ) :
2019-11-29 13:12:38 +01:00
""" Load data on scroll """
2019-11-19 16:58:30 +01:00
if self . ids . scroll_y . scroll_y < = - 0.0 and self . has_refreshed :
self . ids . scroll_y . scroll_y = 0.06
total_draft_msg = len ( self . ids . ml . children )
2019-12-04 16:45:45 +01:00
self . update_draft_screen_on_scroll ( total_draft_msg )
2019-11-19 16:58:30 +01:00
else :
pass
2019-12-04 16:45:45 +01:00
def update_draft_screen_on_scroll ( self , total_draft_msg , where = ' ' , what = ' ' ) :
2019-11-29 13:12:38 +01:00
""" Load more data on scroll down """
2019-12-04 16:45:45 +01:00
self . draftDataQuery ( ' fromaddress ' , where , what , total_draft_msg , 5 )
self . set_mdList ( )
2019-11-19 16:58:30 +01:00
2019-10-03 18:27:54 +02:00
def draft_detail ( self , ackdata , * args ) :
2019-11-29 13:12:38 +01:00
""" Show draft Details """
2019-08-19 13:06:24 +02:00
state . detailPageType = ' draft '
2019-10-03 18:27:54 +02:00
state . mail_id = ackdata
2019-08-19 13:06:24 +02:00
if self . manager :
src_mng_obj = self . manager
else :
src_mng_obj = self . parent . parent
src_mng_obj . screens [ 13 ] . clear_widgets ( )
src_mng_obj . screens [ 13 ] . add_widget ( MailDetail ( ) )
src_mng_obj . current = ' mailDetail '
2019-07-17 10:50:27 +02:00
def delete_draft ( self , data_index , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Delete draft message permanently """
2019-10-04 15:54:58 +02:00
sqlExecute ( " DELETE FROM sent WHERE ackdata = ?; " , str (
2019-08-16 16:56:19 +02:00
data_index ) )
2019-07-17 10:50:27 +02:00
try :
2019-11-21 15:50:14 +01:00
msg_count_objs = (
self . parent . parent . parent . parent . children [ 2 ] . children [ 0 ] . ids )
2019-08-13 14:46:19 +02:00
except Exception :
2019-08-06 12:05:03 +02:00
msg_count_objs = self . parent . parent . parent . parent . parent . children [
2 ] . children [ 0 ] . ids
2019-07-17 10:50:27 +02:00
if int ( state . draft_count ) > 0 :
2019-08-05 12:19:19 +02:00
msg_count_objs . draft_cnt . badge_text = str (
int ( state . draft_count ) - 1 )
2019-07-17 10:50:27 +02:00
state . draft_count = str ( int ( state . draft_count ) - 1 )
self . ids . ml . remove_widget ( instance . parent . parent )
2019-08-13 09:28:15 +02:00
toast ( ' Deleted ' )
2019-07-17 10:50:27 +02:00
2019-08-17 14:43:10 +02:00
@staticmethod
2019-11-29 13:12:38 +01:00
def draft_msg ( src_object ) : # pylint: disable=too-many-locals
""" Save draft mails """
2019-11-08 13:08:26 +01:00
composer_object = state . kivyapp . root . ids . sc3 . children [ 1 ] . ids
2019-07-17 10:50:27 +02:00
fromAddress = str ( composer_object . ti . text )
toAddress = str ( composer_object . txt_input . text )
subject = str ( composer_object . subject . text )
message = str ( composer_object . body . text )
encoding = 3
sendMessageToPeople = True
if sendMessageToPeople :
from addresses import decodeAddress
2019-11-22 12:33:20 +01:00
streamNumber , ripe = decodeAddress ( toAddress ) [ 2 : ]
2019-08-05 09:24:32 +02:00
from addresses import addBMIfNotPresent
2019-07-17 10:50:27 +02:00
toAddress = addBMIfNotPresent ( toAddress )
stealthLevel = BMConfigParser ( ) . safeGetInt (
' bitmessagesettings ' , ' ackstealthlevel ' )
from helper_ackPayload import genAckPayload
ackdata = genAckPayload ( streamNumber , stealthLevel )
sqlExecute (
2019-08-06 12:05:03 +02:00
''' INSERT INTO sent VALUES
( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ''' ,
2019-07-17 10:50:27 +02:00
' ' ,
toAddress ,
ripe ,
fromAddress ,
subject ,
message ,
ackdata ,
int ( time . time ( ) ) ,
int ( time . time ( ) ) ,
0 ,
' msgqueued ' ,
0 ,
' draft ' ,
encoding ,
BMConfigParser ( ) . getint ( ' bitmessagesettings ' , ' ttl ' ) )
2019-09-19 18:30:26 +02:00
2019-07-17 10:50:27 +02:00
state . msg_counter_objs = src_object . children [ 2 ] . children [ 0 ] . ids
state . draft_count = str ( int ( state . draft_count ) + 1 )
src_object . ids . sc16 . clear_widgets ( )
src_object . ids . sc16 . add_widget ( Draft ( ) )
2019-08-13 09:28:15 +02:00
toast ( ' Save draft ' )
2019-08-02 11:11:33 +02:00
return
class CustomSpinner ( Spinner ) :
2019-11-29 13:12:38 +01:00
""" This class is used for setting spinner size """
2019-08-20 15:11:18 +02:00
2019-08-02 11:11:33 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-11-29 13:12:38 +01:00
""" Setting size of spinner """
2019-08-02 11:11:33 +02:00
super ( CustomSpinner , self ) . __init__ ( * args , * * kwargs )
2019-09-06 17:20:58 +02:00
self . dropdown_cls . max_height = Window . size [ 1 ] / 3
2019-08-06 18:13:34 +02:00
2019-08-14 16:55:34 +02:00
class Allmails ( Screen ) :
2019-11-29 13:12:38 +01:00
""" All mails Screen uses screen to show widgets of screens """
2019-08-14 16:55:34 +02:00
data = ListProperty ( )
2019-11-19 16:58:30 +01:00
has_refreshed = True
all_mails = ListProperty ( )
2019-12-04 16:45:45 +01:00
account = StringProperty ( )
2019-08-14 16:55:34 +02:00
def __init__ ( self , * args , * * kwargs ) :
2019-12-04 16:45:45 +01:00
""" Method Parsing the address. """
2019-08-14 16:55:34 +02:00
super ( Allmails , self ) . __init__ ( * args , * * kwargs )
if state . association == ' ' :
if BMConfigParser ( ) . addresses ( ) :
state . association = BMConfigParser ( ) . addresses ( ) [ 0 ]
Clock . schedule_once ( self . init_ui , 0 )
def init_ui ( self , dt = 0 ) :
2019-11-29 13:12:38 +01:00
""" Clock Schdule for method all mails """
2019-08-14 16:55:34 +02:00
self . mailaccounts ( )
2019-08-16 16:49:55 +02:00
print dt
2019-08-14 16:55:34 +02:00
def mailaccounts ( self ) :
2019-12-04 16:45:45 +01:00
""" Load all mails for account. """
self . account = state . association
self . loadMessagelist ( )
2019-08-14 16:55:34 +02:00
2019-12-04 16:45:45 +01:00
def loadMessagelist ( self ) :
""" Load Inbox, Sent anf Draft list of messages. """
self . allMessageQuery ( 0 , 20 )
2019-11-19 16:58:30 +01:00
if self . all_mails :
2019-12-04 16:45:45 +01:00
state . kivyapp . get_inbox_count ( )
state . kivyapp . get_sent_count ( )
state . all_count = str ( int ( state . sent_count ) + int ( state . inbox_count ) )
2019-11-22 12:33:20 +01:00
state . kivyapp . root . children [ 2 ] . children [
2019-12-04 16:45:45 +01:00
0 ] . ids . allmail_cnt . badge_text = state . all_count
self . set_mdlist ( )
2019-11-19 16:58:30 +01:00
self . ids . refresh_layout . bind ( scroll_y = self . check_scroll_y )
2019-08-14 16:55:34 +02:00
else :
content = MDLabel (
font_style = ' Body1 ' ,
theme_text_color = ' Primary ' ,
text = " yet no message for this account!!!!!!!!!!!!! " ,
halign = ' center ' ,
bold = True ,
size_hint_y = None ,
valign = ' top ' )
self . ids . ml . add_widget ( content )
2019-12-04 16:45:45 +01:00
def allMessageQuery ( self , start_indx , end_indx ) :
""" This method is used for retrieving data from inbox or sent both tables """
self . all_mails = sqlQuery (
" SELECT toaddress, fromaddress, subject, message, folder, ackdata "
" As id, DATE(lastactiontime) As actionTime FROM sent WHERE "
" folder = ' sent ' and fromaddress = ' {0} ' UNION SELECT toaddress, fromaddress, subject, "
" message, folder, msgid As id, DATE(received) As actionTime "
" FROM inbox WHERE folder = ' inbox ' and toaddress = ' {0} ' ORDER BY actionTime DESC limit {1} , {2} " . format ( self . account , start_indx , end_indx ) )
def set_mdlist ( self ) :
""" This method is used to create mdList for allmaills """
data_exist = len ( self . ids . ml . children )
for item in self . all_mails :
2019-11-19 16:58:30 +01:00
meny = TwoLineAvatarIconListItem (
text = item [ 1 ] ,
secondary_text = item [ 2 ] [ : 50 ] + ' ........ ' if len (
item [ 2 ] ) > = 50 else (
2019-11-21 15:50:14 +01:00
item [ 2 ] + ' , ' + item [ 3 ] . replace (
' \n ' , ' ' ) ) [ 0 : 50 ] + ' ........ ' ,
2019-11-19 16:58:30 +01:00
theme_text_color = ' Custom ' ,
text_color = NavigateApp ( ) . theme_cls . primary_color )
meny . add_widget ( AvatarSampleWidget (
source = ' ./images/text_images/ {} .png ' . format (
avatarImageFirstLetter ( item [ 2 ] . strip ( ) ) ) ) )
meny . bind ( on_press = partial (
self . mail_detail , item [ 5 ] , item [ 4 ] ) )
carousel = Carousel ( direction = ' right ' )
carousel . height = meny . height
carousel . size_hint_y = None
carousel . ignore_perpendicular_swipes = True
carousel . data_index = 0
carousel . min_move = 0.2
del_btn = Button ( text = ' Delete ' )
del_btn . background_normal = ' '
del_btn . background_color = ( 1 , 0 , 0 , 1 )
del_btn . bind ( on_press = partial (
self . swipe_delete , item [ 5 ] , item [ 4 ] ) )
carousel . add_widget ( del_btn )
carousel . add_widget ( meny )
carousel . index = 1
self . ids . ml . add_widget ( carousel )
2019-12-04 16:45:45 +01:00
updated_data = len ( self . ids . ml . children )
self . has_refreshed = True if data_exist != updated_data else False
2019-11-19 16:58:30 +01:00
def check_scroll_y ( self , instance , somethingelse ) :
2019-11-29 13:12:38 +01:00
""" Scroll fixed length """
2019-11-19 16:58:30 +01:00
if self . ids . refresh_layout . scroll_y < = - 0.00 and self . has_refreshed :
self . ids . refresh_layout . scroll_y = .06
load_more = len ( self . ids . ml . children )
self . updating_allmail ( load_more )
2019-11-21 15:50:14 +01:00
else :
pass
2019-11-19 16:58:30 +01:00
def updating_allmail ( self , load_more ) :
2019-12-04 16:45:45 +01:00
""" This method is used to update the all mail
listing value on the scroll of screen """
self . allMessageQuery ( load_more , 5 )
self . set_mdlist ( )
2019-11-19 16:58:30 +01:00
2019-08-26 17:28:12 +02:00
def mail_detail ( self , unique_id , folder , * args ) :
2019-11-29 13:12:38 +01:00
""" Load sent and inbox mail details """
2019-08-26 17:28:12 +02:00
state . detailPageType = folder
state . is_allmail = True
2019-10-03 18:27:54 +02:00
state . mail_id = unique_id
2019-08-26 17:28:12 +02:00
if self . manager :
src_mng_obj = self . manager
else :
src_mng_obj = self . parent . parent
src_mng_obj . screens [ 13 ] . clear_widgets ( )
src_mng_obj . screens [ 13 ] . add_widget ( MailDetail ( ) )
src_mng_obj . current = ' mailDetail '
def swipe_delete ( self , unique_id , folder , instance , * args ) :
2019-11-29 13:12:38 +01:00
""" Delete inbox mail from all mail listing """
2019-08-26 17:28:12 +02:00
if folder == ' inbox ' :
sqlExecute (
2019-10-04 15:54:58 +02:00
" UPDATE inbox SET folder = ' trash ' WHERE msgid = ?; " , str (
2019-08-26 17:28:12 +02:00
unique_id ) )
else :
sqlExecute (
2019-10-04 15:54:58 +02:00
" UPDATE sent SET folder = ' trash ' WHERE ackdata = ?; " , str (
2019-08-26 17:28:12 +02:00
unique_id ) )
self . ids . ml . remove_widget ( instance . parent . parent )
try :
msg_count_objs = self . parent . parent . parent . parent . children [
2 ] . children [ 0 ] . ids
nav_lay_obj = self . parent . parent . parent . parent . ids
except Exception :
msg_count_objs = self . parent . parent . parent . parent . parent . children [
2 ] . children [ 0 ] . ids
nav_lay_obj = self . parent . parent . parent . parent . parent . ids
if folder == ' inbox ' :
msg_count_objs . inbox_cnt . badge_text = str (
int ( state . inbox_count ) - 1 )
state . inbox_count = str ( int ( state . inbox_count ) - 1 )
2019-09-27 18:31:37 +02:00
nav_lay_obj . sc1 . ids . ml . clear_widgets ( )
nav_lay_obj . sc1 . loadMessagelist ( state . association )
2019-08-26 17:28:12 +02:00
else :
msg_count_objs . send_cnt . badge_text = str (
int ( state . sent_count ) - 1 )
state . sent_count = str ( int ( state . sent_count ) - 1 )
2019-09-27 18:31:37 +02:00
nav_lay_obj . sc4 . ids . ml . clear_widgets ( )
nav_lay_obj . sc4 . loadSent ( state . association )
2019-08-26 17:28:12 +02:00
msg_count_objs . trash_cnt . badge_text = str (
int ( state . trash_count ) + 1 )
msg_count_objs . allmail_cnt . badge_text = str (
int ( state . all_count ) - 1 )
state . trash_count = str ( int ( state . trash_count ) + 1 )
state . all_count = str ( int ( state . all_count ) - 1 )
nav_lay_obj . sc5 . clear_widgets ( )
nav_lay_obj . sc5 . add_widget ( Trash ( ) )
nav_lay_obj . sc17 . clear_widgets ( )
nav_lay_obj . sc17 . add_widget ( Allmails ( ) )
2019-08-21 16:24:56 +02:00
# pylint: disable=attribute-defined-outside-init
2019-08-14 16:55:34 +02:00
def refresh_callback ( self , * args ) :
2019-11-22 12:33:20 +01:00
""" Method updates the state of application,
2019-11-29 13:12:38 +01:00
While the spinner remains on the screen """
2019-08-14 16:55:34 +02:00
def refresh_callback ( interval ) :
2019-11-29 13:12:38 +01:00
""" Load the allmails screen data """
2019-08-14 16:55:34 +02:00
self . ids . ml . clear_widgets ( )
self . remove_widget ( self . children [ 1 ] )
try :
screens_obj = self . parent . screens [ 16 ]
2019-08-16 16:49:55 +02:00
except Exception :
2019-08-14 16:55:34 +02:00
screens_obj = self . parent . parent . screens [ 16 ]
screens_obj . add_widget ( Allmails ( ) )
self . ids . refresh_layout . refresh_done ( )
self . tick = 0
Clock . schedule_once ( refresh_callback , 1 )
2019-09-06 17:20:58 +02:00
2019-11-08 13:08:26 +01:00
def set_root_layout ( self ) :
2019-11-21 15:50:14 +01:00
""" Setting root layout """
2019-11-08 13:08:26 +01:00
try :
return self . manager . parent . parent
2019-11-22 12:33:20 +01:00
except Exception :
2019-11-08 13:08:26 +01:00
return state . kivyapp . root . ids . float_box
2019-09-06 17:20:58 +02:00
def avatarImageFirstLetter ( letter_string ) :
2019-11-22 12:33:20 +01:00
""" This function is used to the first letter for the avatar image """
2019-09-06 17:20:58 +02:00
if letter_string [ 0 ] . upper ( ) > = ' A ' and letter_string [ 0 ] . upper ( ) < = ' Z ' :
img_latter = letter_string [ 0 ] . upper ( )
elif int ( letter_string [ 0 ] ) > = 0 and int ( letter_string [ 0 ] ) < = 9 :
img_latter = letter_string [ 0 ]
else :
img_latter = ' ! '
2019-09-07 16:41:42 +02:00
return img_latter
2019-09-19 18:30:26 +02:00
class Starred ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Starred Screen show widgets of page """
2019-09-19 18:30:26 +02:00
pass
class Archieve ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Archieve Screen show widgets of page """
2019-09-19 18:30:26 +02:00
pass
2019-09-20 13:19:04 +02:00
2019-09-19 18:30:26 +02:00
class Spam ( Screen ) :
2019-11-29 13:12:38 +01:00
""" Spam Screen show widgets of page """
2019-09-20 13:19:04 +02:00
pass
2019-10-31 11:54:18 +01:00
class LoadingPopup ( Popup ) :
2019-11-22 12:33:20 +01:00
""" Class for loading Popup """
2019-11-21 15:50:14 +01:00
2019-10-31 11:54:18 +01:00
def __init__ ( self , * * kwargs ) :
super ( LoadingPopup , self ) . __init__ ( * * kwargs )
# call dismiss_popup in 2 seconds
Clock . schedule_once ( self . dismiss_popup , 0.5 )
def dismiss_popup ( self , dt ) :
2019-11-22 12:33:20 +01:00
""" Dismiss popups """
2019-11-06 15:04:22 +01:00
self . dismiss ( )