@@ -24,6 +24,36 @@ class AppDetail(Activity):
2424 app = None
2525 appstore = None
2626
27+ @staticmethod
28+ def _apply_default_styles (widget , border = 0 , radius = 0 , pad = 0 ):
29+ """Apply common default styles to reduce repetition"""
30+ widget .set_style_border_width (border , 0 )
31+ widget .set_style_radius (radius , 0 )
32+ widget .set_style_pad_all (pad , 0 )
33+
34+ def _cleanup_temp_file (self , path = "tmp/temp.mpk" ):
35+ """Safely remove temporary file"""
36+ try :
37+ os .remove (path )
38+ except Exception :
39+ pass
40+
41+ async def _update_progress (self , value , wait = True ):
42+ """Update progress bar with optional wait"""
43+ self .progress_bar .set_value (value , wait )
44+ if wait :
45+ await TaskManager .sleep (1 )
46+
47+ def _show_progress_bar (self ):
48+ """Show progress bar and reset to 0"""
49+ self .progress_bar .remove_flag (lv .obj .FLAG .HIDDEN )
50+ self .progress_bar .set_value (0 , False )
51+
52+ def _hide_progress_bar (self ):
53+ """Hide progress bar and reset to 0"""
54+ self .progress_bar .set_value (0 , False )
55+ self .progress_bar .add_flag (lv .obj .FLAG .HIDDEN )
56+
2757 def onCreate (self ):
2858 print ("Creating app detail screen..." )
2959 self .app = self .getIntent ().extras .get ("app" )
@@ -35,8 +65,7 @@ def onCreate(self):
3565 app_detail_screen .set_flex_flow (lv .FLEX_FLOW .COLUMN )
3666
3767 headercont = lv .obj (app_detail_screen )
38- headercont .set_style_border_width (0 , 0 )
39- headercont .set_style_pad_all (0 , 0 )
68+ self ._apply_default_styles (headercont )
4069 headercont .set_flex_flow (lv .FLEX_FLOW .ROW )
4170 headercont .set_size (lv .pct (100 ), lv .SIZE_CONTENT )
4271 headercont .set_scrollbar_mode (lv .SCROLLBAR_MODE .OFF )
@@ -51,9 +80,7 @@ def onCreate(self):
5180 else :
5281 icon_spacer .set_src (lv .SYMBOL .IMAGE )
5382 detail_cont = lv .obj (headercont )
54- detail_cont .set_style_border_width (0 , 0 )
55- detail_cont .set_style_radius (0 , 0 )
56- detail_cont .set_style_pad_all (0 , 0 )
83+ self ._apply_default_styles (detail_cont )
5784 detail_cont .set_flex_flow (lv .FLEX_FLOW .COLUMN )
5885 detail_cont .set_size (lv .pct (75 ), lv .SIZE_CONTENT )
5986 detail_cont .set_scrollbar_mode (lv .SCROLLBAR_MODE .OFF )
@@ -73,9 +100,7 @@ def onCreate(self):
73100 self .progress_bar .add_flag (lv .obj .FLAG .HIDDEN )
74101 # Always have this button:
75102 self .buttoncont = lv .obj (app_detail_screen )
76- self .buttoncont .set_style_border_width (0 , 0 )
77- self .buttoncont .set_style_radius (0 , 0 )
78- self .buttoncont .set_style_pad_all (0 , 0 )
103+ self ._apply_default_styles (self .buttoncont )
79104 self .buttoncont .set_flex_flow (lv .FLEX_FLOW .ROW )
80105 self .buttoncont .set_size (lv .pct (100 ), lv .SIZE_CONTENT )
81106 self .buttoncont .set_scrollbar_mode (lv .SCROLLBAR_MODE .OFF )
@@ -127,7 +152,7 @@ def add_action_buttons(self, buttoncont, app):
127152 update_label .center ()
128153
129154 async def fetch_and_set_app_details (self ):
130- await self .appstore . fetch_badgehub_app_details (self .app )
155+ await self .fetch_badgehub_app_details (self .app )
131156 print (f"app has version: { self .app .version } " )
132157 self .version_label .set_text (self .app .version )
133158 self .long_desc_label .set_text (self .app .long_description )
@@ -185,16 +210,12 @@ def update_button_click(self, app_obj):
185210 async def uninstall_app (self , app_fullname ):
186211 self .install_button .add_state (lv .STATE .DISABLED )
187212 self .install_label .set_text ("Please wait..." )
188- self .progress_bar .remove_flag (lv .obj .FLAG .HIDDEN )
189- self .progress_bar .set_value (21 , True )
190- await TaskManager .sleep (1 ) # seems silly but otherwise it goes so quickly that the user can't tell something happened and gets confused
191- self .progress_bar .set_value (42 , True )
192- await TaskManager .sleep (1 ) # seems silly but otherwise it goes so quickly that the user can't tell something happened and gets confused
213+ self ._show_progress_bar ()
214+ await self ._update_progress (21 )
215+ await self ._update_progress (42 )
193216 PackageManager .uninstall_app (app_fullname )
194- await TaskManager .sleep (1 ) # seems silly but otherwise it goes so quickly that the user can't tell something happened and gets confused
195- self .progress_bar .set_value (100 , False )
196- self .progress_bar .add_flag (lv .obj .FLAG .HIDDEN )
197- self .progress_bar .set_value (0 , False )
217+ await self ._update_progress (100 , wait = False )
218+ self ._hide_progress_bar ()
198219 self .set_install_label (app_fullname )
199220 self .install_button .remove_state (lv .STATE .DISABLED )
200221 if PackageManager .is_builtin_app (app_fullname ):
@@ -214,25 +235,18 @@ async def pcb(self, percent):
214235 async def download_and_install (self , app_obj , dest_folder ):
215236 zip_url = app_obj .download_url
216237 app_fullname = app_obj .fullname
217- download_url_size = None
218- if hasattr (app_obj , "download_url_size" ):
219- download_url_size = app_obj .download_url_size
238+ download_url_size = getattr (app_obj , "download_url_size" , None )
239+ temp_zip_path = "tmp/temp.mpk"
220240 self .install_button .add_state (lv .STATE .DISABLED )
221241 self .install_label .set_text ("Please wait..." )
222- self .progress_bar .remove_flag (lv .obj .FLAG .HIDDEN )
223- self .progress_bar .set_value (5 , True )
224- await TaskManager .sleep (1 ) # seems silly but otherwise it goes so quickly that the user can't tell something happened and gets confused
242+ self ._show_progress_bar ()
243+ await self ._update_progress (5 )
225244 # Download the .mpk file to temporary location
226- try :
227- # Make sure there's no leftover file filling the storage
228- os .remove (temp_zip_path )
229- except Exception :
230- pass
245+ self ._cleanup_temp_file (temp_zip_path )
231246 try :
232247 os .mkdir ("tmp" )
233248 except Exception :
234249 pass
235- temp_zip_path = "tmp/temp.mpk"
236250 print (f"Downloading .mpk file from: { zip_url } to { temp_zip_path } " )
237251 try :
238252 result = await DownloadManager .download_url (zip_url , outfile = temp_zip_path , total_size = download_url_size , progress_callback = self .pcb )
@@ -242,31 +256,78 @@ async def download_and_install(self, app_obj, dest_folder):
242256 print ("Downloaded .mpk file, size:" , os .stat (temp_zip_path )[6 ], "bytes" )
243257 # Install it:
244258 PackageManager .install_mpk (temp_zip_path , dest_folder ) # 60 until 90 percent is the unzip but no progress there...
245- self .progress_bar . set_value (90 , True )
259+ await self ._update_progress (90 , wait = False )
246260 except Exception as e :
247261 print (f"Download failed with exception: { e } " )
248262 if DownloadManager .is_network_error (e ):
249263 self .install_label .set_text (f"Network error - check WiFi" )
250264 else :
251265 self .install_label .set_text (f"Download failed: { str (e )[:30 ]} " )
252266 self .install_button .remove_state (lv .STATE .DISABLED )
253- self .progress_bar .add_flag (lv .obj .FLAG .HIDDEN )
254- self .progress_bar .set_value (0 , False )
255- # Make sure there's no leftover file filling the storage:
256- try :
257- os .remove (temp_zip_path )
258- except Exception :
259- pass
267+ self ._hide_progress_bar ()
268+ self ._cleanup_temp_file (temp_zip_path )
260269 return
261270 # Make sure there's no leftover file filling the storage:
262- try :
263- os .remove (temp_zip_path )
264- except Exception :
265- pass
271+ self ._cleanup_temp_file (temp_zip_path )
266272 # Success:
267- await TaskManager .sleep (1 ) # seems silly but otherwise it goes so quickly that the user can't tell something happened and gets confused
268- self .progress_bar .set_value (100 , False )
269- self .progress_bar .add_flag (lv .obj .FLAG .HIDDEN )
270- self .progress_bar .set_value (0 , False )
273+ await self ._update_progress (100 , wait = False )
274+ self ._hide_progress_bar ()
271275 self .set_install_label (app_fullname )
272276 self .install_button .remove_state (lv .STATE .DISABLED )
277+
278+ async def fetch_badgehub_app_details (self , app_obj ):
279+ details_url = self .get_backend_details_url_from_settings () + "/" + app_obj .fullname
280+ try :
281+ response = await DownloadManager .download_url (details_url )
282+ except Exception as e :
283+ print (f"Could not download app details from { details_url } : { e } " )
284+ if DownloadManager .is_network_error (e ):
285+ print ("Network error while fetching app details" )
286+ return
287+ print (f"Got response text: { response [0 :20 ]} " )
288+ try :
289+ parsed = json .loads (response )
290+ #print(f"parsed json: {parsed}")
291+ print ("Using short_description as long_description because backend doesn't support it..." )
292+ app_obj .long_description = app_obj .short_description
293+ print ("Finding version number..." )
294+ try :
295+ version = parsed .get ("version" )
296+ except Exception as e :
297+ print (f"Could not get version object from appdetails: { e } " )
298+ return
299+ print (f"got version object: { version } " )
300+ # Find .mpk download URL:
301+ try :
302+ files = version .get ("files" )
303+ for file in files :
304+ print (f"parsing file: { file } " )
305+ ext = file .get ("ext" ).lower ()
306+ print (f"file has extension: { ext } " )
307+ if ext == ".mpk" :
308+ app_obj .download_url = file .get ("url" )
309+ app_obj .download_url_size = file .get ("size_of_content" )
310+ break # only one .mpk per app is supported
311+ except Exception as e :
312+ print (f"Could not get files from version: { e } " )
313+ try :
314+ app_metadata = version .get ("app_metadata" )
315+ except Exception as e :
316+ print (f"Could not get app_metadata object from version object: { e } " )
317+ return
318+ try :
319+ app_obj .publisher = app_metadata .get ("author" )
320+ except Exception as e :
321+ print (f"Could not get author from version object: { e } " )
322+ try :
323+ app_version = app_metadata .get ("version" )
324+ print (f"what: { version .get ('app_metadata' )} " )
325+ print (f"app has app_version: { app_version } " )
326+ app_obj .version = app_version
327+ except Exception as e :
328+ print (f"Could not get version from app_metadata: { e } " )
329+ except Exception as e :
330+ err = f"ERROR: could not parse app details JSON: { e } "
331+ print (err )
332+ self .please_wait_label .set_text (err )
333+ return
0 commit comments