diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 21cd5cb..d3ffd7a 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -35,6 +35,9 @@ "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico" - ] + ], + "android": { + "minSdkVersion": 24 + } } } diff --git a/src/lib/utils/runtime.ts b/src/lib/utils/runtime.ts index 3845b71..2773f3a 100644 --- a/src/lib/utils/runtime.ts +++ b/src/lib/utils/runtime.ts @@ -16,3 +16,30 @@ export function hasTauriRuntime() { if (window.isTauri === true) return true; return false; } + +// Coarse-grained mobile / Android detection. Used by the Svelte UI to +// hide features that depend on desktop-only Tauri commands (multi-window, +// global hotkeys, auto-paste, meeting auto-capture, system tray) so an +// Android build's frontend renders only the surfaces that actually work. +// +// `isMobile()` is the broader check (covers iOS and Android) and falls +// back on the user-agent for non-Tauri previews. `isAndroid()` is the +// targeted check used where the platform genuinely matters (e.g. +// foreground-notification record button vs global hotkey). +// +// Tauri 2 doesn't expose a synchronous platform-detection helper that +// works during the initial Svelte render, so we rely on user-agent +// sniffing — fine for feature-gating UI, never for security decisions. + +const ANDROID_UA_RE = /android/i; +const MOBILE_UA_RE = /android|iphone|ipad|ipod|mobile/i; + +export function isAndroid(): boolean { + if (typeof navigator === "undefined") return false; + return ANDROID_UA_RE.test(navigator.userAgent); +} + +export function isMobile(): boolean { + if (typeof navigator === "undefined") return false; + return MOBILE_UA_RE.test(navigator.userAgent); +}