101 lines
6.2 KiB
Python
101 lines
6.2 KiB
Python
from __future__ import annotations
|
||
|
||
import re
|
||
from typing import Any
|
||
|
||
|
||
def os_device(os_state: dict[str, Any] | None) -> dict[str, Any]:
|
||
os_state = os_state or {}
|
||
hardware = (os_state.get("hardware", {}) or {}) if isinstance(os_state, dict) else {}
|
||
settings = (os_state.get("settings", {}) or {}) if isinstance(os_state, dict) else {}
|
||
telephony = (os_state.get("telephony", {}) or {}) if isinstance(os_state, dict) else {}
|
||
global_settings = (settings.get("global", {}) or {}) if isinstance(settings, dict) else {}
|
||
system_settings = (settings.get("system", {}) or {}) if isinstance(settings, dict) else {}
|
||
wifi = (hardware.get("wifi", {}) or {}) if isinstance(hardware, dict) else {}
|
||
cellular = (hardware.get("cellular", {}) or {}) if isinstance(hardware, dict) else {}
|
||
bluetooth = (hardware.get("bluetooth", {}) or {}) if isinstance(hardware, dict) else {}
|
||
hotspot = (hardware.get("hotspot", {}) or {}) if isinstance(hardware, dict) else {}
|
||
return {
|
||
"deviceInfo": (os_state.get("build", {}) or {}) if isinstance(os_state, dict) else {},
|
||
"environment": {
|
||
"nearbyWifi": (hardware.get("nearbyWifi", []) or []) if isinstance(hardware, dict) else [],
|
||
"nearbyBluetooth": (hardware.get("nearbyBluetooth", []) or []) if isinstance(hardware, dict) else [],
|
||
},
|
||
"battery": (hardware.get("battery", {}) or {}) if isinstance(hardware, dict) else {},
|
||
"network": {
|
||
"sims": (telephony.get("sims", []) or []) if isinstance(telephony, dict) else [],
|
||
"defaultDataSim": telephony.get("defaultDataSim") if isinstance(telephony, dict) else None,
|
||
"wifiConnectedSsid": wifi.get("connectedSsid") if isinstance(wifi, dict) else None,
|
||
"wifiIpAddress": wifi.get("ipAddress") if isinstance(wifi, dict) else None,
|
||
"wifiMacAddress": wifi.get("macAddress") if isinstance(wifi, dict) else None,
|
||
"wifiLinkSpeed": wifi.get("linkSpeed") if isinstance(wifi, dict) else None,
|
||
"wifiFrequency": wifi.get("frequency") if isinstance(wifi, dict) else None,
|
||
"bluetoothName": bluetooth.get("name") if isinstance(bluetooth, dict) else None,
|
||
"hotspotEnabled": hotspot.get("enabled") if isinstance(hotspot, dict) else None,
|
||
"hotspotSsid": hotspot.get("ssid") if isinstance(hotspot, dict) else None,
|
||
"hotspotPassword": hotspot.get("password") if isinstance(hotspot, dict) else None,
|
||
"vpnEnabled": hardware.get("vpnEnabled") if isinstance(hardware, dict) else None,
|
||
"wifiEnabled": global_settings.get("wifiEnabled") if isinstance(global_settings, dict) else None,
|
||
"mobileDataEnabled": global_settings.get("mobileDataEnabled") if isinstance(global_settings, dict) else None,
|
||
"bluetoothEnabled": global_settings.get("bluetoothEnabled") if isinstance(global_settings, dict) else None,
|
||
"airplaneModeEnabled": global_settings.get("airplaneModeEnabled") if isinstance(global_settings, dict) else None,
|
||
"doNotDisturbEnabled": global_settings.get("doNotDisturbEnabled") if isinstance(global_settings, dict) else None,
|
||
"autoBrightnessEnabled": global_settings.get("autoBrightnessEnabled") if isinstance(global_settings, dict) else None,
|
||
"eyeComfortEnabled": global_settings.get("eyeComfortEnabled") if isinstance(global_settings, dict) else None,
|
||
"darkModeEnabled": global_settings.get("darkModeEnabled") if isinstance(global_settings, dict) else None,
|
||
"locationEnabled": global_settings.get("locationEnabled") if isinstance(global_settings, dict) else None,
|
||
"nfcEnabled": global_settings.get("nfcEnabled") if isinstance(global_settings, dict) else None,
|
||
"screenCastEnabled": global_settings.get("screenCastEnabled") if isinstance(global_settings, dict) else None,
|
||
"flashlightEnabled": global_settings.get("flashlightEnabled") if isinstance(global_settings, dict) else None,
|
||
"batterySaverEnabled": global_settings.get("batterySaverEnabled") if isinstance(global_settings, dict) else None,
|
||
"rotationLocked": global_settings.get("rotationLocked") if isinstance(global_settings, dict) else None,
|
||
"wifiSignalLevel": wifi.get("level") if isinstance(wifi, dict) else None,
|
||
"signalLevel": cellular.get("signalLevel") if isinstance(cellular, dict) else None,
|
||
"mobileDataType": cellular.get("mobileDataType") if isinstance(cellular, dict) else None,
|
||
"noSim": cellular.get("noSim") if isinstance(cellular, dict) else None,
|
||
},
|
||
"settings": {
|
||
**(system_settings if isinstance(system_settings, dict) else {}),
|
||
"preferences": (os_state.get("preferences", {}) or {}) if isinstance(os_state, dict) else {},
|
||
},
|
||
}
|
||
|
||
|
||
def os_prefs(os_state: dict[str, Any] | None) -> dict[str, Any]:
|
||
return (os_state or {}).get("preferences", {}) or {}
|
||
|
||
|
||
def os_qs(os_state: dict[str, Any] | None) -> dict[str, Any]:
|
||
settings = (os_state or {}).get("settings", {}) or {}
|
||
return (settings.get("global", {}) or {}) if isinstance(settings, dict) else {}
|
||
|
||
|
||
def parse_csv_items(value: Any) -> list[str]:
|
||
if isinstance(value, (list, tuple)):
|
||
return [str(item).strip() for item in value if str(item).strip()]
|
||
parts = re.split(r"[,\s,;;]+", str(value or "").strip())
|
||
return [part.strip() for part in parts if part.strip()]
|
||
|
||
|
||
def normalize_locale(value: Any) -> str:
|
||
text = str(value or "").strip().lower()
|
||
if text in {"en", "english", "英文"} or text.startswith("en-") or text.startswith("en_"):
|
||
return "en"
|
||
return "zh-Hans"
|
||
|
||
|
||
def theme_to_dark(value: Any) -> bool:
|
||
text = str(value or "").strip().lower()
|
||
if text in {"dark", "darkmode", "dark_mode", "深色", "暗色", "夜间", "night"}:
|
||
return True
|
||
if text in {"light", "浅色", "日间"}:
|
||
return False
|
||
return bool(value) if isinstance(value, bool) else False
|
||
|
||
|
||
def os_device_id(os_state: dict[str, Any] | None) -> str:
|
||
build = ((os_state or {}).get("build", {}) or {}) if isinstance(os_state, dict) else {}
|
||
model = str((build or {}).get("model") or "").strip()
|
||
market = str((build or {}).get("marketName") or "").strip()
|
||
return model or market or "device"
|