mirror of
https://github.com/XENOKING123/XenoSend.git
synced 2026-10-24 11:03:15 +02:00
107 lines
3.8 KiB
Python
107 lines
3.8 KiB
Python
import os
|
|
from pathlib import Path
|
|
|
|
from kivy.core.window import Window
|
|
from kivy.properties import ObjectProperty
|
|
from kivy.utils import platform
|
|
from kivymd.app import MDApp
|
|
|
|
from app import i18n
|
|
from app.app_meta import APP_NAME, APP_VERSION
|
|
from app.bootstrap.dependency_container import build_container
|
|
from app.ui.kv_loader import load_all_kv
|
|
from app.ui.main_screen import MainScreen
|
|
from app.ui.preferences import UiPreferences
|
|
from app.ui.theme import DEFAULT_THEME, PALETTES, ThemeManager
|
|
from app.ui.widgets.settings_modal import SettingsModal
|
|
|
|
|
|
class SendPkgPayloadApp(MDApp):
|
|
title = APP_NAME
|
|
app_version = APP_VERSION
|
|
|
|
# Exposed to KV: ``app.tr._("text")`` for strings, ``app.theme.<colour>`` for colours.
|
|
tr = ObjectProperty(None)
|
|
theme = ObjectProperty(None)
|
|
|
|
def build(self):
|
|
self.theme_cls.theme_style = "Dark"
|
|
self.theme_cls.primary_palette = "Orange"
|
|
|
|
self._preferences = UiPreferences(Path(self.user_data_dir))
|
|
self._settings_modal = None
|
|
self._init_language()
|
|
self._init_theme()
|
|
|
|
load_all_kv()
|
|
container = build_container(Path(self.user_data_dir))
|
|
return MainScreen(container=container)
|
|
|
|
# ----- language / theme -------------------------------------------------------------
|
|
def _init_language(self) -> None:
|
|
# Always start in English until the user picks a language from Settings and it gets
|
|
# saved. (Earlier builds followed the OS locale on first launch; that's gone now.)
|
|
saved = self._preferences.get("language")
|
|
code = saved if saved and i18n.is_supported(saved) else "en"
|
|
forced = os.environ.get("SENDPP_FORCE_LANG")
|
|
if forced and i18n.is_supported(forced):
|
|
code = forced
|
|
self.tr = i18n.get_translator()
|
|
i18n.set_language(code)
|
|
|
|
def _init_theme(self) -> None:
|
|
key = os.environ.get("SENDPP_FORCE_THEME") or self._preferences.get("theme") or DEFAULT_THEME
|
|
self.theme = ThemeManager(key if key in PALETTES else DEFAULT_THEME)
|
|
|
|
def set_language(self, code: str) -> bool:
|
|
"""Switch the interface language live and remember the choice."""
|
|
if not i18n.is_supported(code):
|
|
return False
|
|
font_changed = i18n.set_language(code)
|
|
self._preferences.save(language=code)
|
|
if font_changed:
|
|
i18n.fonts.refresh_text_widgets(Window)
|
|
return True
|
|
|
|
def set_theme(self, key: str) -> bool:
|
|
"""Switch the background theme live and remember the choice."""
|
|
if not self.theme.apply(key):
|
|
return False
|
|
self._preferences.save(theme=key)
|
|
return True
|
|
|
|
def open_settings(self) -> None:
|
|
modal = self._settings_modal
|
|
if modal is not None and modal._window is not None:
|
|
return
|
|
self._settings_modal = SettingsModal()
|
|
self._settings_modal.open()
|
|
|
|
# ----- lifecycle (unchanged from the original build) -----------------------------------
|
|
def on_resume(self):
|
|
root = self.root
|
|
|
|
if (
|
|
platform == "android"
|
|
and root is not None
|
|
and hasattr(root, "refresh_remote_checks_on_resume")
|
|
):
|
|
root.refresh_remote_checks_on_resume()
|
|
if root is not None and hasattr(root, "resume_pending_user_storage_menu"):
|
|
root.resume_pending_user_storage_menu()
|
|
if root is not None and hasattr(root, "resume_host_psm_session"):
|
|
root.resume_host_psm_session()
|
|
|
|
def on_pause(self):
|
|
if platform == "android":
|
|
return True
|
|
root = self.root
|
|
return bool(root is not None and getattr(root, "host_psm_running", False))
|
|
|
|
def on_stop(self):
|
|
root = self.root
|
|
if root is not None and hasattr(root, "handle_app_stop"):
|
|
root.handle_app_stop()
|
|
elif root is not None and hasattr(root, "shutdown"):
|
|
root.shutdown()
|