__init__.py 11 KB

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