Android
Triggers and Lifecycle
Passive trigger evaluation and voice session lifecycle
Runtime Core (SdkRuntime.kt)
Single internal orchestrator holding:
RuntimeContext,RuntimePolicyPassiveTracker,BackendClientAndroidUiBridge(current Activity, confirm dialog)
Trigger Evaluation Flow
Passive Evaluation
Scheduled when passiveEvalEnabled and interval > 0:
SDK Passive Loop
↓
Backend POST /v1/assistant/trigger/evaluate
↓
Returns: trigger (boolean), reason, action, intervention_mode
↓
SDK applies TriggerStartModeError-Driven Evaluation
Both trackError and trackValidationFailure call maybeEvaluateTriggerAfterError:
Error Reported
↓
Evaluate Trigger with signals
↓
If trigger allowed → Apply TriggerStartModeTriggerStartMode
| Mode | Behavior |
|---|---|
IMMEDIATE | Start assistant directly |
COOLDOWN | Wait minTriggerIntervalSeconds between prompts |
CONFIRM_UI | Show confirmation dialog with custom text |
Session Lifecycle
Start Flow
AI.startAssistant() OR Trigger decides to start
↓
Check RECORD_AUDIO permission
↓
POST /v1/assistant/session/start
↓
Backend creates LiveKit dispatch
↓
Returns: token, livekit_url, livekit_room
↓
VoiceSessionListener invoked
↓
App connects to LiveKit roomStop Flow
User ends call OR AI.stopAssistant()
↓
POST /v1/assistant/session/stop
↓
Backend emits reengagement activity
↓
Session resources cleaned upLifecycle and Passive Signals
When AI.attach is used:
onActivityResumed: binds current activity, observes screen, records interaction- PassiveTracker derives:
- Time on current "screen" (seconds)
- Idle seconds from last interaction
These feed into trigger signals when enabled in TriggerSettings.
Stability Rules
- Avoid duplicate trigger prompts after user dismissal
- Keep trigger suppression flags aligned between backend and SDK
- Dismissal resets passive tracker via
onInteraction()
Trigger Settings
Configure via TriggerSettings in RuntimePolicy:
| Signal | Default | Purpose |
|---|---|---|
includeErrorSignals | true | Error counts in trigger payload |
includeTimeSpentSignals | false | Seconds on screen |
includeIdleSignals | false | Seconds since last interaction |
includeStepHints | true | Current step context |
Backend Trigger Flags
trigger.v2_scoring— improved scoring algorithmtrigger.policy_engine— policy-based rulestrigger.intervention_modes— different UX modestrigger.experiments— A/B test support
Reengagement
When session stops, backend emits reengagement activity with:
recommended— whether to re-engagechannel— preferred channelreason— why reengagement is/isn't recommendedinactivity_seconds— time since last activity