feat(android): bundle.android config + frontend isAndroid/isMobile helpers
Two small Phase 1 follow-ups for the Android target: 1. tauri.conf.json: add `bundle.android.minSdkVersion: 24`. Android 7.0 is the floor — gives us Vulkan availability (for the eventual GPU feature flag), AAudio for cpal, and is what Pixel-class hardware tests against. Keeps the global `identifier` on `uk.co.corbel.kon` for now; the Corbie rebrand sweep will land `corbel.technology.corbie` as a single coherent commit. 2. src/lib/utils/runtime.ts: add `isAndroid()` and `isMobile()` helpers alongside the existing `hasTauriRuntime()`. Both use UA sniffing — sufficient for feature-gating UI, never for security decisions. These are how the Svelte side will hide: - hotkey config (no global hotkey API on Android) - paste-mode picker (auto-paste maps to a copy-only flow) - meeting auto-capture toggle (process list unavailable) - multi-window buttons (open-viewer, open-float, etc.) - system-tray-related affordances Tauri 2 doesn't expose a synchronous platform-detection helper that works during initial render, so UA sniffing is the pragmatic choice. https://claude.ai/code/session_0189xUb6ie6t9qHkzatGZ9Rb
This commit is contained in:
@@ -35,6 +35,9 @@
|
|||||||
"icons/128x128@2x.png",
|
"icons/128x128@2x.png",
|
||||||
"icons/icon.icns",
|
"icons/icon.icns",
|
||||||
"icons/icon.ico"
|
"icons/icon.ico"
|
||||||
]
|
],
|
||||||
|
"android": {
|
||||||
|
"minSdkVersion": 24
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,3 +16,30 @@ export function hasTauriRuntime() {
|
|||||||
if (window.isTauri === true) return true;
|
if (window.isTauri === true) return true;
|
||||||
return false;
|
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);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user