Advertisement
Guest User

asdasd

a guest
Apr 8th, 2020
780
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 17.74 KB | None | 0 0
  1. from kivymd.app import MDApp
  2. from kivymd.uix.taptargetview import MDTapTargetView
  3. from kivy.properties import ObjectProperty
  4. from kivy.garden.mapview import MapView ,MapMarker,MapMarkerPopup
  5. from kivy.uix.screenmanager import Screen,ScreenManager,SlideTransition
  6. from kivymd.uix.snackbar import Snackbar
  7. from kivy.uix.floatlayout import FloatLayout
  8. from kivymd.uix.tab import MDTabsBase
  9. import sqlite3
  10. import socket
  11. from kivy.clock import Clock
  12. from kivymd.uix.dialog import MDDialog,MDInputDialog
  13. from kivymd.uix.list import IRightBodyTouch, OneLineAvatarIconListItem
  14. from kivy.properties import StringProperty
  15. from kivymd.uix.selectioncontrol import MDSwitch
  16. from kivymd.theming import ThemableBehavior
  17. from kivymd.uix.list import MDList
  18. from kivy.uix.widget import Widget
  19. from kivy.graphics import Rectangle
  20. from kivy.graphics.texture import Texture
  21. from kivymd.uix.list import MDList
  22. from gpsblinker import GpsBlinker
  23.  
  24. publ_ipv4 = "my server ip(for eg)"
  25. s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  26. s.connect((publ_ipv4,12345))
  27. from gpshelper import GpsHelper
  28. rtr_count = 0
  29. def send_mes(mes):
  30.     s.send(str(mes).encode("utf-8"))
  31. #Connect to the local account database
  32. account_db = sqlite3.connect("account.db")
  33.  
  34. ac_db_cur = account_db.cursor()
  35.  
  36. ac_db_cur.execute("SELECT * FROM accounts")
  37. def remove():
  38.     ac_db_cur.execute("DELETE FROM accounts")
  39.     ac_db_cur.execute("DELETE FROM avatar")
  40.     account_db.commit()
  41. tutorial = False
  42. usr_ac_cred = ac_db_cur.fetchall()
  43. print(usr_ac_cred)
  44. logged_in = None
  45.  
  46. if len(usr_ac_cred) == 0:
  47.     logged_in = False
  48. elif len(usr_ac_cred) != 0:
  49.  
  50.     logged_in = True
  51.     print(logged_in)
  52. class ScreenOne(Screen):
  53.     pass
  54. class ScreenTwo(Screen):
  55.     pass
  56. class ScreenThree(Screen):
  57.     pass
  58.  
  59.  
  60. class LocationPopupMenu(MDDialog):
  61.     def build(self):
  62.         self.title = "Trashcan"
  63.         self.text = "If there is no trashcan here. You can remove this."
  64.         self.text_button_ok = "Remove"
  65.         self.text_button_cancel = "Cancel"
  66.  
  67.     def __init__(self, lat,lon):
  68.         self.build()
  69.         super().__init__()
  70.  
  71.         self.events_callback = self.remove(lon,lat)
  72.  
  73.  
  74.     def remove(self,lon,lat):
  75.         send_mes(["rm",[lon,lat]])
  76.  
  77.  
  78.  
  79. class TrashMarker(MapMarkerPopup):
  80.  
  81.  
  82.     def on_release(self):
  83.         # Open up the LocationPopupMenu
  84.         menu = LocationPopupMenu(self.lat,self.lon)
  85.         menu.size_hint = [.3, .3]
  86.         menu.open()
  87.  
  88. class SearchPopupMenu(MDInputDialog):
  89.     title = "Search by Address"
  90.     text_button_ok = "Search"
  91.     def __init__(self):
  92.         super().__init__()
  93.         self.size_hint = [.8,.3]
  94.         self.opacity = 1
  95.         self.events_callback = self.callback
  96.     def callback(self,*args):
  97.         address = self.text_field.text
  98.         self.geocode_get_lat_lon(address)
  99.     def geocode_get_lat_lon(self,address):
  100.         print("hello")
  101.  
  102.  
  103.  
  104. class Main(MapView):
  105.     getting_markers_timer = None
  106.  
  107.  
  108.     def start_getting_markers_in_fov(self):
  109.         self.map_source = "osm"
  110.         #after one second get markers in fov\
  111.         try :
  112.  
  113.             self.getting_markers_timer.cancel()
  114.         except:
  115.             pass
  116.         self.getting_markers_timer = Clock.schedule_once(self.get_markers_in_fov,1)
  117.  
  118.     def get_markers_in_fov(self,*args):
  119.  
  120.  
  121.         unp_bound = self.get_bbox()
  122.  
  123.         lo = unp_bound[1]
  124.         lo_p = unp_bound[3]
  125.         la = unp_bound[0]
  126.         la_p = unp_bound[2]
  127.  
  128.         ac_db_cur.execute("SELECT DISTINCT * FROM mpmr WHERE lon > %s AND lon < %s AND lat > %s AND lat < %s" % (
  129.                     lo, lo_p, la, la_p))
  130.         mkr_data = ac_db_cur.fetchall()
  131.         print(mkr_data)
  132.  
  133.         for set in mkr_data:
  134.             self.add_marker(TrashMarker(lat = set[1],lon = set[0]))
  135.         print("done")
  136. class MyWidget(Widget):
  137.     def __init__(self, **args):
  138.         super(MyWidget, self).__init__(**args)
  139.         self.texture = Texture.create(size=(2, 2), colorfmt='rgba')
  140.  
  141.         p1_color = [255, 96, 27, 255]
  142.         p2_color = [255, 0, 133, 255]
  143.         p3_color = [206, 255, 0, 255]
  144.         p4_color = [232, 202, 0, 255]
  145.         p1_color = [0, 171, 146, 255]
  146.         p2_color = [0, 174, 109, 255]
  147.         p3_color = [0, 138, 175, 255]
  148.         p4_color = [15, 154, 174, 255]
  149.  
  150.         p = p1_color + p2_color + p3_color + p4_color
  151.         buf = bytes(p)
  152.         self.texture.blit_buffer(buf, colorfmt='rgba', bufferfmt='ubyte')
  153.         with self.canvas:
  154.             self.rect = Rectangle(pos=self.pos, size=self.size, texture=self.texture)
  155.  
  156.         self.bind(size=self.update_rect)
  157.         self.bind(pos=self.update_rect)
  158.  
  159.     def update_rect(self, *args):
  160.         self.rect.size = self.size
  161.         self.rect.pos = self.pos
  162.  
  163. #load map
  164. settings_db = sqlite3.connect("Settings.db")
  165. cur = settings_db.cursor()
  166.  
  167. cur.execute("select * from settings")
  168. data_un= cur.fetchall()
  169. print(data_un)
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176. class DrawerList(ThemableBehavior, MDList):
  177.     def set_color_item(self, instance_item):
  178.         '''Called when tap on a menu item.'''
  179.  
  180.         # Set the color of the icon and text for the menu item.
  181.         for item in self.children:
  182.             if item.text_color == self.theme_cls.primary_color:
  183.                 item.text_color = self.theme_cls.text_color
  184.                 break
  185.         instance_item.text_color = self.theme_cls.primary_color
  186.  
  187. class Settings_screen_list(OneLineAvatarIconListItem):
  188.     icon = StringProperty("android")
  189. class Right_switch(IRightBodyTouch,MDSwitch):
  190.     pass
  191.  
  192.  
  193. class Manager(ScreenManager):
  194.     Home = ObjectProperty(None)
  195.     Settings = ObjectProperty(None)
  196.  
  197. class Tab(FloatLayout, MDTabsBase):
  198.     '''Class implementing content for a tab.'''
  199.  
  200.  
  201. class MainApp(MDApp):
  202.     data = {
  203.         "help-circle-outline" : "Help",
  204.         "mapbox" : "Add Trashcan",
  205.         "settings" : "settings"
  206.     }
  207.     myscreen = ObjectProperty()
  208.     search_menu= None
  209.  
  210.  
  211.  
  212.     def on_start(self):
  213.         self.root.ids.parent_manager.transition = SlideTransition()
  214.         self.root.ids.manager.transition =  SlideTransition()
  215.         self.root.ids.manager.transition.direction = "left"
  216.         self.root.ids.manager.transition.direction = "left"
  217.  
  218.  
  219.         try:
  220.             self.root.ids.avatar_usr.source = ac_db_cur.execute("SELECT * FROM avatar").fetchall()[0][0]
  221.             self.root.ids.avatar_usr_2.source = ac_db_cur.execute("SELECT * FROM avatar").fetchall()[0][0]
  222.             self.root.ids.uad_username.text = usr_ac_cred[0][1].title()
  223.             self.root.ids.uad_email.text = usr_ac_cred[0][0]
  224.             self.root.ids.nav_username.text = usr_ac_cred[0][1].title()
  225.             self.root.ids.nav_email.text = usr_ac_cred[0][0]
  226.             #initialize gps
  227.  
  228.         except:
  229.             pass
  230.  
  231.     def build(self):
  232.  
  233.         #Accessing settings database
  234.         cur.execute("SELECT mode from settings where attribute='darkmode' ")
  235.         GpsHelper().run()
  236.         lat = self.root.ids.blinker.lat
  237.         lon = self.root.ids.blinker.lon
  238.         gps_stat = [[lon,lat],"app_gps"]
  239.         send_mes(gps_stat)
  240.         response = s.recvfrom(100000)
  241.         response = eval(response[0].decode("utf-8"))
  242.         print(response)
  243.         if response[0] == "db_register":
  244.             ac_db_cur.execute("DELETE FROM mpmr")
  245.             for or_pair in response[1]:
  246.                 sql_scr = "INSERT INTO mpmr VALUES("+str(or_pair[0])+","+str(or_pair[1])+")"
  247.  
  248.                 ac_db_cur.execute(sql_scr)
  249.             account_db.commit()
  250.  
  251.  
  252.  
  253.         #App theme and UI color schemes
  254.         darkmode_opt_list = cur.fetchall()
  255.         darkmode_opt = darkmode_opt_list[0][0]
  256.         self.theme_cls.primary_palette = "Cyan"
  257.         self.theme_cls.primary_hue = "800"
  258.         self.theme_cls.accent_palette  = "Gray"
  259.         self.theme_cls.accent_hue = "50"
  260.         self.search_menu = SearchPopupMenu()
  261.  
  262.         self.tap_target_view = MDTapTargetView(
  263.             widget=self.root.ids.button,
  264.             title_text="Click here to locate you.",
  265.             description_text="Make sure we are right over you",
  266.             widget_position="left_bottom",
  267.         )
  268.         if darkmode_opt == "on":
  269.             print("dark mode on")
  270.             self.theme_cls.theme_style = "Dark"
  271.             self.root.ids.darkmode_switch.active= True
  272.         else:
  273.             print("light mode on")
  274.             self.theme_cls.theme_style = "Light"
  275.             self.root.ids.darkmode_switch.active = False
  276.  
  277.  
  278.         if logged_in == True:
  279.             self.root.ids.manager.current = "Home"
  280.  
  281.  
  282.             def repos(button):
  283.                 self.root.ids.ecomap.center_on(self.root.ids.blinker.lat,self.root.ids.blinker.lon)
  284.                 self.root.ids.ecomap.zoom = 18
  285.  
  286.             self.tap_target_view.bind(on_close=repos)
  287.  
  288.             def drop_marker_db(button):
  289.                 pass
  290.                 # temp_marker = MapMarker(lat=val[0], lon=val[1])
  291.                 # screen.ids.ecomap.add_marker(temp_marker)
  292.  
  293.             try:
  294.                 self.start_anim.cancel()
  295.             except:
  296.                 pass
  297.             self.start_anim = Clock.schedule_once(self.start_tp_anim, 3.5)
  298.  
  299.  
  300.  
  301.         elif logged_in == False:
  302.             self.root.ids.parent_manager.current = "account_setup"
  303.  
  304.  
  305.     def start_app(self):
  306.  
  307.         self.root.ids.parent_manager.current = "parent"
  308.         self.root.ids.manager.current = "Home"
  309.         usr_ac_cred = ac_db_cur.execute("SELECT * FROM accounts").fetchall()
  310.         self.root.ids.uad_username.text = usr_ac_cred[0][1]
  311.         self.root.ids.uad_email.text = usr_ac_cred[0][0]
  312.         self.root.ids.nav_username.text = usr_ac_cred[0][1]
  313.         self.root.ids.nav_email.text = usr_ac_cred[0][0]
  314.         print(self.root.ids.blinker.lat)
  315.         print(self.root.ids.blinker.lon)
  316.  
  317.     def start_tp_anim(self,*args):
  318.         self.tap_target_start()
  319.     def init_dark_mode(self,select,value):
  320.         if value:
  321.             self.theme_cls.theme_style = "Dark"
  322.             cur.execute("UPDATE settings SET mode='on' WHERE attribute = 'darkmode'")
  323.             settings_db.commit()
  324.         else:
  325.             self.theme_cls.theme_style = "Light"
  326.             cur.execute("UPDATE settings SET mode='off' WHERE attribute = 'darkmode'")
  327.             settings_db.commit()
  328.     def tap_target_start(self):
  329.         if self.tap_target_view.state == "close":
  330.             self.tap_target_view.start()
  331.         else:
  332.             self.tap_target_view.stop()
  333.     def callback(self,instance):
  334.         if instance.icon == "settings":
  335.             self.root.ids.manager.transition.direction = "left"
  336.             self.root.ids.manager.current = "Settings"
  337.         elif instance.icon == "mapbox":
  338.             self.register_trashcan()
  339.         elif instance.icon == "help-circle-outline":
  340.             self.root.ids.manager.transition.direction = "left"
  341.             self.root.ids.manager.current = "help"
  342.  
  343.     def open_account(self):
  344.         self.root.ids.parent_manager.current="User_account_details"
  345.         self.root.ids.parent_manager.transition.direction = "left"
  346.         self.root.ids.manager.transition.direction = "left"
  347.  
  348.     def open_home(self):
  349.         self.root.ids.manager.current="Home"
  350.     def sign_up(self):
  351.         username = self.root.ids.name_field.text
  352.         email = self.root.ids.email_field.text
  353.         password = self.root.ids.password_field.text
  354.         Acc_list = ["acc", username, email, password]
  355.         if username == "" or email == ""or password == "":
  356.             if username == "":
  357.                 self.root.ids.name_field.hint_text = "Name field cannot be empty!"
  358.             elif email == "":
  359.                 self.root.ids.email_field.hint_text = "Email field cannot be empty!"
  360.             elif password == "":
  361.                 self.root.ids.password_field.hint_text = "Password field cannot be empty!"
  362.         else :
  363.             print(Acc_list)
  364.             send_mes(Acc_list)
  365.             response  = s.recvfrom(1024)
  366.  
  367.  
  368.             response = str(response[0].decode("utf-8"))
  369.             print(response)
  370.             if response == "ACCOUNT CREATED":
  371.                 sql_script = "INSERT INTO accounts VALUES('" + email + "', '" + username + "' , '" + password + "')"
  372.                 ac_db_cur.execute(sql_script)
  373.                 account_db.commit()
  374.                 self.root.ids.parent_manager.current = "profile_picture_opt"
  375.                 self.root.ids.uad_username.text = username
  376.                 self.root.ids.uad_email.text = email
  377.                 self.root.ids.nav_username.text = username
  378.                 self.root.ids.nav_email.text = email
  379.                 GpsHelper().run()
  380.                 tutorial = True
  381.             elif response == "EM_AL_EX":
  382.                 self.root.ids.email_field.text = ""
  383.                 self.root.ids.email_field.hint_text = "Email Id is already used!"
  384.         #register this account to server database
  385.  
  386.  
  387.         #register this account credentials to localhost database
  388.  
  389.     def go_to_login(self):
  390.         self.root.ids.parent_manager.current = "login_screen"
  391.         self.root.ids.parent_manager.transition.direction = "left"
  392.  
  393.     def login(self):
  394.  
  395.         if len(self.root.ids.login_email_field.text) == 0  or len(self.root.ids.login_pw_field.text) == 0:
  396.             self.root.ids.login_email_field.hint_text = "Email field cannot be empty"
  397.             self.root.ids.login_pw_field.hint_text = "Password field cannot be empty"
  398.         else:
  399.             print("hey look over here")
  400.             print(type(self.root.ids.login_email_field.text))
  401.             print(type(self.root.ids.login_pw_field.text))
  402.             cred_cont = [(self.root.ids.login_email_field.text.lower(),"",self.root.ids.login_pw_field.text),"ch_acc_cred"]
  403.             send_mes(cred_cont)
  404.             response = s.recvfrom(1024)
  405.             response = str(response[0].decode("utf-8"))
  406.             if response == "error_lia":
  407.                 pass
  408.             else:
  409.                 response = eval(response)
  410.                 if response[0]=="verified":
  411.                     sql_scr1 = "DELETE FROM accounts"
  412.                     sql_scr2 = "INSERT INTO accounts VALUES('"+self.root.ids.login_email_field.text+"', '"+response[1]+"' , '"+self.root.ids.login_pw_field.text+"')"
  413.                     ac_db_cur.execute(sql_scr1)
  414.                     ac_db_cur.execute(sql_scr2)
  415.                     account_db.commit()
  416.                     global logged_in
  417.                     logged_in = True
  418.                     self.root.ids.parent_manager.current = "profile_picture_opt"
  419.                     self.root.ids.parent_manager.transition.direction = "left"
  420.                     GpsHelper().run()
  421.                     tutorial = True
  422.  
  423.  
  424.     def confirm_av(self):
  425.         usr_av = None
  426.         selected = None
  427.  
  428.         for avatar in [self.root.ids.m1,self.root.ids.m2,self.root.ids.m3,self.root.ids.m4,self.root.ids.m5,self.root.ids.m6,self.root.ids.m7,self.root.ids.w1,self.root.ids.w2,self.root.ids.w3,self.root.ids.w4,self.root.ids.w5,self.root.ids.w6,self.root.ids.w7]:
  429.  
  430.             if avatar.size == [250,250]:
  431.  
  432.                 selected = True
  433.                 break
  434.         if selected == True:
  435.             ac_db_cur.execute("DELETE FROM avatar")
  436.             ac_db_cur.execute("INSERT INTO avatar VALUES('"+avatar.icon+"')")
  437.             account_db.commit()
  438.             self.start_app()
  439.             av = ac_db_cur.execute("SELECT * FROM avatar").fetchall()[0][0]
  440.  
  441.             self.root.ids.avatar_usr.source = av
  442.             self.root.ids.avatar_usr_2.source = av
  443.         else :
  444.             pass
  445.     def confirm_ava(self):
  446.         usr_av = None
  447.         selected = None
  448.  
  449.         for avatar in [self.root.ids.m1a,self.root.ids.m2a,self.root.ids.m3a,self.root.ids.m4a,self.root.ids.m5a,self.root.ids.m6a,self.root.ids.m7a,self.root.ids.w1a,self.root.ids.w2a,self.root.ids.w3a,self.root.ids.w4a,self.root.ids.w5a,self.root.ids.w6a,self.root.ids.w7a]:
  450.  
  451.             if avatar.size == [250,250]:
  452.  
  453.                 selected = True
  454.                 break
  455.         if selected == True:
  456.             ac_db_cur.execute("DELETE FROM avatar")
  457.             ac_db_cur.execute("INSERT INTO avatar VALUES('"+avatar.icon+"')")
  458.             account_db.commit()
  459.  
  460.             av = ac_db_cur.execute("SELECT * FROM avatar").fetchall()[0][0]
  461.  
  462.             self.root.ids.avatar_usr.source = av
  463.             self.root.ids.avatar_usr_2.source = av
  464.         else :
  465.             pass
  466.     def register_trashcan(self):
  467.         lat = self.root.ids.blinker.lat
  468.         lon = self.root.ids.blinker.lon
  469.         list = ["tr_reg",[lat,lon]]
  470.         send_mes(list)
  471.         self.snackbar = Snackbar(text="Trashcan added.Will be shown soon!")
  472.         self.snackbar.show()
  473.  
  474.     def dev(self):
  475.         self.snackbar = Snackbar(text="Developer : Tenzin Dayoe")
  476.         self.snackbar.show()
  477.  
  478.  
  479.     def sign_out(self):
  480.         ac_db_cur.execute("DELETE FROM accounts ")
  481.         ac_db_cur.execute("DELETE FROM avatar")
  482.         account_db.commit()
  483.  
  484.         self.root.ids.parent_manager.current = "account_setup"
  485.         self.root.ids.email_field.text = ""
  486.         self.root.ids.name_field.text = ""
  487.         self.root.ids.password_field.text = ""
  488.     def send_fb(self):
  489.  
  490.         fb_email = self.root.ids.feedback_email.text
  491.         fb_data = self.root.ids.feedback_data.text
  492.         if len(fb_email) != 0 and len(fb_data) != 0:
  493.             fb_container = [[fb_email, fb_data],"feedback"]
  494.             send_mes(fb_container)
  495.             self.snackbar = Snackbar(text="Sent. Thank you!")
  496.             self.snackbar.show()
  497.             self.root.ids.feedback_email.text = ""
  498.             self.root.ids.feedback_data.text = ""
  499.         else:
  500.             if len(fb_email) == 0:
  501.                 self.root.ids.feedback_email.hint_text = "Email id required!"
  502.             if len(fb_data) == 0:
  503.                 self.root.ids.feedback_data.hint_text = "Type Feedback or bugs you've found in the App! "
  504. MainApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement