|
Description: |
Overview
Build a locked-down Android kiosk app for the SUNMI K2 (24", 1080×1920 portrait). The app will pull content from our WooCommerce /kiosk endpoint, cache it for offline-first operation, and expose native capabilities—printer, QR/camera, USB vending controller—to the web UI via a secure JS bridge. Payments are handled via Revolut Terminal API (semi-integrated): app initiates transactions, terminal performs PCI-scoped card flow, app receives results.
Deliverables
Production-ready APK/AAB + full source code (Git repo).
JS bridge documentation + sample /kiosk bundle.
Config guide (WooCommerce endpoints/keys, Revolut Terminal setup, supported USB VID/PIDs).
Simple USB vending serial protocol spec + (nice-to-have) bench simulator.
Test plan/results (unit, instrumented, hardware-in-the-loop) and admin cheat sheet.
Scope & Requirements
Content & Offline
Fetch /kiosk HTML/JSON/assets from WooCommerce; verify signatures; local cache.
Start from cache; background delta updates (WorkManager).
Render via WebView (file://) with a minimal, audited JS↔Native bridge.
Payments — Revolut Terminal (semi-integrated)
App sends {amount, currency, orderId} to Revolut Terminal API/device.
Handle async result (approved/declined/cancelled), update UI, print receipt, update WooCommerce order.
Idempotent flow with retries; refund/void via PIN-protected admin.
Peripherals
Printer: SUNMI SDK / ESC/POS (receipts, admin prints).
QR/Barcode: CameraX + ZXing/ML Kit; expose decoded payload to WebView.
Vending: USB CDC/serial to control up to 12 slots; commands, timeouts, retries, job queue.
(Optional) NFC: Read ISO14443/NDEF tokens for loyalty/account lookup.
Kiosk & Resilience
LockTask (pinned app), immersive full-screen, auto-start on boot.
Watchdog to recover WebView/service on crash/hang.
Branded offline page and graceful error states.
Security/Privacy
TLS + cert pinning to our APIs; signed content manifests.
Admin menu with PIN; logs export with PII redaction; GDPR-aware.
Telemetry
Local event queue → batch upload (crashes, payment outcomes, dispense results, playback metrics).
Acceptance Criteria (must pass)
Boots straight into kiosk; recovers from kill/reboot in ~5s; no system chrome.
Offline-first after initial sync.
Full flow: Revolut card payment → vending dispense → receipt print → WooCommerce order update.
100 consecutive purchase cycles without ANR/crash on SUNMI K2.
Signed bundle verification enforced; admin features behind PIN.
Tech Preferences
Kotlin + Jetpack (ViewModel, WorkManager, Room).
Android WebView with shouldInterceptRequest asset interception; addJavascriptInterface for a minimal bridge.
CameraX + ZXing/ML Kit; SUNMI SDK for printer/scanner where applicable.
USB Host (CDC/FTDI), OkHttp3 with TLS pinning, Hilt DI.
Crash/metrics (Crashlytics/Sentry); ProGuard/R8.
What We Provide
WooCommerce /kiosk endpoint + adverts and signing keys.
Revolut merchant sandbox credentials and terminal.
Test hardware access or remote test windows.
API contracts and sample UI bundles.
Experience Needed
Android kiosk/terminal apps in production.
Revolut Terminal or similar semi-integrated card workflows.
USB serial on Android + ESC/POS printing.
WooCommerce/REST integrations.
Nice-to-Haves
Prior SUNMI K2 integrations.
Hardware-in-the-loop testing experience.
Content signing/manifest verification patterns.
Screening Questions (answer briefly)
Outline your semi-integrated Revolut Terminal flow (init → async status → idempotent order update → receipt).
How will you design a safe JS↔Native bridge so WebView stays sandboxed but can print/scan/dispense/pay?
Your retry/timeout strategy for DISPENSE and payment callbacks.
How do you keep kiosk mode after crashes/reboots and ensure quick recovery?
Your approach to content signing and preventing activation of tampered bundles.
Budget & Timeline
Fixed-price: £____ (please propose)
Timeline: ____ weeks (milestones welcome)
Legal
NDA and IP assignment required.
Must provide code in a private Git repo throughout the project. |