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:
Claude
2026-04-25 12:50:46 +00:00
parent 4abc2356c2
commit 17f4dff791
2 changed files with 31 additions and 1 deletions

View File

@@ -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
}
} }
} }

View File

@@ -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);
}