Skip to content
Visor Developers

The connection

A Visor object is one connection to Visor. It follows Visor through restarts on its own, and tells you where it stands through state.

Connecting

val visor = Visor.connect(context)

connect binds to Visor's VDK service, says hello, and returns once Visor answered. It fails with a KitException:

Code Why
visor_missing Visor is not installed.
visor_too_old This Visor has no VDK service.

It suspends while Visor's process starts. To give up after a while, wrap it: withTimeout(10.seconds) { Visor.connect(context) }.

Keep one Visor for as long as you use the glasses, for example in a ViewModel or a service, and call close() when you are done. It uses the application context, so it holds no activity.

State

visor.state.collect { state ->
    when (state) {
        VisorState.Connecting -> ...       // binding again after Visor restarted
        is VisorState.Open -> ...          // state.welcome: Visor's version, its methods, your scopes
        is VisorState.Closed -> ...        // over for good; state.error says why, null when you closed it
    }
}
  • Connecting: Visor restarted, or was updated, and Android is bringing it back. Calls made now wait for it. Streams pick up again by themselves once it is back; events sent in between are lost.
  • Open: Visor answers. welcome lists the methods and topics this Visor has and the scopes your app holds.
  • Closed: you closed the connection, or Visor turned it away, for example because Visor was uninstalled. Connect again for a new one.

Calls and streams

Every call is a suspending function, safe from the main thread, and fails with a KitException. Cancelling the coroutine cancels the call in Visor too.

Every stream is a cold Flow: collecting it subscribes, and stopping the collection unsubscribes. Streams of state, like glasses.status, send the current value first. A stream ends with a KitException when Visor ends it, for example when a scope is taken back.

Versions

Visor and your app can be different ages. At hello, each side says which protocol version it speaks, and Visor lists what it answers. Ask before using something new:

if (visor.supports(Methods.DISPLAY_PROMPTER_SHOW)) { ... }

A call that the installed Visor does not have fails with visor_too_old before it is sent. See Compatibility.

Threads

The library runs nothing on the main thread. Answers from Visor arrive on binder threads and resume your coroutines in their own context.

On the wire: Link setup and AirShield and Identity and trust.