From b4d851baad0fd52b501e7b689ab6e7359c0f9943 Mon Sep 17 00:00:00 2001 From: Thomas Farstrike Date: Sat, 10 Jan 2026 19:00:14 +0100 Subject: [PATCH] AppStore app: use generic SettingActivity to configure backend --- CHANGELOG.md | 1 + .../assets/appstore.py | 87 +++++++------------ .../lib/mpos/ui/setting_activity.py | 10 ++- 3 files changed, 41 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8864785..24021c00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - Improve robustness with custom exception that does not deinit() the TaskHandler - Improve robustness by removing TaskHandler callback that throws an uncaught exception - Make "Power Off" button on desktop exit completely +- Promote SettingActivity from app to framework: now all apps can use it to easily build a setting screen 0.5.2 ===== diff --git a/internal_filesystem/builtin/apps/com.micropythonos.appstore/assets/appstore.py b/internal_filesystem/builtin/apps/com.micropythonos.appstore/assets/appstore.py index be74faa8..fa795ff7 100644 --- a/internal_filesystem/builtin/apps/com.micropythonos.appstore/assets/appstore.py +++ b/internal_filesystem/builtin/apps/com.micropythonos.appstore/assets/appstore.py @@ -6,7 +6,7 @@ import os from mpos.apps import Activity, Intent from mpos.app import App -from mpos import TaskManager, DownloadManager +from mpos import TaskManager, DownloadManager, SettingActivity import mpos.ui from mpos.content.package_manager import PackageManager from mpos.config import SharedPreferences @@ -28,7 +28,6 @@ class AppStore(Activity): apps = [] - _DEFAULT_BACKEND = 0 _ICON_SIZE = 64 # Hardcoded list for now: @@ -38,33 +37,33 @@ class AppStore(Activity): ("BadgeHub Prod", _BACKEND_API_BADGEHUB, _BADGEHUB_PROD_BASE_URL, _BADGEHUB_LIST, _BADGEHUB_DETAILS) ] + _DEFAULT_BACKEND = _BACKEND_API_GITHUB + "," + _GITHUB_PROD_BASE_URL + "/" + _GITHUB_LIST + @staticmethod - def get_backend_urls(index): + def get_backend_pref_string(index): backend_info = AppStore.backends[index] if backend_info: api = backend_info[1] base_url = backend_info[2] list_suffix = backend_info[3] details_suffix = backend_info[4] - if api == AppStore._BACKEND_API_GITHUB: - return (base_url + "/" + list_suffix, None) - else: - return (base_url + "/" + list_suffix, base_url + "/" + details_suffix) + toreturn = api + "," + base_url + "/" + list_suffix + if api == AppStore._BACKEND_API_BADGEHUB: + toreturn += "," + base_url + "/" + details_suffix + return toreturn @staticmethod - def get_backend_type(index): - backend_info = AppStore.backends[index] - if backend_info: - return backend_info[1] + def backend_pref_string_to_backend(string): + return string.split(",") - def get_backend_urls_from_settings(self): - return AppStore.get_backend_urls(self.prefs.get_int("backend", self._DEFAULT_BACKEND)) + def get_backend_type_from_settings(self): + return AppStore.backend_pref_string_to_backend(self.prefs.get_string("backend", self._DEFAULT_BACKEND))[0] def get_backend_list_url_from_settings(self): - return self.get_backend_urls_from_settings()[0] + return AppStore.backend_pref_string_to_backend(self.prefs.get_string("backend", self._DEFAULT_BACKEND))[1] def get_backend_details_url_from_settings(): - return self.get_backend_urls_from_settings()[1] + return AppStore.backend_pref_string_to_backend(self.prefs.get_string("backend", self._DEFAULT_BACKEND))[2] can_check_network = True prefs = None @@ -89,7 +88,6 @@ class AppStore(Activity): self.settings_button.set_size(settings_size, settings_size) self.settings_button.align(lv.ALIGN.TOP_RIGHT, -settings_margin, 10) self.settings_button.add_event_cb(self.settings_button_tap,lv.EVENT.CLICKED,None) - self.settings_button.add_flag(lv.obj.FLAG.HIDDEN) # hide because not functional for now settings_label = lv.label(self.settings_button) settings_label.set_text(lv.SYMBOL.SETTINGS) settings_label.set_style_text_font(lv.font_montserrat_24, 0) @@ -98,14 +96,10 @@ class AppStore(Activity): def onResume(self, screen): super().onResume(screen) - # This gets called at startup and also after closing AppStoreSettings - if len(self.apps): - return # already have the list (if refresh after settings is needed, finished_settings_callback will do it) - if self.prefs: # prefs is abused to distinguish between a fresh start and a return after AppStoreSettings - return # prefs is set so it's not a fresh start - it's a return after after AppStoreSettings - print("It's a fresh start; loading preferences and refreshing list...") - self.prefs = SharedPreferences(self.PACKAGE) - self.refresh_list() + if not self.prefs: + self.prefs = SharedPreferences(self.PACKAGE) + if not len(self.apps): + self.refresh_list() def refresh_list(self): try: @@ -119,20 +113,18 @@ class AppStore(Activity): TaskManager.create_task(self.download_app_index(self.get_backend_list_url_from_settings())) def settings_button_tap(self, event): - print("Settings button clicked") - # Handle traditional settings (existing code) - intent = Intent(activity_class=AppStoreSettings) + intent = Intent(activity_class=SettingActivity) intent.putExtra("prefs", self.prefs) - intent.putExtra("setting", {"title": "Backend", "key": "backend", "value_label": None, "cont": None, "ui": "radiobuttons", "ui_options": [(backend[0], None) for backend in AppStore.backends]},) - self.startActivityForResult(intent, self.finished_settings_callback) + intent.putExtra("setting", {"title": "AppStore Backend", + "key": "backend", + "ui": "radiobuttons", + "ui_options": [(backend[0], AppStore.get_backend_pref_string(index)) for index, backend in enumerate(AppStore.backends)], + "changed_callback": self.backend_changed}) + self.startActivity(intent) - def finished_settings_callback(self, result): - print(f"finished_settings_callback result: {result}") - if result.get("result_code") is True: - print("Settings updated, reloading app list...") - self.refresh_list() - else: - print("Settings not updated, nothing to do.") + def backend_changed(self, new_value): + print(f"backend changed to {new_value}, refreshing...") + self.refresh_list() async def download_app_index(self, json_url): try: @@ -147,10 +139,11 @@ class AppStore(Activity): print(f"Got response text: {response[0:20]}") try: parsed = json.loads(response) - print(f"parsed json: {parsed}") + #print(f"parsed json: {parsed}") + self.apps.clear() for app in parsed: try: - backend_type = AppStore.get_backend_type(self.prefs.get_int("backend", self._DEFAULT_BACKEND)) + backend_type = self.get_backend_type_from_settings() if backend_type == self._BACKEND_API_BADGEHUB: self.apps.append(AppStore.badgehub_app_to_mpos_app(app)) else: @@ -290,7 +283,7 @@ class AppStore(Activity): print(f"Got response text: {response[0:20]}") try: parsed = json.loads(response) - print(f"parsed json: {parsed}") + #print(f"parsed json: {parsed}") print("Using short_description as long_description because backend doesn't support it...") app_obj.long_description = app_obj.short_description print("Finding version number...") @@ -434,7 +427,7 @@ class AppDetail(Activity): self.setContentView(app_detail_screen) def onResume(self, screen): - backend_type = AppStore.get_backend_type(self.prefs.get_int("backend", self._DEFAULT_BACKEND)) + backend_type = self.get_backend_type_from_settings() if backend_type == self.appstore._BACKEND_API_BADGEHUB: TaskManager.create_task(self.fetch_and_set_app_details()) else: @@ -603,17 +596,3 @@ class AppDetail(Activity): self.progress_bar.set_value(0, False) self.set_install_label(app_fullname) self.install_button.remove_state(lv.STATE.DISABLED) - - -class AppStoreSettings(Activity): - prefs = None - - def onCreate(self): - self.prefs = self.getIntent().extras.get("prefs") - # Create main screen - screen = lv.obj() - screen.set_size(lv.pct(100), lv.pct(100)) - screen.set_style_pad_all(1, 0) - label = lv.label(screen) - label.set_text("AppStoreSettings should go here.") - self.setContentView(screen) diff --git a/internal_filesystem/lib/mpos/ui/setting_activity.py b/internal_filesystem/lib/mpos/ui/setting_activity.py index efdd7145..24406760 100644 --- a/internal_filesystem/lib/mpos/ui/setting_activity.py +++ b/internal_filesystem/lib/mpos/ui/setting_activity.py @@ -25,6 +25,7 @@ class SettingActivity(Activity): def onCreate(self): self.prefs = self.getIntent().extras.get("prefs") setting = self.getIntent().extras.get("setting") + print(setting) settings_screen_detail = lv.obj() settings_screen_detail.set_style_pad_all(mpos.ui.pct_of_display_width(2), 0) @@ -209,12 +210,15 @@ class SettingActivity(Activity): editor.commit() # Update model for UI - setting["value_label"].set_text(new_value if new_value else "(not set)") - self.finish() # the self.finish (= back action) should happen before callback, in case it happens to start a new activity + value_label = setting.get("value_label") + if value_label: + value_label.set_text(new_value if new_value else "(not set)") + + # self.finish (= back action) should happen before callback, in case it happens to start a new activity + self.finish() # Call changed_callback if set changed_callback = setting.get("changed_callback") - #print(f"changed_callback: {changed_callback}") if changed_callback and old_value != new_value: print(f"Setting {setting['key']} changed from {old_value} to {new_value}, calling changed_callback...") changed_callback(new_value)