@mentra/engine 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -0
- package/build/devtools.d.ts +11 -0
- package/build/devtools.d.ts.map +1 -0
- package/build/devtools.js +13 -0
- package/build/devtools.js.map +1 -0
- package/build/engine.d.ts +261 -0
- package/build/engine.d.ts.map +1 -0
- package/build/engine.js +170 -0
- package/build/engine.js.map +1 -0
- package/build/facades/dev.d.ts +58 -0
- package/build/facades/dev.d.ts.map +1 -0
- package/build/facades/dev.js +189 -0
- package/build/facades/dev.js.map +1 -0
- package/build/facades/display.d.ts +21 -0
- package/build/facades/display.d.ts.map +1 -0
- package/build/facades/display.js +17 -0
- package/build/facades/display.js.map +1 -0
- package/build/facades/displayMirror.d.ts +15 -0
- package/build/facades/displayMirror.d.ts.map +1 -0
- package/build/facades/displayMirror.js +29 -0
- package/build/facades/displayMirror.js.map +1 -0
- package/build/facades/gallery.d.ts +62 -0
- package/build/facades/gallery.d.ts.map +1 -0
- package/build/facades/gallery.js +61 -0
- package/build/facades/gallery.js.map +1 -0
- package/build/facades/glasses.d.ts +141 -0
- package/build/facades/glasses.d.ts.map +1 -0
- package/build/facades/glasses.js +199 -0
- package/build/facades/glasses.js.map +1 -0
- package/build/facades/glassesSettings.d.ts +13 -0
- package/build/facades/glassesSettings.d.ts.map +1 -0
- package/build/facades/glassesSettings.js +54 -0
- package/build/facades/glassesSettings.js.map +1 -0
- package/build/facades/glassesWifi.d.ts +25 -0
- package/build/facades/glassesWifi.d.ts.map +1 -0
- package/build/facades/glassesWifi.js +57 -0
- package/build/facades/glassesWifi.js.map +1 -0
- package/build/facades/miniapps.d.ts +43 -0
- package/build/facades/miniapps.d.ts.map +1 -0
- package/build/facades/miniapps.js +49 -0
- package/build/facades/miniapps.js.map +1 -0
- package/build/facades/notifications.d.ts +13 -0
- package/build/facades/notifications.d.ts.map +1 -0
- package/build/facades/notifications.js +12 -0
- package/build/facades/notifications.js.map +1 -0
- package/build/facades/ota.d.ts +103 -0
- package/build/facades/ota.d.ts.map +1 -0
- package/build/facades/ota.js +156 -0
- package/build/facades/ota.js.map +1 -0
- package/build/facades/pairing.d.ts +114 -0
- package/build/facades/pairing.d.ts.map +1 -0
- package/build/facades/pairing.js +275 -0
- package/build/facades/pairing.js.map +1 -0
- package/build/facades/permissions.d.ts +33 -0
- package/build/facades/permissions.d.ts.map +1 -0
- package/build/facades/permissions.js +155 -0
- package/build/facades/permissions.js.map +1 -0
- package/build/facades/phoneNotifications.d.ts +21 -0
- package/build/facades/phoneNotifications.d.ts.map +1 -0
- package/build/facades/phoneNotifications.js +51 -0
- package/build/facades/phoneNotifications.js.map +1 -0
- package/build/facades/reports.d.ts +36 -0
- package/build/facades/reports.d.ts.map +1 -0
- package/build/facades/reports.js +134 -0
- package/build/facades/reports.js.map +1 -0
- package/build/facades/session.d.ts +21 -0
- package/build/facades/session.d.ts.map +1 -0
- package/build/facades/session.js +52 -0
- package/build/facades/session.js.map +1 -0
- package/build/facades/settings.d.ts +37 -0
- package/build/facades/settings.d.ts.map +1 -0
- package/build/facades/settings.js +55 -0
- package/build/facades/settings.js.map +1 -0
- package/build/facades/speech.d.ts +30 -0
- package/build/facades/speech.d.ts.map +1 -0
- package/build/facades/speech.js +37 -0
- package/build/facades/speech.js.map +1 -0
- package/build/index.d.ts +43 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +45 -0
- package/build/index.js.map +1 -0
- package/build/internal.d.ts +67 -0
- package/build/internal.d.ts.map +1 -0
- package/build/internal.js +90 -0
- package/build/internal.js.map +1 -0
- package/build/runtime/bootstrap.d.ts +83 -0
- package/build/runtime/bootstrap.d.ts.map +1 -0
- package/build/runtime/bootstrap.js +56 -0
- package/build/runtime/bootstrap.js.map +1 -0
- package/build/runtime/config.d.ts +146 -0
- package/build/runtime/config.d.ts.map +1 -0
- package/build/runtime/config.js +18 -0
- package/build/runtime/config.js.map +1 -0
- package/build/runtime/streamConfig.d.ts +4 -0
- package/build/runtime/streamConfig.d.ts.map +1 -0
- package/build/runtime/streamConfig.js +38 -0
- package/build/runtime/streamConfig.js.map +1 -0
- package/build/services/AppRegistry.d.ts +269 -0
- package/build/services/AppRegistry.d.ts.map +1 -0
- package/build/services/AppRegistry.js +1079 -0
- package/build/services/AppRegistry.js.map +1 -0
- package/build/services/AudioCloudUplink.d.ts +9 -0
- package/build/services/AudioCloudUplink.d.ts.map +1 -0
- package/build/services/AudioCloudUplink.js +48 -0
- package/build/services/AudioCloudUplink.js.map +1 -0
- package/build/services/AudioPlaybackService.d.ts +175 -0
- package/build/services/AudioPlaybackService.d.ts.map +1 -0
- package/build/services/AudioPlaybackService.js +705 -0
- package/build/services/AudioPlaybackService.js.map +1 -0
- package/build/services/AutomaticReportResult.d.ts +20 -0
- package/build/services/AutomaticReportResult.d.ts.map +1 -0
- package/build/services/AutomaticReportResult.js +29 -0
- package/build/services/AutomaticReportResult.js.map +1 -0
- package/build/services/BlobStore.d.ts +91 -0
- package/build/services/BlobStore.d.ts.map +1 -0
- package/build/services/BlobStore.js +668 -0
- package/build/services/BlobStore.js.map +1 -0
- package/build/services/CaptionsTesterReportService.d.ts +4 -0
- package/build/services/CaptionsTesterReportService.d.ts.map +1 -0
- package/build/services/CaptionsTesterReportService.js +80 -0
- package/build/services/CaptionsTesterReportService.js.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts +24 -0
- package/build/services/CloudAudioSubscriptionSync.d.ts.map +1 -0
- package/build/services/CloudAudioSubscriptionSync.js +39 -0
- package/build/services/CloudAudioSubscriptionSync.js.map +1 -0
- package/build/services/CloudClientService.d.ts +143 -0
- package/build/services/CloudClientService.d.ts.map +1 -0
- package/build/services/CloudClientService.js +644 -0
- package/build/services/CloudClientService.js.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts +4 -0
- package/build/services/CloudTranscriptE2EMetrics.d.ts.map +1 -0
- package/build/services/CloudTranscriptE2EMetrics.js +24 -0
- package/build/services/CloudTranscriptE2EMetrics.js.map +1 -0
- package/build/services/ConnectionCoordinator.d.ts +51 -0
- package/build/services/ConnectionCoordinator.d.ts.map +1 -0
- package/build/services/ConnectionCoordinator.js +34 -0
- package/build/services/ConnectionCoordinator.js.map +1 -0
- package/build/services/DevServerBridge.d.ts +63 -0
- package/build/services/DevServerBridge.d.ts.map +1 -0
- package/build/services/DevServerBridge.js +294 -0
- package/build/services/DevServerBridge.js.map +1 -0
- package/build/services/DeviceEventRouter.d.ts +3 -0
- package/build/services/DeviceEventRouter.d.ts.map +1 -0
- package/build/services/DeviceEventRouter.js +190 -0
- package/build/services/DeviceEventRouter.js.map +1 -0
- package/build/services/DeviceStoreHydration.d.ts +38 -0
- package/build/services/DeviceStoreHydration.d.ts.map +1 -0
- package/build/services/DeviceStoreHydration.js +124 -0
- package/build/services/DeviceStoreHydration.js.map +1 -0
- package/build/services/DisplayProcessor.d.ts +223 -0
- package/build/services/DisplayProcessor.d.ts.map +1 -0
- package/build/services/DisplayProcessor.js +552 -0
- package/build/services/DisplayProcessor.js.map +1 -0
- package/build/services/GlassesReadiness.d.ts +41 -0
- package/build/services/GlassesReadiness.d.ts.map +1 -0
- package/build/services/GlassesReadiness.js +82 -0
- package/build/services/GlassesReadiness.js.map +1 -0
- package/build/services/GlassesSettingsSync.d.ts +33 -0
- package/build/services/GlassesSettingsSync.d.ts.map +1 -0
- package/build/services/GlassesSettingsSync.js +121 -0
- package/build/services/GlassesSettingsSync.js.map +1 -0
- package/build/services/GlassesStatusProjection.d.ts +3 -0
- package/build/services/GlassesStatusProjection.d.ts.map +1 -0
- package/build/services/GlassesStatusProjection.js +65 -0
- package/build/services/GlassesStatusProjection.js.map +1 -0
- package/build/services/HeadingService.d.ts +27 -0
- package/build/services/HeadingService.d.ts.map +1 -0
- package/build/services/HeadingService.js +96 -0
- package/build/services/HeadingService.js.map +1 -0
- package/build/services/LocalDisplayManager.d.ts +139 -0
- package/build/services/LocalDisplayManager.d.ts.map +1 -0
- package/build/services/LocalDisplayManager.js +579 -0
- package/build/services/LocalDisplayManager.js.map +1 -0
- package/build/services/LocalMiniappRuntime.d.ts +439 -0
- package/build/services/LocalMiniappRuntime.d.ts.map +1 -0
- package/build/services/LocalMiniappRuntime.js +3695 -0
- package/build/services/LocalMiniappRuntime.js.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts +57 -0
- package/build/services/LocalSttFallbackCoordinator.d.ts.map +1 -0
- package/build/services/LocalSttFallbackCoordinator.js +137 -0
- package/build/services/LocalSttFallbackCoordinator.js.map +1 -0
- package/build/services/MentraJSCrashController.d.ts +97 -0
- package/build/services/MentraJSCrashController.d.ts.map +1 -0
- package/build/services/MentraJSCrashController.js +138 -0
- package/build/services/MentraJSCrashController.js.map +1 -0
- package/build/services/MentraJSCrashloopReportService.d.ts +9 -0
- package/build/services/MentraJSCrashloopReportService.d.ts.map +1 -0
- package/build/services/MentraJSCrashloopReportService.js +54 -0
- package/build/services/MentraJSCrashloopReportService.js.map +1 -0
- package/build/services/MentraJSLogPipeline.d.ts +87 -0
- package/build/services/MentraJSLogPipeline.d.ts.map +1 -0
- package/build/services/MentraJSLogPipeline.js +137 -0
- package/build/services/MentraJSLogPipeline.js.map +1 -0
- package/build/services/MentraJSRouter.d.ts +203 -0
- package/build/services/MentraJSRouter.d.ts.map +1 -0
- package/build/services/MentraJSRouter.js +480 -0
- package/build/services/MentraJSRouter.js.map +1 -0
- package/build/services/MentraUIRouter.d.ts +137 -0
- package/build/services/MentraUIRouter.d.ts.map +1 -0
- package/build/services/MentraUIRouter.js +210 -0
- package/build/services/MentraUIRouter.js.map +1 -0
- package/build/services/MicStateCoordinator.d.ts +37 -0
- package/build/services/MicStateCoordinator.d.ts.map +1 -0
- package/build/services/MicStateCoordinator.js +81 -0
- package/build/services/MicStateCoordinator.js.map +1 -0
- package/build/services/MiniappEngine.d.ts +31 -0
- package/build/services/MiniappEngine.d.ts.map +1 -0
- package/build/services/MiniappEngine.js +119 -0
- package/build/services/MiniappEngine.js.map +1 -0
- package/build/services/MiniappLauncher.d.ts +129 -0
- package/build/services/MiniappLauncher.d.ts.map +1 -0
- package/build/services/MiniappLauncher.js +291 -0
- package/build/services/MiniappLauncher.js.map +1 -0
- package/build/services/MiniappRunningRegistry.d.ts +24 -0
- package/build/services/MiniappRunningRegistry.d.ts.map +1 -0
- package/build/services/MiniappRunningRegistry.js +52 -0
- package/build/services/MiniappRunningRegistry.js.map +1 -0
- package/build/services/NativeHttpResponse.d.ts +3 -0
- package/build/services/NativeHttpResponse.d.ts.map +1 -0
- package/build/services/NativeHttpResponse.js +6 -0
- package/build/services/NativeHttpResponse.js.map +1 -0
- package/build/services/NavigationHandlers.d.ts +90 -0
- package/build/services/NavigationHandlers.d.ts.map +1 -0
- package/build/services/NavigationHandlers.js +379 -0
- package/build/services/NavigationHandlers.js.map +1 -0
- package/build/services/NavigationService.d.ts +254 -0
- package/build/services/NavigationService.d.ts.map +1 -0
- package/build/services/NavigationService.js +553 -0
- package/build/services/NavigationService.js.map +1 -0
- package/build/services/NotificationsEmitter.d.ts +28 -0
- package/build/services/NotificationsEmitter.d.ts.map +1 -0
- package/build/services/NotificationsEmitter.js +22 -0
- package/build/services/NotificationsEmitter.js.map +1 -0
- package/build/services/OfflineSpeechModelService.d.ts +33 -0
- package/build/services/OfflineSpeechModelService.d.ts.map +1 -0
- package/build/services/OfflineSpeechModelService.js +136 -0
- package/build/services/OfflineSpeechModelService.js.map +1 -0
- package/build/services/OtaInstallCoordinator.d.ts +195 -0
- package/build/services/OtaInstallCoordinator.d.ts.map +1 -0
- package/build/services/OtaInstallCoordinator.js +1047 -0
- package/build/services/OtaInstallCoordinator.js.map +1 -0
- package/build/services/OtaService.d.ts +3 -0
- package/build/services/OtaService.d.ts.map +1 -0
- package/build/services/OtaService.js +65 -0
- package/build/services/OtaService.js.map +1 -0
- package/build/services/OtaUpdateCheckService.d.ts +65 -0
- package/build/services/OtaUpdateCheckService.d.ts.map +1 -0
- package/build/services/OtaUpdateCheckService.js +260 -0
- package/build/services/OtaUpdateCheckService.js.map +1 -0
- package/build/services/PairingIdentity.d.ts +80 -0
- package/build/services/PairingIdentity.d.ts.map +1 -0
- package/build/services/PairingIdentity.js +145 -0
- package/build/services/PairingIdentity.js.map +1 -0
- package/build/services/PhoneCalendarHelpers.d.ts +32 -0
- package/build/services/PhoneCalendarHelpers.d.ts.map +1 -0
- package/build/services/PhoneCalendarHelpers.js +157 -0
- package/build/services/PhoneCalendarHelpers.js.map +1 -0
- package/build/services/PhoneCalendarService.d.ts +5 -0
- package/build/services/PhoneCalendarService.d.ts.map +1 -0
- package/build/services/PhoneCalendarService.js +24 -0
- package/build/services/PhoneCalendarService.js.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts +28 -0
- package/build/services/PhoneCameraFovCoordinator.d.ts.map +1 -0
- package/build/services/PhoneCameraFovCoordinator.js +180 -0
- package/build/services/PhoneCameraFovCoordinator.js.map +1 -0
- package/build/services/PhoneLocationService.d.ts +36 -0
- package/build/services/PhoneLocationService.d.ts.map +1 -0
- package/build/services/PhoneLocationService.js +115 -0
- package/build/services/PhoneLocationService.js.map +1 -0
- package/build/services/PhoneNotificationsSync.d.ts +3 -0
- package/build/services/PhoneNotificationsSync.d.ts.map +1 -0
- package/build/services/PhoneNotificationsSync.js +35 -0
- package/build/services/PhoneNotificationsSync.js.map +1 -0
- package/build/services/PhonePhotoCoordinator.d.ts +103 -0
- package/build/services/PhonePhotoCoordinator.d.ts.map +1 -0
- package/build/services/PhonePhotoCoordinator.js +326 -0
- package/build/services/PhonePhotoCoordinator.js.map +1 -0
- package/build/services/PhoneStreamCoordinator.d.ts +168 -0
- package/build/services/PhoneStreamCoordinator.d.ts.map +1 -0
- package/build/services/PhoneStreamCoordinator.js +632 -0
- package/build/services/PhoneStreamCoordinator.js.map +1 -0
- package/build/services/PhoneVideoCoordinator.d.ts +50 -0
- package/build/services/PhoneVideoCoordinator.d.ts.map +1 -0
- package/build/services/PhoneVideoCoordinator.js +147 -0
- package/build/services/PhoneVideoCoordinator.js.map +1 -0
- package/build/services/STTModelManager.d.ts +65 -0
- package/build/services/STTModelManager.d.ts.map +1 -0
- package/build/services/STTModelManager.js +292 -0
- package/build/services/STTModelManager.js.map +1 -0
- package/build/services/SceneRenderer.d.ts +90 -0
- package/build/services/SceneRenderer.d.ts.map +1 -0
- package/build/services/SceneRenderer.js +248 -0
- package/build/services/SceneRenderer.js.map +1 -0
- package/build/services/SentenceTtsPipeline.d.ts +31 -0
- package/build/services/SentenceTtsPipeline.d.ts.map +1 -0
- package/build/services/SentenceTtsPipeline.js +67 -0
- package/build/services/SentenceTtsPipeline.js.map +1 -0
- package/build/services/StreamLifecycleController.d.ts +67 -0
- package/build/services/StreamLifecycleController.d.ts.map +1 -0
- package/build/services/StreamLifecycleController.js +152 -0
- package/build/services/StreamLifecycleController.js.map +1 -0
- package/build/services/TTSModelManager.d.ts +90 -0
- package/build/services/TTSModelManager.d.ts.map +1 -0
- package/build/services/TTSModelManager.js +366 -0
- package/build/services/TTSModelManager.js.map +1 -0
- package/build/services/TranscriptionRouting.d.ts +12 -0
- package/build/services/TranscriptionRouting.d.ts.map +1 -0
- package/build/services/TranscriptionRouting.js +24 -0
- package/build/services/TranscriptionRouting.js.map +1 -0
- package/build/services/WebviewBridge.d.ts +22 -0
- package/build/services/WebviewBridge.d.ts.map +1 -0
- package/build/services/WebviewBridge.js +47 -0
- package/build/services/WebviewBridge.js.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts +17 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.d.ts.map +1 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js +43 -0
- package/build/services/asg/GalleryMediaIntegrityReportService.js.map +1 -0
- package/build/services/asg/asgCameraApi.d.ts +205 -0
- package/build/services/asg/asgCameraApi.d.ts.map +1 -0
- package/build/services/asg/asgCameraApi.js +1410 -0
- package/build/services/asg/asgCameraApi.js.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts +60 -0
- package/build/services/asg/cameraRollExportCoordinator.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportCoordinator.js +618 -0
- package/build/services/asg/cameraRollExportCoordinator.js.map +1 -0
- package/build/services/asg/cameraRollExportLedger.d.ts +44 -0
- package/build/services/asg/cameraRollExportLedger.d.ts.map +1 -0
- package/build/services/asg/cameraRollExportLedger.js +78 -0
- package/build/services/asg/cameraRollExportLedger.js.map +1 -0
- package/build/services/asg/galleryMediaValidation.d.ts +29 -0
- package/build/services/asg/galleryMediaValidation.d.ts.map +1 -0
- package/build/services/asg/galleryMediaValidation.js +149 -0
- package/build/services/asg/galleryMediaValidation.js.map +1 -0
- package/build/services/asg/galleryNotices.d.ts +33 -0
- package/build/services/asg/galleryNotices.d.ts.map +1 -0
- package/build/services/asg/galleryNotices.js +29 -0
- package/build/services/asg/galleryNotices.js.map +1 -0
- package/build/services/asg/galleryPathMigration.d.ts +3 -0
- package/build/services/asg/galleryPathMigration.d.ts.map +1 -0
- package/build/services/asg/galleryPathMigration.js +26 -0
- package/build/services/asg/galleryPathMigration.js.map +1 -0
- package/build/services/asg/gallerySettingsService.d.ts +20 -0
- package/build/services/asg/gallerySettingsService.d.ts.map +1 -0
- package/build/services/asg/gallerySettingsService.js +53 -0
- package/build/services/asg/gallerySettingsService.js.map +1 -0
- package/build/services/asg/gallerySyncNotifications.d.ts +56 -0
- package/build/services/asg/gallerySyncNotifications.d.ts.map +1 -0
- package/build/services/asg/gallerySyncNotifications.js +198 -0
- package/build/services/asg/gallerySyncNotifications.js.map +1 -0
- package/build/services/asg/gallerySyncService.d.ts +137 -0
- package/build/services/asg/gallerySyncService.d.ts.map +1 -0
- package/build/services/asg/gallerySyncService.js +1933 -0
- package/build/services/asg/gallerySyncService.js.map +1 -0
- package/build/services/asg/galleryTransferLedger.d.ts +58 -0
- package/build/services/asg/galleryTransferLedger.d.ts.map +1 -0
- package/build/services/asg/galleryTransferLedger.js +225 -0
- package/build/services/asg/galleryTransferLedger.js.map +1 -0
- package/build/services/asg/localNetworkTransport.d.ts +15 -0
- package/build/services/asg/localNetworkTransport.d.ts.map +1 -0
- package/build/services/asg/localNetworkTransport.js +144 -0
- package/build/services/asg/localNetworkTransport.js.map +1 -0
- package/build/services/asg/localStorageService.d.ts +146 -0
- package/build/services/asg/localStorageService.d.ts.map +1 -0
- package/build/services/asg/localStorageService.js +572 -0
- package/build/services/asg/localStorageService.js.map +1 -0
- package/build/services/asg/mediaProcessingQueue.d.ts +70 -0
- package/build/services/asg/mediaProcessingQueue.d.ts.map +1 -0
- package/build/services/asg/mediaProcessingQueue.js +451 -0
- package/build/services/asg/mediaProcessingQueue.js.map +1 -0
- package/build/services/asgOtaVersionUrl.d.ts +2 -0
- package/build/services/asgOtaVersionUrl.d.ts.map +1 -0
- package/build/services/asgOtaVersionUrl.js +36 -0
- package/build/services/asgOtaVersionUrl.js.map +1 -0
- package/build/services/blobPaths.d.ts +31 -0
- package/build/services/blobPaths.d.ts.map +1 -0
- package/build/services/blobPaths.js +86 -0
- package/build/services/blobPaths.js.map +1 -0
- package/build/services/cloudStreamApi.d.ts +59 -0
- package/build/services/cloudStreamApi.d.ts.map +1 -0
- package/build/services/cloudStreamApi.js +81 -0
- package/build/services/cloudStreamApi.js.map +1 -0
- package/build/services/gallerySyncClock.d.ts +17 -0
- package/build/services/gallerySyncClock.d.ts.map +1 -0
- package/build/services/gallerySyncClock.js +21 -0
- package/build/services/gallerySyncClock.js.map +1 -0
- package/build/services/glassesClockSync.d.ts +20 -0
- package/build/services/glassesClockSync.d.ts.map +1 -0
- package/build/services/glassesClockSync.js +97 -0
- package/build/services/glassesClockSync.js.map +1 -0
- package/build/services/manifestVersionGate.d.ts +28 -0
- package/build/services/manifestVersionGate.d.ts.map +1 -0
- package/build/services/manifestVersionGate.js +41 -0
- package/build/services/manifestVersionGate.js.map +1 -0
- package/build/services/mentraUiShim.d.ts +38 -0
- package/build/services/mentraUiShim.d.ts.map +1 -0
- package/build/services/mentraUiShim.js +360 -0
- package/build/services/mentraUiShim.js.map +1 -0
- package/build/services/navigation/roadNameResolver.d.ts +67 -0
- package/build/services/navigation/roadNameResolver.d.ts.map +1 -0
- package/build/services/navigation/roadNameResolver.js +96 -0
- package/build/services/navigation/roadNameResolver.js.map +1 -0
- package/build/services/navigation/routesApiCodec.d.ts +38 -0
- package/build/services/navigation/routesApiCodec.d.ts.map +1 -0
- package/build/services/navigation/routesApiCodec.js +68 -0
- package/build/services/navigation/routesApiCodec.js.map +1 -0
- package/build/services/otaDisplayState.d.ts +42 -0
- package/build/services/otaDisplayState.d.ts.map +1 -0
- package/build/services/otaDisplayState.js +92 -0
- package/build/services/otaDisplayState.js.map +1 -0
- package/build/services/otaInstallPolicy.d.ts +81 -0
- package/build/services/otaInstallPolicy.d.ts.map +1 -0
- package/build/services/otaInstallPolicy.js +96 -0
- package/build/services/otaInstallPolicy.js.map +1 -0
- package/build/services/otaLegacyMapping.d.ts +22 -0
- package/build/services/otaLegacyMapping.d.ts.map +1 -0
- package/build/services/otaLegacyMapping.js +56 -0
- package/build/services/otaLegacyMapping.js.map +1 -0
- package/build/services/slimStreamStatus.d.ts +7 -0
- package/build/services/slimStreamStatus.d.ts.map +1 -0
- package/build/services/slimStreamStatus.js +26 -0
- package/build/services/slimStreamStatus.js.map +1 -0
- package/build/stores/apps.d.ts +104 -0
- package/build/stores/apps.d.ts.map +1 -0
- package/build/stores/apps.js +492 -0
- package/build/stores/apps.js.map +1 -0
- package/build/stores/bluetoothSettingKeys.d.ts +4 -0
- package/build/stores/bluetoothSettingKeys.d.ts.map +1 -0
- package/build/stores/bluetoothSettingKeys.js +31 -0
- package/build/stores/bluetoothSettingKeys.js.map +1 -0
- package/build/stores/cloudClientStatus.d.ts +9 -0
- package/build/stores/cloudClientStatus.d.ts.map +1 -0
- package/build/stores/cloudClientStatus.js +24 -0
- package/build/stores/cloudClientStatus.js.map +1 -0
- package/build/stores/connection.d.ts +22 -0
- package/build/stores/connection.d.ts.map +1 -0
- package/build/stores/connection.js +43 -0
- package/build/stores/connection.js.map +1 -0
- package/build/stores/core.d.ts +15 -0
- package/build/stores/core.d.ts.map +1 -0
- package/build/stores/core.js +21 -0
- package/build/stores/core.js.map +1 -0
- package/build/stores/display.d.ts +24 -0
- package/build/stores/display.d.ts.map +1 -0
- package/build/stores/display.js +96 -0
- package/build/stores/display.js.map +1 -0
- package/build/stores/gallerySync.d.ts +101 -0
- package/build/stores/gallerySync.d.ts.map +1 -0
- package/build/stores/gallerySync.js +217 -0
- package/build/stores/gallerySync.js.map +1 -0
- package/build/stores/glasses.d.ts +62 -0
- package/build/stores/glasses.d.ts.map +1 -0
- package/build/stores/glasses.js +203 -0
- package/build/stores/glasses.js.map +1 -0
- package/build/stores/settings.d.ts +37 -0
- package/build/stores/settings.d.ts.map +1 -0
- package/build/stores/settings.js +922 -0
- package/build/stores/settings.js.map +1 -0
- package/build/types/applet.d.ts +96 -0
- package/build/types/applet.d.ts.map +1 -0
- package/build/types/applet.js +5 -0
- package/build/types/applet.js.map +1 -0
- package/build/types/asg.d.ts +53 -0
- package/build/types/asg.d.ts.map +1 -0
- package/build/types/asg.js +2 -0
- package/build/types/asg.js.map +1 -0
- package/build/types/capabilities/even-realities-g1.d.ts +12 -0
- package/build/types/capabilities/even-realities-g1.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g1.js +55 -0
- package/build/types/capabilities/even-realities-g1.js.map +1 -0
- package/build/types/capabilities/even-realities-g2.d.ts +12 -0
- package/build/types/capabilities/even-realities-g2.d.ts.map +1 -0
- package/build/types/capabilities/even-realities-g2.js +75 -0
- package/build/types/capabilities/even-realities-g2.js.map +1 -0
- package/build/types/capabilities/mentra-display.d.ts +12 -0
- package/build/types/capabilities/mentra-display.d.ts.map +1 -0
- package/build/types/capabilities/mentra-display.js +63 -0
- package/build/types/capabilities/mentra-display.js.map +1 -0
- package/build/types/capabilities/mentra-live.d.ts +12 -0
- package/build/types/capabilities/mentra-live.d.ts.map +1 -0
- package/build/types/capabilities/mentra-live.js +92 -0
- package/build/types/capabilities/mentra-live.js.map +1 -0
- package/build/types/capabilities/none.d.ts +13 -0
- package/build/types/capabilities/none.d.ts.map +1 -0
- package/build/types/capabilities/none.js +65 -0
- package/build/types/capabilities/none.js.map +1 -0
- package/build/types/capabilities/simulated-glasses.d.ts +13 -0
- package/build/types/capabilities/simulated-glasses.d.ts.map +1 -0
- package/build/types/capabilities/simulated-glasses.js +65 -0
- package/build/types/capabilities/simulated-glasses.js.map +1 -0
- package/build/types/capabilities/vuzix-z100.d.ts +12 -0
- package/build/types/capabilities/vuzix-z100.d.ts.map +1 -0
- package/build/types/capabilities/vuzix-z100.js +52 -0
- package/build/types/capabilities/vuzix-z100.js.map +1 -0
- package/build/types/enums.d.ts +40 -0
- package/build/types/enums.d.ts.map +1 -0
- package/build/types/enums.js +44 -0
- package/build/types/enums.js.map +1 -0
- package/build/types/hardware.d.ts +160 -0
- package/build/types/hardware.d.ts.map +1 -0
- package/build/types/hardware.js +36 -0
- package/build/types/hardware.js.map +1 -0
- package/build/types/index.d.ts +11 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +10 -0
- package/build/types/index.js.map +1 -0
- package/build/utils/GlobalEventEmitter.d.ts +10 -0
- package/build/utils/GlobalEventEmitter.d.ts.map +1 -0
- package/build/utils/GlobalEventEmitter.js +13 -0
- package/build/utils/GlobalEventEmitter.js.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts +3 -0
- package/build/utils/cloudClient/RnUdpAdapter.d.ts.map +1 -0
- package/build/utils/cloudClient/RnUdpAdapter.js +41 -0
- package/build/utils/cloudClient/RnUdpAdapter.js.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts +3 -0
- package/build/utils/cloudClient/cloudSecureStore.d.ts.map +1 -0
- package/build/utils/cloudClient/cloudSecureStore.js +26 -0
- package/build/utils/cloudClient/cloudSecureStore.js.map +1 -0
- package/build/utils/debouncedPatch.d.ts +6 -0
- package/build/utils/debouncedPatch.d.ts.map +1 -0
- package/build/utils/debouncedPatch.js +25 -0
- package/build/utils/debouncedPatch.js.map +1 -0
- package/build/utils/devLogging.d.ts +26 -0
- package/build/utils/devLogging.d.ts.map +1 -0
- package/build/utils/devLogging.js +116 -0
- package/build/utils/devLogging.js.map +1 -0
- package/build/utils/devMiniappLaunch.d.ts +44 -0
- package/build/utils/devMiniappLaunch.d.ts.map +1 -0
- package/build/utils/devMiniappLaunch.js +52 -0
- package/build/utils/devMiniappLaunch.js.map +1 -0
- package/build/utils/diagnosticContext.d.ts +3 -0
- package/build/utils/diagnosticContext.d.ts.map +1 -0
- package/build/utils/diagnosticContext.js +119 -0
- package/build/utils/diagnosticContext.js.map +1 -0
- package/build/utils/display/composer/ColumnComposer.d.ts +131 -0
- package/build/utils/display/composer/ColumnComposer.d.ts.map +1 -0
- package/build/utils/display/composer/ColumnComposer.js +204 -0
- package/build/utils/display/composer/ColumnComposer.js.map +1 -0
- package/build/utils/display/composer/index.d.ts +9 -0
- package/build/utils/display/composer/index.d.ts.map +1 -0
- package/build/utils/display/composer/index.js +9 -0
- package/build/utils/display/composer/index.js.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts +165 -0
- package/build/utils/display/helpers/DisplayHelpers.d.ts.map +1 -0
- package/build/utils/display/helpers/DisplayHelpers.js +312 -0
- package/build/utils/display/helpers/DisplayHelpers.js.map +1 -0
- package/build/utils/display/helpers/ScrollView.d.ts +183 -0
- package/build/utils/display/helpers/ScrollView.d.ts.map +1 -0
- package/build/utils/display/helpers/ScrollView.js +257 -0
- package/build/utils/display/helpers/ScrollView.js.map +1 -0
- package/build/utils/display/helpers/index.d.ts +11 -0
- package/build/utils/display/helpers/index.d.ts.map +1 -0
- package/build/utils/display/helpers/index.js +10 -0
- package/build/utils/display/helpers/index.js.map +1 -0
- package/build/utils/display/index.d.ts +174 -0
- package/build/utils/display/index.d.ts.map +1 -0
- package/build/utils/display/index.js +185 -0
- package/build/utils/display/index.js.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts +160 -0
- package/build/utils/display/measurer/TextMeasurer.d.ts.map +1 -0
- package/build/utils/display/measurer/TextMeasurer.js +273 -0
- package/build/utils/display/measurer/TextMeasurer.js.map +1 -0
- package/build/utils/display/measurer/index.d.ts +10 -0
- package/build/utils/display/measurer/index.d.ts.map +1 -0
- package/build/utils/display/measurer/index.js +11 -0
- package/build/utils/display/measurer/index.js.map +1 -0
- package/build/utils/display/measurer/script-detection.d.ts +53 -0
- package/build/utils/display/measurer/script-detection.d.ts.map +1 -0
- package/build/utils/display/measurer/script-detection.js +184 -0
- package/build/utils/display/measurer/script-detection.js.map +1 -0
- package/build/utils/display/profiles/g1.d.ts +33 -0
- package/build/utils/display/profiles/g1.d.ts.map +1 -0
- package/build/utils/display/profiles/g1.js +213 -0
- package/build/utils/display/profiles/g1.js.map +1 -0
- package/build/utils/display/profiles/g2.d.ts +13 -0
- package/build/utils/display/profiles/g2.d.ts.map +1 -0
- package/build/utils/display/profiles/g2.js +34 -0
- package/build/utils/display/profiles/g2.js.map +1 -0
- package/build/utils/display/profiles/index.d.ts +12 -0
- package/build/utils/display/profiles/index.d.ts.map +1 -0
- package/build/utils/display/profiles/index.js +15 -0
- package/build/utils/display/profiles/index.js.map +1 -0
- package/build/utils/display/profiles/nex.d.ts +10 -0
- package/build/utils/display/profiles/nex.d.ts.map +1 -0
- package/build/utils/display/profiles/nex.js +150 -0
- package/build/utils/display/profiles/nex.js.map +1 -0
- package/build/utils/display/profiles/types.d.ts +103 -0
- package/build/utils/display/profiles/types.d.ts.map +1 -0
- package/build/utils/display/profiles/types.js +2 -0
- package/build/utils/display/profiles/types.js.map +1 -0
- package/build/utils/display/profiles/z100.d.ts +33 -0
- package/build/utils/display/profiles/z100.d.ts.map +1 -0
- package/build/utils/display/profiles/z100.js +182 -0
- package/build/utils/display/profiles/z100.js.map +1 -0
- package/build/utils/display/scene/degrade.d.ts +25 -0
- package/build/utils/display/scene/degrade.d.ts.map +1 -0
- package/build/utils/display/scene/degrade.js +64 -0
- package/build/utils/display/scene/degrade.js.map +1 -0
- package/build/utils/display/scene/differ.d.ts +38 -0
- package/build/utils/display/scene/differ.d.ts.map +1 -0
- package/build/utils/display/scene/differ.js +107 -0
- package/build/utils/display/scene/differ.js.map +1 -0
- package/build/utils/display/scene/index.d.ts +10 -0
- package/build/utils/display/scene/index.d.ts.map +1 -0
- package/build/utils/display/scene/index.js +6 -0
- package/build/utils/display/scene/index.js.map +1 -0
- package/build/utils/display/scene/process.d.ts +35 -0
- package/build/utils/display/scene/process.d.ts.map +1 -0
- package/build/utils/display/scene/process.js +187 -0
- package/build/utils/display/scene/process.js.map +1 -0
- package/build/utils/display/scene/store.d.ts +48 -0
- package/build/utils/display/scene/store.d.ts.map +1 -0
- package/build/utils/display/scene/store.js +0 -0
- package/build/utils/display/scene/store.js.map +1 -0
- package/build/utils/display/scene/types.d.ts +120 -0
- package/build/utils/display/scene/types.d.ts.map +1 -0
- package/build/utils/display/scene/types.js +0 -0
- package/build/utils/display/scene/types.js.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts +102 -0
- package/build/utils/display/wrapper/TextWrapper.d.ts.map +1 -0
- package/build/utils/display/wrapper/TextWrapper.js +471 -0
- package/build/utils/display/wrapper/TextWrapper.js.map +1 -0
- package/build/utils/display/wrapper/index.d.ts +12 -0
- package/build/utils/display/wrapper/index.d.ts.map +1 -0
- package/build/utils/display/wrapper/index.js +12 -0
- package/build/utils/display/wrapper/index.js.map +1 -0
- package/build/utils/display/wrapper/types.d.ts +75 -0
- package/build/utils/display/wrapper/types.d.ts.map +1 -0
- package/build/utils/display/wrapper/types.js +11 -0
- package/build/utils/display/wrapper/types.js.map +1 -0
- package/build/utils/e2eMetrics.d.ts +6 -0
- package/build/utils/e2eMetrics.d.ts.map +1 -0
- package/build/utils/e2eMetrics.js +27 -0
- package/build/utils/e2eMetrics.js.map +1 -0
- package/build/utils/hardware/hardware.d.ts +42 -0
- package/build/utils/hardware/hardware.d.ts.map +1 -0
- package/build/utils/hardware/hardware.js +127 -0
- package/build/utils/hardware/hardware.js.map +1 -0
- package/build/utils/hardware/index.d.ts +2 -0
- package/build/utils/hardware/index.d.ts.map +1 -0
- package/build/utils/hardware/index.js +2 -0
- package/build/utils/hardware/index.js.map +1 -0
- package/build/utils/miniappGlobals.d.ts +60 -0
- package/build/utils/miniappGlobals.d.ts.map +1 -0
- package/build/utils/miniappGlobals.js +224 -0
- package/build/utils/miniappGlobals.js.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts +45 -0
- package/build/utils/permissions/MediaLibraryPermissions.d.ts.map +1 -0
- package/build/utils/permissions/MediaLibraryPermissions.js +145 -0
- package/build/utils/permissions/MediaLibraryPermissions.js.map +1 -0
- package/build/utils/permissions/galleryDisplayName.d.ts +8 -0
- package/build/utils/permissions/galleryDisplayName.d.ts.map +1 -0
- package/build/utils/permissions/galleryDisplayName.js +25 -0
- package/build/utils/permissions/galleryDisplayName.js.map +1 -0
- package/build/utils/storage/index.d.ts +3 -0
- package/build/utils/storage/index.d.ts.map +1 -0
- package/build/utils/storage/index.js +3 -0
- package/build/utils/storage/index.js.map +1 -0
- package/build/utils/storage/storage.d.ts +24 -0
- package/build/utils/storage/storage.d.ts.map +1 -0
- package/build/utils/storage/storage.js +85 -0
- package/build/utils/storage/storage.js.map +1 -0
- package/build/utils/storage/zip.d.ts +3 -0
- package/build/utils/storage/zip.d.ts.map +1 -0
- package/build/utils/storage/zip.js +14 -0
- package/build/utils/storage/zip.js.map +1 -0
- package/build/utils/timers/index.d.ts +3 -0
- package/build/utils/timers/index.d.ts.map +1 -0
- package/build/utils/timers/index.js +3 -0
- package/build/utils/timers/index.js.map +1 -0
- package/build/utils/timers/timers.d.ts +9 -0
- package/build/utils/timers/timers.d.ts.map +1 -0
- package/build/utils/timers/timers.js +105 -0
- package/build/utils/timers/timers.js.map +1 -0
- package/package.json +120 -0
- package/src/devtools.ts +13 -0
- package/src/engine.ts +173 -0
- package/src/facades/dev.ts +198 -0
- package/src/facades/display.ts +17 -0
- package/src/facades/displayMirror.ts +33 -0
- package/src/facades/gallery.ts +69 -0
- package/src/facades/glasses.ts +206 -0
- package/src/facades/glassesSettings.ts +56 -0
- package/src/facades/glassesWifi.ts +68 -0
- package/src/facades/miniapps.ts +55 -0
- package/src/facades/notifications.ts +15 -0
- package/src/facades/ota.ts +174 -0
- package/src/facades/pairing.ts +329 -0
- package/src/facades/permissions.ts +165 -0
- package/src/facades/phoneNotifications.ts +50 -0
- package/src/facades/reports.ts +185 -0
- package/src/facades/session.ts +55 -0
- package/src/facades/settings.ts +57 -0
- package/src/facades/speech.ts +38 -0
- package/src/index.ts +191 -0
- package/src/internal.ts +159 -0
- package/src/runtime/bootstrap.ts +118 -0
- package/src/runtime/config.ts +147 -0
- package/src/runtime/streamConfig.ts +34 -0
- package/src/services/AppRegistry.ts +1190 -0
- package/src/services/AudioCloudUplink.ts +50 -0
- package/src/services/AudioPlaybackService.ts +813 -0
- package/src/services/AutomaticReportResult.ts +48 -0
- package/src/services/BlobStore.ts +746 -0
- package/src/services/CaptionsTesterReportService.ts +107 -0
- package/src/services/CloudAudioSubscriptionSync.ts +41 -0
- package/src/services/CloudClientService.ts +689 -0
- package/src/services/CloudTranscriptE2EMetrics.ts +27 -0
- package/src/services/ConnectionCoordinator.ts +65 -0
- package/src/services/DevServerBridge.ts +332 -0
- package/src/services/DeviceEventRouter.ts +238 -0
- package/src/services/DeviceStoreHydration.ts +130 -0
- package/src/services/DisplayProcessor.ts +775 -0
- package/src/services/GlassesReadiness.ts +103 -0
- package/src/services/GlassesSettingsSync.ts +134 -0
- package/src/services/GlassesStatusProjection.ts +73 -0
- package/src/services/HeadingService.ts +98 -0
- package/src/services/LocalDisplayManager.ts +703 -0
- package/src/services/LocalMiniappRuntime.ts +4213 -0
- package/src/services/LocalSttFallbackCoordinator.ts +147 -0
- package/src/services/MentraJSCrashController.ts +189 -0
- package/src/services/MentraJSCrashloopReportService.ts +66 -0
- package/src/services/MentraJSLogPipeline.ts +166 -0
- package/src/services/MentraJSRouter.ts +557 -0
- package/src/services/MentraUIRouter.ts +244 -0
- package/src/services/MicStateCoordinator.ts +94 -0
- package/src/services/MiniappEngine.ts +143 -0
- package/src/services/MiniappLauncher.ts +340 -0
- package/src/services/MiniappRunningRegistry.ts +57 -0
- package/src/services/NativeHttpResponse.ts +6 -0
- package/src/services/NavigationHandlers.ts +423 -0
- package/src/services/NavigationService.ts +731 -0
- package/src/services/NotificationsEmitter.ts +48 -0
- package/src/services/OfflineSpeechModelService.ts +168 -0
- package/src/services/OtaInstallCoordinator.ts +1205 -0
- package/src/services/OtaService.ts +83 -0
- package/src/services/OtaUpdateCheckService.ts +386 -0
- package/src/services/PairingIdentity.ts +154 -0
- package/src/services/PhoneCalendarHelpers.ts +212 -0
- package/src/services/PhoneCalendarService.ts +42 -0
- package/src/services/PhoneCameraFovCoordinator.ts +195 -0
- package/src/services/PhoneLocationService.ts +122 -0
- package/src/services/PhoneNotificationsSync.ts +44 -0
- package/src/services/PhonePhotoCoordinator.ts +409 -0
- package/src/services/PhoneStreamCoordinator.ts +777 -0
- package/src/services/PhoneVideoCoordinator.ts +189 -0
- package/src/services/STTModelManager.ts +360 -0
- package/src/services/SceneRenderer.ts +292 -0
- package/src/services/SentenceTtsPipeline.ts +106 -0
- package/src/services/StreamLifecycleController.ts +213 -0
- package/src/services/TTSModelManager.ts +466 -0
- package/src/services/TranscriptionRouting.ts +37 -0
- package/src/services/WebviewBridge.ts +50 -0
- package/src/services/asg/GalleryMediaIntegrityReportService.ts +70 -0
- package/src/services/asg/asgCameraApi.ts +1695 -0
- package/src/services/asg/cameraRollExportCoordinator.ts +627 -0
- package/src/services/asg/cameraRollExportLedger.ts +122 -0
- package/src/services/asg/galleryMediaValidation.ts +183 -0
- package/src/services/asg/galleryNotices.ts +61 -0
- package/src/services/asg/galleryPathMigration.ts +22 -0
- package/src/services/asg/gallerySettingsService.ts +68 -0
- package/src/services/asg/gallerySyncNotifications.ts +236 -0
- package/src/services/asg/gallerySyncService.ts +2269 -0
- package/src/services/asg/galleryTransferLedger.ts +312 -0
- package/src/services/asg/localNetworkTransport.ts +173 -0
- package/src/services/asg/localStorageService.ts +652 -0
- package/src/services/asg/mediaProcessingQueue.ts +518 -0
- package/src/services/asgOtaVersionUrl.ts +41 -0
- package/src/services/blobPaths.ts +86 -0
- package/src/services/cloudStreamApi.ts +154 -0
- package/src/services/gallerySyncClock.ts +39 -0
- package/src/services/glassesClockSync.ts +115 -0
- package/src/services/manifestVersionGate.ts +43 -0
- package/src/services/mentraUiShim.ts +366 -0
- package/src/services/navigation/roadNameResolver.ts +112 -0
- package/src/services/navigation/routesApiCodec.ts +69 -0
- package/src/services/otaDisplayState.ts +115 -0
- package/src/services/otaInstallPolicy.ts +106 -0
- package/src/services/otaLegacyMapping.ts +71 -0
- package/src/services/slimStreamStatus.ts +28 -0
- package/src/stores/apps.ts +614 -0
- package/src/stores/bluetoothSettingKeys.ts +36 -0
- package/src/stores/cloudClientStatus.ts +37 -0
- package/src/stores/connection.ts +69 -0
- package/src/stores/core.ts +32 -0
- package/src/stores/display.ts +121 -0
- package/src/stores/gallerySync.ts +380 -0
- package/src/stores/glasses.ts +309 -0
- package/src/stores/settings.ts +1001 -0
- package/src/types/applet.ts +112 -0
- package/src/types/asg.ts +58 -0
- package/src/types/capabilities/even-realities-g1.ts +67 -0
- package/src/types/capabilities/even-realities-g2.ts +88 -0
- package/src/types/capabilities/mentra-display.ts +75 -0
- package/src/types/capabilities/mentra-live.ts +103 -0
- package/src/types/capabilities/none.ts +76 -0
- package/src/types/capabilities/simulated-glasses.ts +76 -0
- package/src/types/capabilities/vuzix-z100.ts +64 -0
- package/src/types/enums.ts +43 -0
- package/src/types/hardware.ts +203 -0
- package/src/types/index.ts +37 -0
- package/src/utils/GlobalEventEmitter.ts +14 -0
- package/src/utils/cloudClient/RnUdpAdapter.ts +47 -0
- package/src/utils/cloudClient/cloudSecureStore.ts +28 -0
- package/src/utils/debouncedPatch.ts +28 -0
- package/src/utils/devLogging.ts +140 -0
- package/src/utils/devMiniappLaunch.ts +68 -0
- package/src/utils/diagnosticContext.ts +155 -0
- package/src/utils/display/composer/ColumnComposer.ts +285 -0
- package/src/utils/display/composer/index.ts +15 -0
- package/src/utils/display/helpers/DisplayHelpers.ts +413 -0
- package/src/utils/display/helpers/ScrollView.ts +337 -0
- package/src/utils/display/helpers/index.ts +14 -0
- package/src/utils/display/index.ts +273 -0
- package/src/utils/display/measurer/TextMeasurer.ts +346 -0
- package/src/utils/display/measurer/index.ts +21 -0
- package/src/utils/display/measurer/script-detection.ts +218 -0
- package/src/utils/display/profiles/g1.ts +236 -0
- package/src/utils/display/profiles/g2.ts +39 -0
- package/src/utils/display/profiles/index.ts +28 -0
- package/src/utils/display/profiles/nex.ts +166 -0
- package/src/utils/display/profiles/types.ts +132 -0
- package/src/utils/display/profiles/z100.ts +198 -0
- package/src/utils/display/scene/degrade.ts +80 -0
- package/src/utils/display/scene/differ.ts +128 -0
- package/src/utils/display/scene/index.ts +21 -0
- package/src/utils/display/scene/process.ts +214 -0
- package/src/utils/display/scene/store.ts +0 -0
- package/src/utils/display/scene/types.ts +0 -0
- package/src/utils/display/wrapper/TextWrapper.ts +546 -0
- package/src/utils/display/wrapper/index.ts +15 -0
- package/src/utils/display/wrapper/types.ts +102 -0
- package/src/utils/e2eMetrics.ts +30 -0
- package/src/utils/hardware/hardware.ts +166 -0
- package/src/utils/hardware/index.ts +1 -0
- package/src/utils/miniappGlobals.ts +260 -0
- package/src/utils/permissions/MediaLibraryPermissions.ts +161 -0
- package/src/utils/permissions/galleryDisplayName.ts +28 -0
- package/src/utils/storage/index.ts +2 -0
- package/src/utils/storage/storage.ts +101 -0
- package/src/utils/storage/zip.ts +13 -0
- package/src/utils/timers/index.ts +2 -0
- package/src/utils/timers/timers.ts +139 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pairing facade — `engine.pairing`: scan for nearby glasses + pair. Scan state
|
|
3
|
+
* (searching + results) comes from the engine core store; scan/connect go over the
|
|
4
|
+
* bluetooth-sdk; pair-failure / not-ready are the bluetooth-sdk events.
|
|
5
|
+
*
|
|
6
|
+
* (Connect-the-already-paired-default is `engine.glasses.connectDefault()`; this
|
|
7
|
+
* facade is the first-time discovery + pair flow.)
|
|
8
|
+
*/
|
|
9
|
+
// Internal btsdk surface — updateBluetoothSettings (the Bluetooth Classic
|
|
10
|
+
// target hint) lives on the full surface, not the public entry (same reason
|
|
11
|
+
// the glasses facade imports internal).
|
|
12
|
+
import BluetoothSdk from "@mentra/bluetooth-sdk/internal"
|
|
13
|
+
import type {ConnectOptions, Device, PairFailureEvent, GlassesNotReadyEvent} from "@mentra/bluetooth-sdk"
|
|
14
|
+
import {useCoreStore} from "../stores/core"
|
|
15
|
+
import {useGlassesStore} from "../stores/glasses"
|
|
16
|
+
import {hasDefaultDevice} from "../services/DeviceStoreHydration"
|
|
17
|
+
import {
|
|
18
|
+
markPendingSelection,
|
|
19
|
+
projectPairingIdentity,
|
|
20
|
+
subscribePairingIdentity,
|
|
21
|
+
type IdentitySnapshot,
|
|
22
|
+
} from "../services/PairingIdentity"
|
|
23
|
+
import {
|
|
24
|
+
isGlassesConnected,
|
|
25
|
+
isGlassesLinkLayerBusy,
|
|
26
|
+
isGlassesReady,
|
|
27
|
+
waitForGlassesReady,
|
|
28
|
+
} from "../services/GlassesReadiness"
|
|
29
|
+
import {
|
|
30
|
+
logAutomaticReportSubmissionStatus,
|
|
31
|
+
toAutomaticReportSubmissionStatus,
|
|
32
|
+
type AutomaticReportSubmissionStatus,
|
|
33
|
+
} from "../services/AutomaticReportResult"
|
|
34
|
+
import {pushAllBluetoothSettings} from "../services/GlassesSettingsSync"
|
|
35
|
+
import {submitAutomaticReport} from "./reports"
|
|
36
|
+
|
|
37
|
+
export type {IdentitySnapshot} from "../services/PairingIdentity"
|
|
38
|
+
|
|
39
|
+
export interface PairingReadyWaitOptions {
|
|
40
|
+
deviceModel?: string
|
|
41
|
+
deviceName?: string
|
|
42
|
+
timeoutMs?: number
|
|
43
|
+
route?: string
|
|
44
|
+
signal?: AbortSignal
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const DEFAULT_PAIRING_BOOT_TIMEOUT_MS = 35_000
|
|
48
|
+
const DEFAULT_BT_CLASSIC_TIMEOUT_MS = 1_000
|
|
49
|
+
const DEFAULT_PAIRING_ROUTE = "/pairing/loading"
|
|
50
|
+
const LOG_TAG = "PairingTimeoutReport"
|
|
51
|
+
|
|
52
|
+
function projectReadiness() {
|
|
53
|
+
const s = useGlassesStore.getState()
|
|
54
|
+
return {
|
|
55
|
+
state: s.connection.state,
|
|
56
|
+
connected: s.connection.state === "connected",
|
|
57
|
+
fullyBooted: isGlassesReady(s.connection),
|
|
58
|
+
bluetoothClassicConnected: s.bluetoothClassicConnected,
|
|
59
|
+
nativeLinkBusy: isGlassesLinkLayerBusy(s.connection),
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export type PairingReadinessSnapshot = ReturnType<typeof projectReadiness>
|
|
64
|
+
|
|
65
|
+
export async function submitPairingBootTimeoutReport(params: {
|
|
66
|
+
deviceModel?: string
|
|
67
|
+
deviceName?: string
|
|
68
|
+
showGlassesBooting: boolean
|
|
69
|
+
elapsedMs: number
|
|
70
|
+
route?: string
|
|
71
|
+
}): Promise<AutomaticReportSubmissionStatus> {
|
|
72
|
+
const {deviceModel, deviceName, showGlassesBooting, elapsedMs, route = DEFAULT_PAIRING_ROUTE} = params
|
|
73
|
+
const result = await submitAutomaticReport({
|
|
74
|
+
kind: "automatic",
|
|
75
|
+
trigger: {
|
|
76
|
+
type: "automatic",
|
|
77
|
+
source: "pairing_loading",
|
|
78
|
+
reason: "glasses_connect_timeout",
|
|
79
|
+
},
|
|
80
|
+
report: {
|
|
81
|
+
expectedBehavior: `Glasses should connect successfully within ${Math.round(elapsedMs / 1000)} seconds.`,
|
|
82
|
+
actualBehavior: JSON.stringify(
|
|
83
|
+
{
|
|
84
|
+
deviceModel,
|
|
85
|
+
deviceName,
|
|
86
|
+
showGlassesBooting,
|
|
87
|
+
elapsedMs,
|
|
88
|
+
route,
|
|
89
|
+
},
|
|
90
|
+
null,
|
|
91
|
+
2,
|
|
92
|
+
),
|
|
93
|
+
systemPriority: "medium",
|
|
94
|
+
},
|
|
95
|
+
throttleKey: `pairing_timeout|${deviceModel || "unknown"}|${deviceName || "unknown"}`,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const status = toAutomaticReportSubmissionStatus(result)
|
|
99
|
+
logAutomaticReportSubmissionStatus(LOG_TAG, status, deviceModel, deviceName)
|
|
100
|
+
return status
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function waitForReadyDuringPairing(options: PairingReadyWaitOptions = {}): Promise<boolean> {
|
|
104
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_PAIRING_BOOT_TIMEOUT_MS
|
|
105
|
+
let showGlassesBooting = false
|
|
106
|
+
const notReadySub = BluetoothSdk.addListener("glasses_not_ready", () => {
|
|
107
|
+
showGlassesBooting = true
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
const ready = await waitForGlassesReady({
|
|
112
|
+
getConnection: () => useGlassesStore.getState().connection,
|
|
113
|
+
subscribe: (listener) => useGlassesStore.subscribe((state) => state.connection, listener),
|
|
114
|
+
timeoutMs,
|
|
115
|
+
signal: options.signal,
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
if (!ready && !options.signal?.aborted) {
|
|
119
|
+
void submitPairingBootTimeoutReport({
|
|
120
|
+
deviceModel: options.deviceModel,
|
|
121
|
+
deviceName: options.deviceName,
|
|
122
|
+
showGlassesBooting,
|
|
123
|
+
elapsedMs: timeoutMs,
|
|
124
|
+
route: options.route,
|
|
125
|
+
}).catch((error) => {
|
|
126
|
+
console.error(`[${LOG_TAG}] Unexpected error:`, error)
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return ready
|
|
131
|
+
} finally {
|
|
132
|
+
notReadySub.remove()
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function waitForBluetoothClassic(
|
|
137
|
+
options: Pick<PairingReadyWaitOptions, "timeoutMs" | "signal"> = {},
|
|
138
|
+
): Promise<boolean> {
|
|
139
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_BT_CLASSIC_TIMEOUT_MS
|
|
140
|
+
return new Promise((resolve) => {
|
|
141
|
+
if (options.signal?.aborted) {
|
|
142
|
+
resolve(false)
|
|
143
|
+
return
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const initial = useGlassesStore.getState().bluetoothClassicConnected
|
|
147
|
+
if (initial) {
|
|
148
|
+
resolve(true)
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
let settled = false
|
|
153
|
+
let timeout: ReturnType<typeof setTimeout> | null = null
|
|
154
|
+
let unsubscribe: (() => void) | null = null
|
|
155
|
+
let onAbort: (() => void) | null = null
|
|
156
|
+
|
|
157
|
+
const finish = (value: boolean) => {
|
|
158
|
+
if (settled) return
|
|
159
|
+
settled = true
|
|
160
|
+
if (timeout) clearTimeout(timeout)
|
|
161
|
+
if (unsubscribe) unsubscribe()
|
|
162
|
+
if (onAbort && options.signal) options.signal.removeEventListener("abort", onAbort)
|
|
163
|
+
resolve(value)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (options.signal) {
|
|
167
|
+
onAbort = () => finish(false)
|
|
168
|
+
options.signal.addEventListener("abort", onAbort)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
unsubscribe = useGlassesStore.subscribe(
|
|
172
|
+
(s) => s.bluetoothClassicConnected,
|
|
173
|
+
(connected) => {
|
|
174
|
+
if (connected) finish(true)
|
|
175
|
+
},
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
timeout = setTimeout(() => {
|
|
179
|
+
finish(useGlassesStore.getState().bluetoothClassicConnected)
|
|
180
|
+
}, timeoutMs)
|
|
181
|
+
})
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export const pairing = {
|
|
185
|
+
readiness: (): PairingReadinessSnapshot => projectReadiness(),
|
|
186
|
+
onReadiness: (cb: (readiness: PairingReadinessSnapshot) => void): (() => void) => {
|
|
187
|
+
let last = JSON.stringify(projectReadiness())
|
|
188
|
+
return useGlassesStore.subscribe(() => {
|
|
189
|
+
const snap = projectReadiness()
|
|
190
|
+
const key = JSON.stringify(snap)
|
|
191
|
+
if (key === last) return
|
|
192
|
+
last = key
|
|
193
|
+
cb(snap)
|
|
194
|
+
})
|
|
195
|
+
},
|
|
196
|
+
|
|
197
|
+
// --- pairing-identity lifecycle (the PairingIdentity read-model + the JS-owned
|
|
198
|
+
// identity writes; promotion to `paired` only ever happens natively) ---
|
|
199
|
+
/** The identity lifecycle snapshot: none | pending (chosen, never paired) | paired. */
|
|
200
|
+
identity: (): IdentitySnapshot => projectPairingIdentity(),
|
|
201
|
+
/** Subscribe to identity changes; fires only when the projected snapshot changes.
|
|
202
|
+
* Returns an unsubscribe. */
|
|
203
|
+
onIdentity: (cb: (identity: IdentitySnapshot) => void): (() => void) => subscribePairingIdentity(cb),
|
|
204
|
+
/** Mark the chosen model as the pending selection (the scan-entry write); the
|
|
205
|
+
* host renders it as a finish-pairing affordance until pairing succeeds. */
|
|
206
|
+
markPendingSelection: (model: string) => markPendingSelection(model),
|
|
207
|
+
|
|
208
|
+
/** Start scanning for nearby glasses. Results land on `searchResults()`/`onFound()`. */
|
|
209
|
+
scan: (...args: Parameters<typeof BluetoothSdk.startScan>) => BluetoothSdk.startScan(...args),
|
|
210
|
+
/** Whether a scan is currently in progress. */
|
|
211
|
+
scanning: (): boolean => useCoreStore.getState().searching,
|
|
212
|
+
/** Subscribe to scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */
|
|
213
|
+
onScanning: (cb: (scanning: boolean) => void): (() => void) => useCoreStore.subscribe((s) => s.searching, cb),
|
|
214
|
+
/** Whether a controller scan is currently in progress. */
|
|
215
|
+
scanningController: (): boolean => useCoreStore.getState().searchingController,
|
|
216
|
+
/** Subscribe to controller-scan-in-progress changes; fires only when it changes. Returns an unsubscribe. */
|
|
217
|
+
onScanningController: (cb: (scanning: boolean) => void): (() => void) =>
|
|
218
|
+
useCoreStore.subscribe((s) => s.searchingController, cb),
|
|
219
|
+
/** Whether the phone has another Bluetooth (audio) device connected — the BT Classic pairing hint. */
|
|
220
|
+
otherBtConnected: (): boolean => useCoreStore.getState().otherBtConnected,
|
|
221
|
+
/** Subscribe to other-Bluetooth-device-connected changes; fires only when it changes. Returns an unsubscribe. */
|
|
222
|
+
onOtherBtConnected: (cb: (connected: boolean) => void): (() => void) =>
|
|
223
|
+
useCoreStore.subscribe((s) => s.otherBtConnected, cb),
|
|
224
|
+
/** The current scan results (snapshot). */
|
|
225
|
+
// Copy the array AND each entry: neither the list nor the Device objects may
|
|
226
|
+
// leak as mutable references into the store.
|
|
227
|
+
searchResults: () => useCoreStore.getState().searchResults.map((result) => ({...result})),
|
|
228
|
+
/** Subscribe to scan-result changes; fires only when they change. Returns an unsubscribe. */
|
|
229
|
+
onFound: (cb: (results: ReturnType<typeof useCoreStore.getState>["searchResults"]) => void): (() => void) => {
|
|
230
|
+
let last = JSON.stringify(useCoreStore.getState().searchResults)
|
|
231
|
+
return useCoreStore.subscribe(() => {
|
|
232
|
+
const results = useCoreStore.getState().searchResults
|
|
233
|
+
const key = JSON.stringify(results)
|
|
234
|
+
if (key === last) return
|
|
235
|
+
last = key
|
|
236
|
+
// Copy like searchResults(): listeners must not mutate shared scan state.
|
|
237
|
+
cb(results.map((result) => ({...result})))
|
|
238
|
+
})
|
|
239
|
+
},
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Pair with (connect to) a discovered device. Two-phase identity: the connect
|
|
243
|
+
* attempt only marks the device as pending (`saveAsDefault: false` — no eager
|
|
244
|
+
* default-device write); the native layer promotes it to the default wearable
|
|
245
|
+
* when pairing actually succeeds (handleDeviceReady), so an abandoned or
|
|
246
|
+
* failed attempt can't leave a default identity with no paired device behind.
|
|
247
|
+
*/
|
|
248
|
+
pair: async (device: Device, options?: ConnectOptions): Promise<void> => {
|
|
249
|
+
await pushAllBluetoothSettings()
|
|
250
|
+
return BluetoothSdk.connect(device, {...options, saveAsDefault: false})
|
|
251
|
+
},
|
|
252
|
+
/** Set a device as the default for subsequent `glasses.connectDefault()`. */
|
|
253
|
+
setDefault: (...args: Parameters<typeof BluetoothSdk.setDefaultDevice>) => BluetoothSdk.setDefaultDevice(...args),
|
|
254
|
+
/**
|
|
255
|
+
* Prime the native Bluetooth Classic audio watcher with the picked device.
|
|
256
|
+
* The iOS Mentra Live flow pairs Classic audio BEFORE any BLE connect
|
|
257
|
+
* exists, and native detects the pairing by matching the connected audio
|
|
258
|
+
* route against its device_name — which two-phase identity no longer sets
|
|
259
|
+
* at selection time. This is native-only routing state (device_name has no
|
|
260
|
+
* native→JS echo): the phone's persisted identity is untouched, and
|
|
261
|
+
* promotion still happens only at pairing success.
|
|
262
|
+
*/
|
|
263
|
+
setBluetoothClassicTarget: (device: Device): Promise<void> =>
|
|
264
|
+
BluetoothSdk.updateBluetoothSettings({device_name: device.name}),
|
|
265
|
+
/**
|
|
266
|
+
* Abandon an in-flight pairing attempt (back-out, failure retry, conflict
|
|
267
|
+
* retry) without destroying an existing pairing. The decision comes from the
|
|
268
|
+
* LIVE hydrated default-device read — never from flow-entry state, because a
|
|
269
|
+
* pairing can PROMOTE while the flow is open (the glasses finish pairing
|
|
270
|
+
* even as the user backs out of the UI), and an entry snapshot would forget
|
|
271
|
+
* that brand-new pairing:
|
|
272
|
+
* - Default device exists and glasses are connected (nothing in flight — an
|
|
273
|
+
* attempt drops the link first): stop the scan, touch nothing else.
|
|
274
|
+
* - Default device exists with an attempt in flight: cancel it, then re-seed
|
|
275
|
+
* the native identity from the phone's persisted settings — the attempt's
|
|
276
|
+
* connect-by-name overwrote the native device_name, so a later
|
|
277
|
+
* connectDefault() would otherwise target the abandoned device.
|
|
278
|
+
* - No default device (genuinely unpaired attempt): also forget, clearing
|
|
279
|
+
* the partial native pairing state.
|
|
280
|
+
* The read fails OPEN to "preserve" — a transient failure must never wipe a
|
|
281
|
+
* real pairing. The `pending_wearable` marker is deliberately left alone —
|
|
282
|
+
* the host renders it as a finish-pairing affordance.
|
|
283
|
+
*/
|
|
284
|
+
abandonAttempt: async (): Promise<void> => {
|
|
285
|
+
const nativeHasDefault = await hasDefaultDevice().catch(() => true)
|
|
286
|
+
if (nativeHasDefault && isGlassesConnected(useGlassesStore.getState().connection)) {
|
|
287
|
+
// Still connected means no connect attempt is in flight (an attempt drops
|
|
288
|
+
// the existing link first): the user browsed the scan and backed out.
|
|
289
|
+
// Stop the scan and leave the live pairing untouched.
|
|
290
|
+
console.log("PairingIdentity: abandonAttempt — pairing intact and connected; stopping scan only")
|
|
291
|
+
await BluetoothSdk.stopScan()
|
|
292
|
+
return
|
|
293
|
+
}
|
|
294
|
+
await BluetoothSdk.disconnect()
|
|
295
|
+
if (projectPairingIdentity().kind === "paired") {
|
|
296
|
+
// The persisted settings describe a COMPLETE pairing: restore it to
|
|
297
|
+
// native (the attempt's connect-by-name overwrote the native
|
|
298
|
+
// device_name; and if native somehow lost its default entirely, this
|
|
299
|
+
// repairs the divergence instead of forgetting a real pairing).
|
|
300
|
+
console.log("PairingIdentity: abandonAttempt — preserving pairing; attempt cancelled, native identity re-seeded")
|
|
301
|
+
await pushAllBluetoothSettings()
|
|
302
|
+
} else if (nativeHasDefault) {
|
|
303
|
+
// Mid-relay: native promoted and its echoes are still landing — the
|
|
304
|
+
// incomplete JS snapshot must not be pushed over the fresher native
|
|
305
|
+
// identity (the on-connect replay's race). Native holds the truth.
|
|
306
|
+
console.log("PairingIdentity: abandonAttempt — preserving pairing; JS identity mid-relay, native kept as-is")
|
|
307
|
+
} else {
|
|
308
|
+
// Forgetting requires CONSENSUS: no native default AND no complete
|
|
309
|
+
// persisted pairing — a genuinely partial attempt.
|
|
310
|
+
console.log("PairingIdentity: abandonAttempt — no pairing on either layer; forgetting the partial attempt")
|
|
311
|
+
await BluetoothSdk.forget()
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
|
|
315
|
+
/** Subscribe to pairing failures; returns an unsubscribe. */
|
|
316
|
+
onPairFailure: (cb: (event: PairFailureEvent) => void): (() => void) => {
|
|
317
|
+
const sub = BluetoothSdk.addListener("pair_failure", cb)
|
|
318
|
+
return () => sub.remove()
|
|
319
|
+
},
|
|
320
|
+
/** Subscribe to glasses-not-ready events during pairing; returns an unsubscribe. */
|
|
321
|
+
onGlassesNotReady: (cb: (event: GlassesNotReadyEvent) => void): (() => void) => {
|
|
322
|
+
const sub = BluetoothSdk.addListener("glasses_not_ready", cb)
|
|
323
|
+
return () => sub.remove()
|
|
324
|
+
},
|
|
325
|
+
/** Wait for paired glasses to finish booting; engine files the timeout diagnostic. */
|
|
326
|
+
waitForReady: waitForReadyDuringPairing,
|
|
327
|
+
/** Wait briefly for Bluetooth Classic to come up after BLE pairing. */
|
|
328
|
+
waitForBluetoothClassic,
|
|
329
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* permissions facade — `engine.permissions`: the raw OS-permission ops the runtime
|
|
3
|
+
* needs, mapped from feature keys to react-native-permissions. This is the LEAN
|
|
4
|
+
* surface (check/request/openSettings/requirementsForMiniapp) — the host keeps its
|
|
5
|
+
* own UI helpers (rationale dialogs, denied-warnings) on top; engine stays free of
|
|
6
|
+
* i18n/theme/AlertUtils.
|
|
7
|
+
*/
|
|
8
|
+
import {Platform, Linking, PermissionsAndroid, type Permission as AndroidPermission} from "react-native"
|
|
9
|
+
import {check, request, PERMISSIONS, RESULTS, type Permission} from "react-native-permissions"
|
|
10
|
+
|
|
11
|
+
import appRegistry from "../services/AppRegistry"
|
|
12
|
+
import type {AppletPermission} from "../types"
|
|
13
|
+
|
|
14
|
+
/** OEM-facing feature keys (mapped to OS permissions per platform). */
|
|
15
|
+
export const PermissionFeatures = {
|
|
16
|
+
MICROPHONE: "microphone",
|
|
17
|
+
CAMERA: "camera",
|
|
18
|
+
CALENDAR: "calendar",
|
|
19
|
+
LOCATION: "location",
|
|
20
|
+
LOCAL_WIFI: "local_wifi",
|
|
21
|
+
BACKGROUND_LOCATION: "background_location",
|
|
22
|
+
BLUETOOTH: "bluetooth",
|
|
23
|
+
PHONE_STATE: "phone_state",
|
|
24
|
+
POST_NOTIFICATIONS: "post_notifications",
|
|
25
|
+
} as const
|
|
26
|
+
|
|
27
|
+
const ANDROID = PermissionsAndroid.PERMISSIONS
|
|
28
|
+
const apiLevel = typeof Platform.Version === "number" ? Platform.Version : parseInt(String(Platform.Version), 10)
|
|
29
|
+
const requiresSeparateAndroidBackgroundLocation = apiLevel >= 29
|
|
30
|
+
|
|
31
|
+
export function localWifiPermissionForAndroid(
|
|
32
|
+
androidApiLevel: number,
|
|
33
|
+
androidPermissions: typeof PermissionsAndroid.PERMISSIONS = ANDROID,
|
|
34
|
+
): AndroidPermission {
|
|
35
|
+
return androidApiLevel >= 33 ? androidPermissions.NEARBY_WIFI_DEVICES : androidPermissions.ACCESS_FINE_LOCATION
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function areAndroidPermissionsGranted(perms: AndroidPermission[]): Promise<boolean> {
|
|
39
|
+
for (const p of perms) {
|
|
40
|
+
if (!(await PermissionsAndroid.check(p))) return false
|
|
41
|
+
}
|
|
42
|
+
return true
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function requestAndroidPermissions(perms: AndroidPermission[]): Promise<boolean> {
|
|
46
|
+
const results = await PermissionsAndroid.requestMultiple(perms)
|
|
47
|
+
return perms.every((p) => results[p] === PermissionsAndroid.RESULTS.GRANTED)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function checkAndroidBackgroundLocation(): Promise<boolean> {
|
|
51
|
+
const hasForegroundLocation = await areAndroidPermissionsGranted([ANDROID.ACCESS_FINE_LOCATION])
|
|
52
|
+
if (!hasForegroundLocation || !requiresSeparateAndroidBackgroundLocation) return hasForegroundLocation
|
|
53
|
+
|
|
54
|
+
return PermissionsAndroid.check(ANDROID.ACCESS_BACKGROUND_LOCATION)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function requestAndroidBackgroundLocation(): Promise<boolean> {
|
|
58
|
+
const hasForegroundLocation = await requestAndroidPermissions([ANDROID.ACCESS_FINE_LOCATION])
|
|
59
|
+
if (!hasForegroundLocation || !requiresSeparateAndroidBackgroundLocation) return hasForegroundLocation
|
|
60
|
+
|
|
61
|
+
if (await PermissionsAndroid.check(ANDROID.ACCESS_BACKGROUND_LOCATION)) return true
|
|
62
|
+
|
|
63
|
+
const result = await PermissionsAndroid.request(ANDROID.ACCESS_BACKGROUND_LOCATION)
|
|
64
|
+
return result === PermissionsAndroid.RESULTS.GRANTED
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function iosPerms(feature: string): Permission[] {
|
|
68
|
+
switch (feature) {
|
|
69
|
+
case PermissionFeatures.MICROPHONE:
|
|
70
|
+
return [PERMISSIONS.IOS.MICROPHONE]
|
|
71
|
+
case PermissionFeatures.CAMERA:
|
|
72
|
+
return [PERMISSIONS.IOS.CAMERA]
|
|
73
|
+
case PermissionFeatures.CALENDAR:
|
|
74
|
+
return [PERMISSIONS.IOS.CALENDARS]
|
|
75
|
+
case PermissionFeatures.LOCATION:
|
|
76
|
+
return [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE]
|
|
77
|
+
case PermissionFeatures.LOCAL_WIFI:
|
|
78
|
+
return []
|
|
79
|
+
case PermissionFeatures.BACKGROUND_LOCATION:
|
|
80
|
+
// iOS won't grant ALWAYS without WHEN_IN_USE first — request both (matches
|
|
81
|
+
// the host PermissionsUtils mapping), else a cold request can't escalate.
|
|
82
|
+
return [PERMISSIONS.IOS.LOCATION_WHEN_IN_USE, PERMISSIONS.IOS.LOCATION_ALWAYS]
|
|
83
|
+
case PermissionFeatures.BLUETOOTH:
|
|
84
|
+
return [PERMISSIONS.IOS.BLUETOOTH]
|
|
85
|
+
default:
|
|
86
|
+
return []
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function androidPerms(feature: string): AndroidPermission[] {
|
|
91
|
+
switch (feature) {
|
|
92
|
+
case PermissionFeatures.MICROPHONE:
|
|
93
|
+
return [ANDROID.RECORD_AUDIO]
|
|
94
|
+
case PermissionFeatures.CAMERA:
|
|
95
|
+
return [ANDROID.CAMERA]
|
|
96
|
+
case PermissionFeatures.CALENDAR:
|
|
97
|
+
// Expo Calendar requires both grants on Android, including for read APIs.
|
|
98
|
+
// The miniapp-facing calendar API remains read-only.
|
|
99
|
+
return [ANDROID.READ_CALENDAR, ANDROID.WRITE_CALENDAR]
|
|
100
|
+
case PermissionFeatures.LOCATION:
|
|
101
|
+
case PermissionFeatures.BACKGROUND_LOCATION:
|
|
102
|
+
return [ANDROID.ACCESS_FINE_LOCATION]
|
|
103
|
+
case PermissionFeatures.LOCAL_WIFI:
|
|
104
|
+
return [localWifiPermissionForAndroid(apiLevel)]
|
|
105
|
+
case PermissionFeatures.PHONE_STATE:
|
|
106
|
+
return [ANDROID.READ_PHONE_STATE]
|
|
107
|
+
case PermissionFeatures.BLUETOOTH:
|
|
108
|
+
return apiLevel >= 31 ? [ANDROID.BLUETOOTH_SCAN, ANDROID.BLUETOOTH_CONNECT, ANDROID.BLUETOOTH_ADVERTISE] : []
|
|
109
|
+
case PermissionFeatures.POST_NOTIFICATIONS:
|
|
110
|
+
return apiLevel >= 33 ? [ANDROID.POST_NOTIFICATIONS] : []
|
|
111
|
+
default:
|
|
112
|
+
return []
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export const permissions = {
|
|
117
|
+
/** Is the given feature's OS permission currently granted? */
|
|
118
|
+
async check(feature: string): Promise<boolean> {
|
|
119
|
+
if (Platform.OS === "android") {
|
|
120
|
+
if (feature === PermissionFeatures.BACKGROUND_LOCATION) return checkAndroidBackgroundLocation()
|
|
121
|
+
|
|
122
|
+
const perms = androidPerms(feature)
|
|
123
|
+
if (perms.length === 0) return true // nothing to ask on this OS/version
|
|
124
|
+
// Every permission in the group must be granted (e.g. bluetooth =
|
|
125
|
+
// scan+connect+advertise, calendar = read+write) — matches the iOS branch.
|
|
126
|
+
return areAndroidPermissionsGranted(perms)
|
|
127
|
+
}
|
|
128
|
+
const perms = iosPerms(feature)
|
|
129
|
+
if (perms.length === 0) return true
|
|
130
|
+
for (const p of perms) {
|
|
131
|
+
const status = await check(p)
|
|
132
|
+
if (status !== RESULTS.GRANTED && status !== RESULTS.LIMITED) return false
|
|
133
|
+
}
|
|
134
|
+
return true
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
/** Request the given feature's OS permission. Resolves to whether it's granted. */
|
|
138
|
+
async request(feature: string): Promise<boolean> {
|
|
139
|
+
if (Platform.OS === "android") {
|
|
140
|
+
if (feature === PermissionFeatures.BACKGROUND_LOCATION) return requestAndroidBackgroundLocation()
|
|
141
|
+
|
|
142
|
+
const perms = androidPerms(feature)
|
|
143
|
+
if (perms.length === 0) return true
|
|
144
|
+
// Granted only when EVERY permission in the group was granted.
|
|
145
|
+
return requestAndroidPermissions(perms)
|
|
146
|
+
}
|
|
147
|
+
const perms = iosPerms(feature)
|
|
148
|
+
if (perms.length === 0) return true
|
|
149
|
+
let granted = true
|
|
150
|
+
for (const p of perms) {
|
|
151
|
+
const result = await request(p)
|
|
152
|
+
if (result !== RESULTS.GRANTED && result !== RESULTS.LIMITED) granted = false
|
|
153
|
+
}
|
|
154
|
+
return granted
|
|
155
|
+
},
|
|
156
|
+
|
|
157
|
+
/** Open the OS settings app (so the user can grant a blocked permission). */
|
|
158
|
+
openSettings: (): Promise<void> => Linking.openSettings(),
|
|
159
|
+
|
|
160
|
+
/** The permissions a given installed miniapp declares it needs. */
|
|
161
|
+
async requirementsForMiniapp(packageName: string): Promise<AppletPermission[]> {
|
|
162
|
+
const apps = await appRegistry.getInstalledMiniapps()
|
|
163
|
+
return apps.find((a) => a.packageName === packageName)?.permissions ?? []
|
|
164
|
+
},
|
|
165
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* phoneNotifications facade — `engine.phoneNotifications`: forward phone
|
|
3
|
+
* notifications to the glasses, with a per-app blocklist. Android-only (the
|
|
4
|
+
* NotificationListenerService); the getters return sensible defaults on iOS.
|
|
5
|
+
*
|
|
6
|
+
* Enabled-state + blocklist are engine settings (auto-synced to the native
|
|
7
|
+
* listener); the installed-apps list + the listener permission are CrustModule.
|
|
8
|
+
*/
|
|
9
|
+
import {Platform} from "react-native"
|
|
10
|
+
import CrustModule from "@mentra/crust"
|
|
11
|
+
import {useSettingsStore, SETTINGS} from "../stores/settings"
|
|
12
|
+
|
|
13
|
+
export const phoneNotifications = {
|
|
14
|
+
/** Is phone-notification forwarding enabled? (false on iOS) */
|
|
15
|
+
enabled: (): boolean => {
|
|
16
|
+
if (Platform.OS !== "android") return false
|
|
17
|
+
return useSettingsStore.getState().getSetting(SETTINGS.notifications_enabled.key) ?? true
|
|
18
|
+
},
|
|
19
|
+
/** Enable/disable phone-notification forwarding. (no-op on iOS) */
|
|
20
|
+
setEnabled: (enabled: boolean) => {
|
|
21
|
+
if (Platform.OS !== "android") return
|
|
22
|
+
return useSettingsStore.getState().setSetting(SETTINGS.notifications_enabled.key, enabled)
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
/** The phone's installed apps (package, name, icon). (empty on iOS) */
|
|
26
|
+
installedApps: (): Promise<Array<{packageName: string; appName: string; icon: string | null}>> => {
|
|
27
|
+
if (Platform.OS !== "android") return Promise.resolve([])
|
|
28
|
+
return CrustModule.getInstalledApps()
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
/** The per-app blocklist (package names whose notifications are NOT forwarded). */
|
|
32
|
+
blocklist: (): string[] => {
|
|
33
|
+
const b = useSettingsStore.getState().getSetting(SETTINGS.notifications_blocklist.key)
|
|
34
|
+
return Array.isArray(b) ? b : []
|
|
35
|
+
},
|
|
36
|
+
/** Replace the per-app blocklist. */
|
|
37
|
+
setBlocklist: (packageNames: string[]) =>
|
|
38
|
+
useSettingsStore.getState().setSetting(SETTINGS.notifications_blocklist.key, packageNames),
|
|
39
|
+
|
|
40
|
+
/** Does the app have the Android notification-listener permission? (false on iOS) */
|
|
41
|
+
hasListenerPermission: (): Promise<boolean> => {
|
|
42
|
+
if (Platform.OS !== "android") return Promise.resolve(false)
|
|
43
|
+
return CrustModule.hasNotificationListenerPermission()
|
|
44
|
+
},
|
|
45
|
+
/** Open the OS settings to grant the notification-listener permission. (no-op on iOS) */
|
|
46
|
+
requestListenerPermission: () => {
|
|
47
|
+
if (Platform.OS !== "android") return
|
|
48
|
+
return CrustModule.openNotificationListenerSettings()
|
|
49
|
+
},
|
|
50
|
+
}
|