use super::*;
static LXAPPS_MANAGER: OnceLock<Arc<LxApps>> = OnceLock::new();
static RUNTIME: OnceLock<Arc<Platform>> = OnceLock::new();
pub(crate) fn set_runtime(runtime: Arc<Platform>) {
let _ = RUNTIME.set(runtime);
}
pub(crate) fn set_lxapps_manager(manager: Arc<LxApps>) -> Result<(), LxAppError> {
LXAPPS_MANAGER.set(manager).map_err(|_| {
LxAppError::Runtime(
"LxApps manager singleton had been initialized by another instance".to_string(),
)
})
}
pub(crate) fn get_lxapps_manager() -> Option<Arc<LxApps>> {
LXAPPS_MANAGER.get().cloned()
}
pub fn get_platform() -> Option<Arc<Platform>> {
RUNTIME
.get()
.cloned()
.or_else(|| LXAPPS_MANAGER.get().map(|manager| manager.runtime.clone()))
}
static DISPLAY_LANGUAGE: Mutex<Option<String>> = Mutex::new(None);
pub fn set_display_language(language: Option<String>) {
let normalized = language.filter(|value| !value.trim().is_empty());
*DISPLAY_LANGUAGE.lock().unwrap_or_else(|e| e.into_inner()) = normalized;
publish_display_language(&get_display_language());
}
fn publish_display_language(language: &str) {
let Some(manager) = get_lxapps_manager() else {
return;
};
let quoted = serde_json::to_string(language).unwrap_or_else(|_| "\"en-US\"".to_string());
let script = format!("var f = globalThis.__lingxiaApplyDisplayLanguage; if (f) f({quoted});");
use lingxia_webview::WebViewController;
let apps: Vec<(String, Arc<LxApp>)> = manager
.lxapps
.iter()
.map(|entry| (entry.key().clone(), entry.value().clone()))
.collect();
for (appid, app) in apps {
for page in app.live_page_instances() {
if let Some(webview) = page.webview() {
let _ = webview.exec_js(&script);
}
}
crate::appservice::event_bus::publish_app_event(
&appid,
crate::DISPLAY_LANGUAGE_CHANGE_EVENT,
Some(quoted.clone()),
);
}
}
pub fn get_display_language() -> String {
if let Some(language) = DISPLAY_LANGUAGE
.lock()
.unwrap_or_else(|e| e.into_inner())
.clone()
{
return language;
}
RUNTIME
.get()
.map(|runtime| runtime.get_system_locale().to_string())
.unwrap_or_else(|| "en-US".to_string())
}
pub fn try_get(appid: &str) -> Option<Arc<LxApp>> {
LXAPPS_MANAGER
.get()
.and_then(|manager| manager.lxapps.get(appid).map(|lxapp| lxapp.clone()))
}
pub fn find_page_by_instance_id(id: &str) -> Option<PageInstance> {
LXAPPS_MANAGER.get().and_then(|manager| {
manager
.lxapps
.iter()
.find_map(|entry| entry.value().get_page_by_instance_id_str(id))
})
}