__init__.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. import os
  4. import requests
  5. import validators
  6. import gobject
  7. ## local UI import
  8. from UI.page import Page
  9. from UI.constants import ICON_TYPES,Width,Height,RUNEVT
  10. from UI.icon_item import IconItem
  11. from UI.icon_pool import MyIconPool
  12. from UI.label import Label
  13. from UI.fonts import fonts
  14. from UI.util_funcs import midRect,CmdClean,get_git_revision_short_hash
  15. from UI.keys_def import CurKeys
  16. from UI.confirm_page import ConfirmPage
  17. from UI.download import Download
  18. from UI.download_process_page import DownloadProcessPage
  19. from libs.roundrects import aa_round_rect
  20. from libs.DBUS import is_wifi_connected_now
  21. import config
  22. class UpdateDownloadPage(DownloadProcessPage):
  23. _MD5 = ""
  24. def GObjectUpdateProcessInterval(self):
  25. if self._Screen.CurPage() == self:
  26. if self._Downloader.isFinished():
  27. if self._Downloader.isSuccessful():
  28. print("Success!")
  29. # Do something with obj.get_dest()
  30. filename = self._Downloader.get_dest()
  31. if filename.endswith(".tar.gz"):
  32. #/home/cpi/apps/[launcher]
  33. cmdpath = "tar zxf " + CmdClean(filename) + " -C /home/cpi/apps ;rm -rf "+ filename
  34. pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath))
  35. self.ReturnToUpLevelPage()
  36. self._Screen.Draw()
  37. self._Screen.SwapAndShow()
  38. else:
  39. print("Download failed with the following exceptions:")
  40. for e in self._Downloader.get_errors():
  41. print(unicode(e))
  42. try:
  43. self._Downloader.stop()
  44. except:
  45. pass
  46. filename = self._Downloader.get_dest()
  47. print(filename)
  48. os.system("rm -rf %s" % CmdClean(filename))
  49. self._Screen._MsgBox.SetText("Download failed")
  50. self._Screen._MsgBox.Draw()
  51. self._Screen.SwapAndShow()
  52. return False
  53. else:
  54. self._Value = self._Downloader.get_progress()
  55. print("Progress: %d%%" % (self._Value))
  56. self._Screen.Draw()
  57. self._Screen.SwapAndShow()
  58. return True
  59. else:
  60. return False
  61. def StartDownload(self,url,dst_dir):
  62. if validators.url(url) and os.path.isdir(dst_dir):
  63. self._URL = url
  64. self._DST_DIR = dst_dir
  65. else:
  66. self._Screen._MsgBox.SetText("Invaid")
  67. self._Screen._MsgBox.Draw()
  68. self._Screen.SwapAndShow()
  69. return
  70. self._Downloader = Download(url,dst_dir,None)
  71. if self._MD5 != None:
  72. if len(self._MD5) == 32:
  73. self._Downloader.add_hash_verification('md5' ,self._MD5) ## hashlib provide algorithms
  74. self._Downloader.start()
  75. self._DownloaderTimer = gobject.timeout_add(100, self.GObjectUpdateProcessInterval)
  76. class UpdateConfirmPage(ConfirmPage):
  77. _ConfirmText = "Confirm Update ?"
  78. _DownloadPage = None
  79. _URL = ""
  80. _MD5 = ""
  81. _Version = ""
  82. _GIT = False
  83. def KeyDown(self,event):
  84. if event.key == CurKeys["Menu"] or event.key == CurKeys["A"]:
  85. self.ReturnToUpLevelPage()
  86. self._Screen.Draw()
  87. self._Screen.SwapAndShow()
  88. if event.key == CurKeys["B"]:
  89. if self._GIT == True:
  90. cmdpath = "feh --bg-center /home/cpi/apps/launcher/sys.py/gameshell/wallpaper/updating.png; cd /home/cpi/apps/launcher ;git pull; git reset --hard %s ; feh --bg-center /home/cpi/apps/launcher/sys.py/gameshell/wallpaper/loading.png " % self._Version
  91. pygame.event.post( pygame.event.Event(RUNEVT, message=cmdpath))
  92. self._GIT = False
  93. return
  94. if self._DownloadPage == None:
  95. self._DownloadPage = UpdateDownloadPage()
  96. self._DownloadPage._Screen = self._Screen
  97. self._DownloadPage._Name = "Downloading..."
  98. self._DownloadPage.Init()
  99. self._DownloadPage._MD5 = self._MD5
  100. self._Screen.PushPage(self._DownloadPage)
  101. self._Screen.Draw()
  102. self._Screen.SwapAndShow()
  103. if self._URL != None and validators.url(self._URL):
  104. self._DownloadPage.StartDownload(self._URL, "/tmp")
  105. else:
  106. print "error url %s " % self._URL
  107. def OnReturnBackCb(self):
  108. self.ReturnToUpLevelPage()
  109. self._Screen.Draw()
  110. self._Screen.SwapAndShow()
  111. def Draw(self):
  112. self.ClearCanvas()
  113. self.DrawBG()
  114. for i in self._MyList:
  115. i.Draw()
  116. self.Reset()
  117. class InfoPageListItem(object):
  118. _PosX = 0
  119. _PosY = 0
  120. _Width = 0
  121. _Height = 30
  122. _Labels = {}
  123. _Icons = {}
  124. _Fonts = {}
  125. _LinkObj = None
  126. def __init__(self):
  127. self._Labels = {}
  128. self._Icons = {}
  129. self._Fonts = {}
  130. def SetSmallText(self,text):
  131. l = Label()
  132. l._PosX = 40
  133. l.SetCanvasHWND(self._Parent._CanvasHWND)
  134. l.Init(text,self._Fonts["small"])
  135. self._Labels["Small"] = l
  136. def Init(self,text):
  137. #self._Fonts["normal"] = fonts["veramono12"]
  138. l = Label()
  139. l._PosX = 10
  140. l.SetCanvasHWND(self._Parent._CanvasHWND)
  141. l.Init(text,self._Fonts["normal"])
  142. self._Labels["Text"] = l
  143. def Draw(self):
  144. self._Labels["Text"]._PosY = self._PosY + (self._Height - self._Labels["Text"]._Height)/2
  145. self._Labels["Text"].Draw()
  146. if "Small" in self._Labels:
  147. self._Labels["Small"]._PosX = self._Width - self._Labels["Small"]._Width-5
  148. self._Labels["Small"]._PosY = self._PosY + (self._Height - self._Labels["Small"]._Height)/2
  149. self._Labels["Small"].Draw()
  150. pygame.draw.line(self._Parent._CanvasHWND,(169,169,169),(self._PosX,self._PosY+self._Height-1),(self._PosX+self._Width,self._PosY+self._Height-1),1)
  151. class UpdatePage(Page):
  152. _Icons = {}
  153. _FootMsg = ["Nav.","Check Update","","Back",""]
  154. _ListFontObj = fonts["varela15"]
  155. _ConfirmPage = None
  156. _AList = {}
  157. _MyList = []
  158. def __init__(self):
  159. Page.__init__(self)
  160. self._Icons = {}
  161. def GenList(self):
  162. start_x = 0
  163. start_y = 0
  164. for i,v in enumerate( self._AList):
  165. li = InfoPageListItem()
  166. li._Parent = self
  167. li._PosX = start_x
  168. li._PosY = start_y + i*InfoPageListItem._Height
  169. li._Width = Width
  170. li._Fonts["normal"] = self._ListFontObj
  171. li._Fonts["small"] = fonts["varela12"]
  172. if self._AList[v]["label"] != "":
  173. li.Init( self._AList[v]["label"] )
  174. else:
  175. li.Init( self._AList[v]["key"] )
  176. li._Flag = self._AList[v]["key"]
  177. li.SetSmallText( self._AList[v]["value"] )
  178. self._MyList.append(li)
  179. def Init(self):
  180. self._CanvasHWND = self._Screen._CanvasHWND
  181. self._Width = self._Screen._Width
  182. self._Height = self._Screen._Height
  183. self._ConfirmPage = UpdateConfirmPage()
  184. self._ConfirmPage._Screen = self._Screen
  185. self._ConfirmPage._Name = "Update Confirm"
  186. self._ConfirmPage._Parent = self
  187. self._ConfirmPage.Init()
  188. it = {}
  189. it["key"] = "version"
  190. it["label"] = "Version"
  191. it["value"] = config.VERSION
  192. self._AList["version"] = it
  193. self.GenList()
  194. def CheckUpdate(self):
  195. self._Screen._MsgBox.SetText("Checking update...")
  196. self._Screen._MsgBox.Draw()
  197. self._Screen.SwapAndShow()
  198. try:
  199. r = requests.get(config.UPDATE_URL, verify=False, timeout=8)
  200. except:
  201. print("requests get error")
  202. return
  203. else:
  204. if r.status_code == requests.codes.ok:
  205. try:
  206. json_ = r.json()
  207. if "version" in json_ and "updatepath" in json_ and "md5sum" in json_:
  208. if config.VERSION != json_["version"]:
  209. self._ConfirmPage._URL = json_["updatepath"]
  210. self._ConfirmPage._MD5 = json_["md5sum"]
  211. self._ConfirmPage._GIT = False
  212. self._Screen.PushPage(self._ConfirmPage)
  213. self._Screen.Draw()
  214. self._ConfirmPage.SnapMsg("Confirm Update to %s ?" % json_["version"] )
  215. self._Screen.SwapAndShow()
  216. elif "gitversion" in json_: ### just use git to run update
  217. cur_dir = os.getcwd()
  218. os.chdir("/home/cpi/apps/launcher")
  219. current_git_version = get_git_revision_short_hash()
  220. current_git_version = current_git_version.strip("\n")
  221. current_git_version = current_git_version.strip("\t")
  222. os.chdir(cur_dir)
  223. if current_git_version != json_["gitversion"]:
  224. self._ConfirmPage._URL = None
  225. self._ConfirmPage._MD5 = None
  226. self._ConfirmPage._GIT = True
  227. self._ConfirmPage._Version = json_["gitversion"]
  228. self._Screen.PushPage(self._ConfirmPage)
  229. self._Screen.Draw()
  230. self._ConfirmPage.SnapMsg("Update to %s ?" % json_["gitversion"] )
  231. self._Screen.SwapAndShow()
  232. else:
  233. self._Screen.Draw()
  234. self._Screen._MsgBox.SetText("Launcher is up to date")
  235. self._Screen._MsgBox.Draw()
  236. self._Screen.SwapAndShow()
  237. pygame.time.delay(765)
  238. return True
  239. except Exception, e:
  240. print("r.json() error %s" % str(e))
  241. else:
  242. print(" requests get error %d ", r.status_code)
  243. return False
  244. def OnLoadCb(self):
  245. pass
  246. def KeyDown(self,event):
  247. if event.key == CurKeys["Menu"] or event.key == CurKeys["A"]:
  248. self.ReturnToUpLevelPage()
  249. self._Screen.Draw()
  250. self._Screen.SwapAndShow()
  251. if event.key == CurKeys["X"]:
  252. if is_wifi_connected_now():
  253. if self.CheckUpdate() == True:
  254. self._Screen.Draw()
  255. self._Screen.SwapAndShow()
  256. else:
  257. self._Screen.Draw()
  258. self._Screen._MsgBox.SetText("Checking update failed")
  259. self._Screen._MsgBox.Draw()
  260. self._Screen.SwapAndShow()
  261. else:
  262. self._Screen.Draw()
  263. self._Screen._MsgBox.SetText("Please Check your Wi-Fi connection")
  264. self._Screen._MsgBox.Draw()
  265. self._Screen.SwapAndShow()
  266. def Draw(self):
  267. self.ClearCanvas()
  268. # self._Ps.Draw()
  269. for i in self._MyList:
  270. i.Draw()
  271. class APIOBJ(object):
  272. _UpdatePage = None
  273. def __init__(self):
  274. pass
  275. def Init(self,main_screen):
  276. self._UpdatePage = UpdatePage()
  277. self._UpdatePage._Screen = main_screen
  278. self._UpdatePage._Name ="Update"
  279. self._UpdatePage.Init()
  280. def API(self,main_screen):
  281. if main_screen !=None:
  282. main_screen.PushPage(self._UpdatePage)
  283. main_screen.Draw()
  284. main_screen.SwapAndShow()
  285. OBJ = APIOBJ()
  286. def Init(main_screen):
  287. OBJ.Init(main_screen)
  288. def API(main_screen):
  289. OBJ.API(main_screen)