class AdaptiveApp extends AppServer {
protected async onSession(session: AppSession, sessionId: string, userId: string): Promise<void> {
const caps = session.capabilities
if (!caps) {
session.layouts.showTextWall("Loading device information...")
return
}
// Create a feature matrix based on available capabilities
const features = this.getAvailableFeatures(caps)
// Show welcome message with available features
const featureList = features.join("\n• ")
session.layouts.showReferenceCard(`Welcome to ${caps.modelName}`, `Available features:\n• ${featureList}`)
// Set up event subscriptions based on capabilities
this.setupEventSubscriptions(session, caps)
}
private getAvailableFeatures(caps: Capabilities): string[] {
const features: string[] = []
if (caps.hasCamera) {
features.push("📷 Photo capture")
if (caps.camera?.video.canStream) {
features.push("📡 Live streaming")
}
}
if (caps.hasMicrophone) {
features.push("🎤 Voice commands")
features.push("📝 Speech transcription")
}
if (caps.hasDisplay) {
features.push("📱 Visual interface")
if (caps.display?.canDisplayBitmap) {
features.push("🖼️ Image display")
}
}
if (caps.hasButton) {
features.push("🔘 Hardware controls")
}
if (caps.hasWifi) {
features.push("🌐 Internet connectivity")
}
return features
}
private setupEventSubscriptions(session: AppSession, caps: Capabilities): void {
// Only subscribe to events for available hardware
if (caps.hasMicrophone) {
session.events.onTranscription(data => {
// Handle voice input
})
}
if (caps.hasButton) {
session.events.onButtonPress(data => {
// Handle button input
})
}
if (caps.hasIMU) {
session.events.onHeadPosition(data => {
// Handle head movement
})
}
}
}