Skip to main content

Restriction states

Concrete Restriction Engine state model for v0.1 MVP. Policy lives in cabin-compliance (planned) — widgets query it; they do not embed OEM if/else trees. Broader context: compliance README, driving restrictions.

Vehicle UI states (MVP)

StateMeaningTypical signals (adapter-owned)
ParkedVehicle secured for configuration-heavy UIPark / gear P, speed ≈ 0
IdlingPowered, not in purposeful motion; still distraction-sensitiveGear not P or brake held; speed ≈ 0
MovingVehicle in motionSpeed above program threshold
RestrictedExplicit UX restriction profile active (distraction optimization)Mapped from CarUxRestrictions / OEM policy

Notes:

  • Adapters map Car APIs → these states; Cabin does not own vehicle services.
  • If state is unknown, fail per safety-critical (treat as Restricted for chrome configuration entry points unless product policy documents otherwise).
  • Programs may tighten (e.g. treat Idling as Restricted); they must not silently loosen safety-adjacent defaults.

Interaction categories (MVP)

CategoryExamples in chrome
GlanceStatus icons, clock, SOC glyph
NavigateSimpleHome / map entry that opens a driving-safe destination
OpenComplexAppApp grid, settings, pairing, deep setup
OpenKeyboardSearch fields requiring IME
FilterOrSortDense collection controls
MediaTransportPlay/pause peek (if slotted into system bar)
HvacPeekClimate shortcut (if slotted)
StatusDeepLinkTap status item → detail / settings

Allow matrix — System Bar & Status Bar

Legend: A = allow · S = substitute/disable (keep layout if possible) · B = block (no activation)

System Bar

InteractionParkedIdlingMovingRestricted
NavigateSimpleAAAA
MediaTransportAAAA
HvacPeekAAAA / S¹
OpenComplexAppASBB
OpenKeyboardABBB
FilterOrSortABBB

¹ Program may allow a limited HVAC peek (temp ± only) while Restricted; deep climate setup stays blocked.

Status Bar

InteractionParkedIdlingMovingRestricted
Glance (display only)AAAA
StatusDeepLink → informationalAASS
StatusDeepLink → settings / setupASBB
OpenKeyboard from statusABBB

Unavailable / stale / fault presentation is always required when signals are bad — that is display honesty, not an “interaction allow.”

Planned policy API sketch

// Planned — cabin-compliance
enum class CabinUiMode { Parked, Idling, Moving, Restricted, Unknown }

enum class CabinInteraction {
Glance,
NavigateSimple,
OpenComplexApp,
OpenKeyboard,
FilterOrSort,
MediaTransport,
HvacPeek,
StatusDeepLink,
}

interface CabinCompliance {
fun uiMode(state: VehicleUiState): CabinUiMode
fun allows(interaction: CabinInteraction, state: VehicleUiState): Boolean
fun disposition(interaction: CabinInteraction, state: VehicleUiState): GateDisposition
}

enum class GateDisposition { Allow, Substitute, Block }

Views (planned): CabinComplianceHost + gated click listeners on bar items. Compose (planned, post-MVP for chrome parity): LocalCabinCompliance.

MVP test fixtures

Minimum unit cases (testing.md):

  • Moving + OpenComplexApp → Block on System Bar
  • Restricted + OpenKeyboard → Block
  • Moving + NavigateSimple → Allow
  • Restricted + status settings deep link → Block
  • Unknown mode → Restricted-equivalent for complex entry (default)