__init__.py 12 KB

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