@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,166 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Capabilities,
|
|
3
|
+
HardwareRequirement,
|
|
4
|
+
HardwareType,
|
|
5
|
+
HardwareRequirementLevel,
|
|
6
|
+
DeviceTypes,
|
|
7
|
+
} from "../../types"
|
|
8
|
+
import {simulatedGlasses} from "../../types"
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Result of a hardware compatibility check
|
|
12
|
+
*/
|
|
13
|
+
export interface CompatibilityResult {
|
|
14
|
+
isCompatible: boolean
|
|
15
|
+
missingRequired: HardwareRequirement[]
|
|
16
|
+
missingOptional: HardwareRequirement[]
|
|
17
|
+
warnings: string[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Service for checking hardware compatibility between apps and glasses
|
|
22
|
+
*/
|
|
23
|
+
export class HardwareCompatibility {
|
|
24
|
+
/**
|
|
25
|
+
* Check if app is compatible with given device capabilities
|
|
26
|
+
* @param app The app to check
|
|
27
|
+
* @param capabilities The device capabilities (null if no device connected)
|
|
28
|
+
* @returns Detailed compatibility result
|
|
29
|
+
*/
|
|
30
|
+
static checkCompatibility(
|
|
31
|
+
hardwareRequirements: HardwareRequirement[],
|
|
32
|
+
capabilities: Capabilities | null,
|
|
33
|
+
): CompatibilityResult {
|
|
34
|
+
const result: CompatibilityResult = {
|
|
35
|
+
isCompatible: true,
|
|
36
|
+
missingRequired: [],
|
|
37
|
+
missingOptional: [],
|
|
38
|
+
warnings: [],
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// If no hardware requirements specified, app is compatible with any hardware
|
|
42
|
+
if (hardwareRequirements.length === 0) {
|
|
43
|
+
return result
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// If no capabilities available assume simulated glasses:
|
|
47
|
+
if (!capabilities) {
|
|
48
|
+
capabilities = simulatedGlasses
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Check each hardware requirement
|
|
52
|
+
for (const requirement of hardwareRequirements) {
|
|
53
|
+
const hasHardware = this.checkHardwareAvailable(requirement.type, capabilities!)
|
|
54
|
+
if (!hasHardware) {
|
|
55
|
+
if (requirement.level === HardwareRequirementLevel.REQUIRED) {
|
|
56
|
+
result.missingRequired.push(requirement)
|
|
57
|
+
result.isCompatible = false
|
|
58
|
+
} else {
|
|
59
|
+
result.missingOptional.push(requirement)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return result
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Check if specific hardware is available in capabilities
|
|
69
|
+
* @param hardwareType The type of hardware to check
|
|
70
|
+
* @param capabilities The device capabilities
|
|
71
|
+
* @returns true if hardware is available
|
|
72
|
+
*/
|
|
73
|
+
private static checkHardwareAvailable(hardwareType: HardwareType, capabilities: Capabilities): boolean {
|
|
74
|
+
if (hardwareType === HardwareType.EXIST) {
|
|
75
|
+
if (capabilities.modelName === DeviceTypes.NONE) {
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
return true
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
switch (hardwareType) {
|
|
82
|
+
case HardwareType.CAMERA:
|
|
83
|
+
return capabilities.hasCamera
|
|
84
|
+
|
|
85
|
+
case HardwareType.DISPLAY:
|
|
86
|
+
return capabilities.hasDisplay
|
|
87
|
+
|
|
88
|
+
case HardwareType.MICROPHONE:
|
|
89
|
+
return capabilities.hasMicrophone
|
|
90
|
+
|
|
91
|
+
case HardwareType.SPEAKER:
|
|
92
|
+
return capabilities.hasSpeaker
|
|
93
|
+
|
|
94
|
+
case HardwareType.IMU:
|
|
95
|
+
return capabilities.hasIMU
|
|
96
|
+
|
|
97
|
+
case HardwareType.BUTTON:
|
|
98
|
+
return capabilities.hasButton
|
|
99
|
+
|
|
100
|
+
case HardwareType.LIGHT:
|
|
101
|
+
return capabilities.hasLight
|
|
102
|
+
|
|
103
|
+
case HardwareType.WIFI:
|
|
104
|
+
return capabilities.hasWifi
|
|
105
|
+
|
|
106
|
+
default:
|
|
107
|
+
// Unknown hardware type - assume not available
|
|
108
|
+
return false
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get human-readable compatibility message
|
|
114
|
+
* @param result The compatibility check result
|
|
115
|
+
* @returns User-friendly message about compatibility
|
|
116
|
+
*/
|
|
117
|
+
static getCompatibilityMessage(result: CompatibilityResult): string {
|
|
118
|
+
if (result.isCompatible) {
|
|
119
|
+
if (result.missingOptional.length > 0) {
|
|
120
|
+
const optionalHardware = result.missingOptional.map((req) => req.type.toLowerCase()).join(", ")
|
|
121
|
+
return `This app works with your glasses but has optional features that require: ${optionalHardware}`
|
|
122
|
+
}
|
|
123
|
+
return "This app is fully compatible with your glasses"
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const requiredHardware = result.missingRequired.map((req) => req.type.toLowerCase()).join(", ")
|
|
127
|
+
|
|
128
|
+
if (result.missingRequired.length === 1) {
|
|
129
|
+
return `This app requires a ${requiredHardware} which is not available on your connected glasses`
|
|
130
|
+
} else {
|
|
131
|
+
return `This app requires the following hardware which is not available on your connected glasses: ${requiredHardware}`
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Get detailed compatibility messages including descriptions
|
|
137
|
+
* @param result The compatibility check result
|
|
138
|
+
* @returns Array of detailed messages
|
|
139
|
+
*/
|
|
140
|
+
static getDetailedMessages(result: CompatibilityResult): string[] {
|
|
141
|
+
const messages: string[] = []
|
|
142
|
+
|
|
143
|
+
// Add warnings first
|
|
144
|
+
messages.push(...result.warnings)
|
|
145
|
+
|
|
146
|
+
// Add missing required hardware
|
|
147
|
+
for (const req of result.missingRequired) {
|
|
148
|
+
let message = `❌ Missing required ${req.type.toLowerCase()}`
|
|
149
|
+
if (req.description) {
|
|
150
|
+
message += `: ${req.description}`
|
|
151
|
+
}
|
|
152
|
+
messages.push(message)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Add missing optional hardware
|
|
156
|
+
for (const req of result.missingOptional) {
|
|
157
|
+
let message = `⚠️ Missing optional ${req.type.toLowerCase()}`
|
|
158
|
+
if (req.description) {
|
|
159
|
+
message += `: ${req.description}`
|
|
160
|
+
}
|
|
161
|
+
messages.push(message)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return messages
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./hardware"
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* miniappGlobals — shared builder for the window.MentraOS globals injected
|
|
3
|
+
* into every miniapp WebView (both cloud and local).
|
|
4
|
+
*
|
|
5
|
+
* Authors should be able to use one API in their miniapp code regardless of
|
|
6
|
+
* whether it's hosted in the cloud or on-device. So both injection paths
|
|
7
|
+
* (webview.tsx for cloud miniapps, MiniappHost.tsx for local miniapps) funnel
|
|
8
|
+
* through this util.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {Dimensions, Platform} from "react-native"
|
|
12
|
+
|
|
13
|
+
export interface MiniappSafeArea {
|
|
14
|
+
top: number
|
|
15
|
+
bottom: number
|
|
16
|
+
left: number
|
|
17
|
+
right: number
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface CapsuleMenuRect {
|
|
21
|
+
top: number
|
|
22
|
+
right: number
|
|
23
|
+
bottom: number
|
|
24
|
+
left: number
|
|
25
|
+
width: number
|
|
26
|
+
height: number
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The capsule menu bounding rect in the WebView's own coordinate space.
|
|
31
|
+
*
|
|
32
|
+
* Keep in sync with CapsuleMenu.tsx:
|
|
33
|
+
* - CapsuleButton height ≈ h-7.5 (30px), width ≈ 73px
|
|
34
|
+
* - Positioned at right-2 (8px), top = theme.spacing.s2 (8px) below insets.top
|
|
35
|
+
*/
|
|
36
|
+
const CAPSULE_MENU_HEIGHT = 30
|
|
37
|
+
const CAPSULE_MENU_WIDTH = 73
|
|
38
|
+
const CAPSULE_MENU_PADDING = 8
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @param topInsetOffset extra top offset to add when the WebView container does
|
|
42
|
+
* NOT already pad by the safe-area inset (i.e. WebView fills edge-to-edge under
|
|
43
|
+
* the status bar). Pass `insets.top` in that case, or 0 when the container
|
|
44
|
+
* already applies top padding.
|
|
45
|
+
*/
|
|
46
|
+
export function getCapsuleMenuRect(topInsetOffset = 0): CapsuleMenuRect {
|
|
47
|
+
const screenWidth = Dimensions.get("window").width
|
|
48
|
+
const top = topInsetOffset + CAPSULE_MENU_PADDING
|
|
49
|
+
return {
|
|
50
|
+
top,
|
|
51
|
+
right: CAPSULE_MENU_PADDING,
|
|
52
|
+
bottom: top + CAPSULE_MENU_HEIGHT,
|
|
53
|
+
left: screenWidth - CAPSULE_MENU_PADDING - CAPSULE_MENU_WIDTH,
|
|
54
|
+
width: CAPSULE_MENU_WIDTH,
|
|
55
|
+
height: CAPSULE_MENU_HEIGHT,
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export type MiniappColorScheme = "light" | "dark"
|
|
60
|
+
|
|
61
|
+
export interface BuildMiniappGlobalsOptions {
|
|
62
|
+
packageName?: string
|
|
63
|
+
capabilities?: string[]
|
|
64
|
+
miniappLocal?: boolean
|
|
65
|
+
miniappDeveloperMode?: boolean
|
|
66
|
+
safeAreaInsets: MiniappSafeArea
|
|
67
|
+
/**
|
|
68
|
+
* True when the WebView container renders edge-to-edge (no top padding for
|
|
69
|
+
* the status bar). In that case the capsule menu rect needs to shift down by
|
|
70
|
+
* the top inset so its coords match where it's actually drawn on screen.
|
|
71
|
+
*/
|
|
72
|
+
webviewFillsStatusBar?: boolean
|
|
73
|
+
/** Current host color scheme. Miniapps may follow this to match the phone. */
|
|
74
|
+
colorScheme?: MiniappColorScheme
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Returns the JS string to inject into a miniapp WebView before its content
|
|
79
|
+
* loads. Sets window.MentraOS with the standard fields miniapps read:
|
|
80
|
+
*
|
|
81
|
+
* window.MentraOS = {
|
|
82
|
+
* platform, packageName?, capabilities, safeAreaInsets, capsuleMenu,
|
|
83
|
+
* miniappLocal?, miniappDeveloperMode?
|
|
84
|
+
* }
|
|
85
|
+
*
|
|
86
|
+
* Also defines a stub window.receiveNativeMessage so the miniapp can safely
|
|
87
|
+
* assign to it before the native bridge wires in.
|
|
88
|
+
*/
|
|
89
|
+
export function buildMiniappGlobalsScript(opts: BuildMiniappGlobalsOptions): string {
|
|
90
|
+
const capsuleTopOffset = opts.webviewFillsStatusBar ? opts.safeAreaInsets.top : 0
|
|
91
|
+
const globals: Record<string, unknown> = {
|
|
92
|
+
platform: Platform.OS,
|
|
93
|
+
capabilities: opts.capabilities ?? ["share", "open_url", "copy_clipboard", "download"],
|
|
94
|
+
safeAreaInsets: opts.safeAreaInsets,
|
|
95
|
+
capsuleMenu: getCapsuleMenuRect(capsuleTopOffset),
|
|
96
|
+
}
|
|
97
|
+
if (opts.packageName) globals.packageName = opts.packageName
|
|
98
|
+
if (opts.miniappLocal) globals.miniappLocal = true
|
|
99
|
+
if (opts.miniappDeveloperMode) globals.miniappDeveloperMode = true
|
|
100
|
+
if (opts.colorScheme) globals.colorScheme = opts.colorScheme
|
|
101
|
+
|
|
102
|
+
// CSS custom properties that mirror the capsule menu / safe-area data.
|
|
103
|
+
// Miniapp CSS (or Tailwind arbitrary values) can read these without
|
|
104
|
+
// touching JS: e.g. `style="margin-top: var(--mentra-capsule-top)"`.
|
|
105
|
+
const capsule = globals.capsuleMenu as CapsuleMenuRect
|
|
106
|
+
const insets = opts.safeAreaInsets
|
|
107
|
+
const capsuleCenter = capsule.top + capsule.height / 2
|
|
108
|
+
const cssVars: Record<string, string> = {
|
|
109
|
+
"--mentra-safe-top": `${insets.top}px`,
|
|
110
|
+
"--mentra-safe-bottom": `${insets.bottom}px`,
|
|
111
|
+
"--mentra-safe-left": `${insets.left}px`,
|
|
112
|
+
"--mentra-safe-right": `${insets.right}px`,
|
|
113
|
+
"--mentra-capsule-top": `${capsule.top}px`,
|
|
114
|
+
"--mentra-capsule-bottom": `${capsule.bottom}px`,
|
|
115
|
+
"--mentra-capsule-left": `${capsule.left}px`,
|
|
116
|
+
"--mentra-capsule-right": `${capsule.right}px`,
|
|
117
|
+
"--mentra-capsule-width": `${capsule.width}px`,
|
|
118
|
+
"--mentra-capsule-height": `${capsule.height}px`,
|
|
119
|
+
"--mentra-capsule-center-y": `${capsuleCenter}px`,
|
|
120
|
+
// Right-side gutter to reserve so content doesn't slide under the
|
|
121
|
+
// capsule: capsule width + 16px breathing room.
|
|
122
|
+
"--mentra-capsule-gutter": `${capsule.width + 16}px`,
|
|
123
|
+
}
|
|
124
|
+
const cssVarsBlock = Object.entries(cssVars)
|
|
125
|
+
.map(([k, v]) => `${k}: ${v};`)
|
|
126
|
+
.join(" ")
|
|
127
|
+
|
|
128
|
+
// Console-tap shim: wrap console.log/warn/error/info/debug so each call
|
|
129
|
+
// also forwards a `dev_log` envelope back to the phone via
|
|
130
|
+
// ReactNativeWebView.postMessage. Dev mode forwards to the laptop's
|
|
131
|
+
// `mentra-miniapp dev` terminal; non-dev mode falls back to the React
|
|
132
|
+
// Native log stream (Metro / Xcode console / adb logcat) so installed-
|
|
133
|
+
// miniapp errors are still inspectable when there's no laptop sidecar.
|
|
134
|
+
//
|
|
135
|
+
// Also tap window.onerror and window.onunhandledrejection so synchronous
|
|
136
|
+
// throws and unhandled promise rejections surface even when the bundle
|
|
137
|
+
// never gets a chance to call console.error itself.
|
|
138
|
+
const consoleTapBlock = `
|
|
139
|
+
(function() {
|
|
140
|
+
try {
|
|
141
|
+
var levels = ["log", "warn", "error", "info", "debug"];
|
|
142
|
+
var seen = new WeakSet();
|
|
143
|
+
function safeSerialize(arg) {
|
|
144
|
+
if (arg instanceof Error) return {__error: true, message: arg.message, stack: arg.stack};
|
|
145
|
+
if (arg === null || typeof arg !== "object") return arg;
|
|
146
|
+
try {
|
|
147
|
+
return JSON.parse(JSON.stringify(arg, function(k, v) {
|
|
148
|
+
if (v !== null && typeof v === "object") {
|
|
149
|
+
if (seen.has(v)) return "[Circular]";
|
|
150
|
+
seen.add(v);
|
|
151
|
+
}
|
|
152
|
+
return v;
|
|
153
|
+
}));
|
|
154
|
+
} catch (e) {
|
|
155
|
+
try { return String(arg); } catch (_) { return "[unserializable]"; }
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
levels.forEach(function(level) {
|
|
159
|
+
var original = console[level];
|
|
160
|
+
if (typeof original !== "function") return;
|
|
161
|
+
console[level] = function() {
|
|
162
|
+
try { original.apply(console, arguments); } catch (_) {}
|
|
163
|
+
try {
|
|
164
|
+
var args = Array.prototype.slice.call(arguments).map(safeSerialize);
|
|
165
|
+
if (window.ReactNativeWebView && typeof window.ReactNativeWebView.postMessage === "function") {
|
|
166
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
167
|
+
payload: {
|
|
168
|
+
type: "dev_log",
|
|
169
|
+
level: level,
|
|
170
|
+
args: args,
|
|
171
|
+
packageName: (window.MentraOS && window.MentraOS.packageName) || null,
|
|
172
|
+
timestamp: Date.now()
|
|
173
|
+
}
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
} catch (_) { /* swallow */ }
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
} catch (_) { /* ignore */ }
|
|
180
|
+
|
|
181
|
+
// Surface synchronous errors and unhandled promise rejections via the
|
|
182
|
+
// same dev_log channel — many bundle-startup crashes never get to call
|
|
183
|
+
// console.error themselves.
|
|
184
|
+
try {
|
|
185
|
+
window.addEventListener("error", function(e) {
|
|
186
|
+
try {
|
|
187
|
+
if (window.ReactNativeWebView && typeof window.ReactNativeWebView.postMessage === "function") {
|
|
188
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
189
|
+
payload: {
|
|
190
|
+
type: "dev_log",
|
|
191
|
+
level: "error",
|
|
192
|
+
args: ["[window.error] " + (e.message || "unknown"), {filename: e.filename, lineno: e.lineno, colno: e.colno, stack: e.error && e.error.stack}],
|
|
193
|
+
packageName: (window.MentraOS && window.MentraOS.packageName) || null,
|
|
194
|
+
timestamp: Date.now()
|
|
195
|
+
}
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
} catch (_) {}
|
|
199
|
+
});
|
|
200
|
+
window.addEventListener("unhandledrejection", function(e) {
|
|
201
|
+
try {
|
|
202
|
+
if (window.ReactNativeWebView && typeof window.ReactNativeWebView.postMessage === "function") {
|
|
203
|
+
var reason = e.reason;
|
|
204
|
+
var serialized = reason instanceof Error
|
|
205
|
+
? {__error: true, message: reason.message, stack: reason.stack}
|
|
206
|
+
: (typeof reason === "object" ? JSON.stringify(reason) : String(reason));
|
|
207
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
208
|
+
payload: {
|
|
209
|
+
type: "dev_log",
|
|
210
|
+
level: "error",
|
|
211
|
+
args: ["[unhandledrejection]", serialized],
|
|
212
|
+
packageName: (window.MentraOS && window.MentraOS.packageName) || null,
|
|
213
|
+
timestamp: Date.now()
|
|
214
|
+
}
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
} catch (_) {}
|
|
218
|
+
});
|
|
219
|
+
} catch (_) {}
|
|
220
|
+
})();
|
|
221
|
+
`
|
|
222
|
+
|
|
223
|
+
// Lock zoom so miniapps feel like apps, not pages: force a non-scalable
|
|
224
|
+
// viewport meta (overriding whatever the miniapp shipped) and disable
|
|
225
|
+
// double-tap-zoom via CSS. Re-applies on DOMContentLoaded in case the
|
|
226
|
+
// miniapp re-writes <head> during boot.
|
|
227
|
+
return `
|
|
228
|
+
window.MentraOS = ${JSON.stringify(globals)};
|
|
229
|
+
window.receiveNativeMessage = window.receiveNativeMessage || function() {};
|
|
230
|
+
(function() {
|
|
231
|
+
try {
|
|
232
|
+
var styleEl = document.createElement("style");
|
|
233
|
+
styleEl.setAttribute("data-mentra-injected", "1");
|
|
234
|
+
styleEl.textContent =
|
|
235
|
+
":root { ${cssVarsBlock} }" +
|
|
236
|
+
"html, body { touch-action: manipulation; -ms-content-zooming: none; }";
|
|
237
|
+
(document.head || document.documentElement).appendChild(styleEl);
|
|
238
|
+
} catch (e) { /* ignore */ }
|
|
239
|
+
|
|
240
|
+
function lockViewport() {
|
|
241
|
+
try {
|
|
242
|
+
var content = "width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, viewport-fit=cover";
|
|
243
|
+
var existing = document.querySelector('meta[name="viewport"]');
|
|
244
|
+
if (existing) {
|
|
245
|
+
existing.setAttribute("content", content);
|
|
246
|
+
} else {
|
|
247
|
+
var meta = document.createElement("meta");
|
|
248
|
+
meta.setAttribute("name", "viewport");
|
|
249
|
+
meta.setAttribute("content", content);
|
|
250
|
+
(document.head || document.documentElement).appendChild(meta);
|
|
251
|
+
}
|
|
252
|
+
} catch (e) { /* ignore */ }
|
|
253
|
+
}
|
|
254
|
+
lockViewport();
|
|
255
|
+
document.addEventListener("DOMContentLoaded", lockViewport);
|
|
256
|
+
})();
|
|
257
|
+
${consoleTapBlock}
|
|
258
|
+
true;
|
|
259
|
+
`
|
|
260
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import {Platform} from "react-native"
|
|
2
|
+
import {check, request, PERMISSIONS, RESULTS} from "react-native-permissions"
|
|
3
|
+
|
|
4
|
+
import CrustModule from "@mentra/crust"
|
|
5
|
+
|
|
6
|
+
import {deriveGalleryDisplayName} from "./galleryDisplayName"
|
|
7
|
+
|
|
8
|
+
export interface MediaLibrarySaveReceipt {
|
|
9
|
+
success: boolean
|
|
10
|
+
platform: "ios" | "android" | "unknown"
|
|
11
|
+
uri?: string
|
|
12
|
+
identifier?: string
|
|
13
|
+
error?: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* MediaLibraryPermissions - Handles save-only permissions for camera roll
|
|
18
|
+
*
|
|
19
|
+
* Platform behavior:
|
|
20
|
+
* - iOS: Uses PHOTO_LIBRARY (read-write) so we can manage the MentraOS album
|
|
21
|
+
* - Android 10+ (API 29+): No permission needed to save your own files to MediaStore
|
|
22
|
+
* - Android 9-: Uses WRITE_EXTERNAL_STORAGE (legacy)
|
|
23
|
+
*/
|
|
24
|
+
export class MediaLibraryPermissions {
|
|
25
|
+
/** Limited iOS access cannot see historical, unselected assets for duplicate reconciliation. */
|
|
26
|
+
static async hasLimitedAccess(): Promise<boolean> {
|
|
27
|
+
if (Platform.OS !== "ios") return false
|
|
28
|
+
try {
|
|
29
|
+
return (await check(PERMISSIONS.IOS.PHOTO_LIBRARY)) === RESULTS.LIMITED
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.error("[MediaLibrary] Error checking limited-library access:", error)
|
|
32
|
+
// Conservatively block legacy reconciliation when the scope cannot be verified.
|
|
33
|
+
return true
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check if we have permission to save to the camera roll
|
|
39
|
+
* Note: On Android 10+, this always returns true since no permission is needed
|
|
40
|
+
*/
|
|
41
|
+
static async checkPermission(): Promise<boolean> {
|
|
42
|
+
try {
|
|
43
|
+
if (Platform.OS === "ios") {
|
|
44
|
+
const status = await check(PERMISSIONS.IOS.PHOTO_LIBRARY)
|
|
45
|
+
return status === RESULTS.GRANTED || status === RESULTS.LIMITED
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (Platform.OS === "android") {
|
|
49
|
+
// Android 10+ (API 29+): No permission needed to save your own files
|
|
50
|
+
if (Platform.Version >= 29) {
|
|
51
|
+
return true
|
|
52
|
+
}
|
|
53
|
+
// Android 9 and below: Check legacy write permission
|
|
54
|
+
const status = await check(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE)
|
|
55
|
+
return status === RESULTS.GRANTED
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return false
|
|
59
|
+
} catch (error) {
|
|
60
|
+
console.error("[MediaLibrary] Error checking permission:", error)
|
|
61
|
+
// On error, assume we can try (Android 10+ doesn't need permission anyway)
|
|
62
|
+
return Platform.OS === "android" && Platform.Version >= 29
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Request permission to save to the camera roll
|
|
68
|
+
* Note: On Android 10+, this always returns true since no permission is needed
|
|
69
|
+
*/
|
|
70
|
+
static async requestPermission(): Promise<boolean> {
|
|
71
|
+
try {
|
|
72
|
+
if (Platform.OS === "ios") {
|
|
73
|
+
const status = await request(PERMISSIONS.IOS.PHOTO_LIBRARY)
|
|
74
|
+
return status === RESULTS.GRANTED || status === RESULTS.LIMITED
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (Platform.OS === "android") {
|
|
78
|
+
// Android 10+ (API 29+): No permission needed to save your own files
|
|
79
|
+
if (Platform.Version >= 29) {
|
|
80
|
+
return true
|
|
81
|
+
}
|
|
82
|
+
// Android 9 and below: Request legacy write permission
|
|
83
|
+
const status = await request(PERMISSIONS.ANDROID.WRITE_EXTERNAL_STORAGE)
|
|
84
|
+
return status === RESULTS.GRANTED
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return false
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error("[MediaLibrary] Error requesting permission:", error)
|
|
90
|
+
// On error, assume we can try (Android 10+ doesn't need permission anyway)
|
|
91
|
+
return Platform.OS === "android" && Platform.Version >= 29
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Save a file to the photo library in a glasses-specific location (MentraOS album on iOS;
|
|
97
|
+
* Pictures/MentraOS or Movies/MentraOS on Android 10+).
|
|
98
|
+
* On Android 10+, this works without any permission.
|
|
99
|
+
*
|
|
100
|
+
* IMPORTANT: This method sets the DATE_TAKEN (Android) or creation date (iOS)
|
|
101
|
+
* metadata to the original capture time, so gallery apps show the correct date.
|
|
102
|
+
* Also saves files in chronological order for proper "date added" ordering.
|
|
103
|
+
*
|
|
104
|
+
* @param filePath - Path to the file to save
|
|
105
|
+
* @param creationTime - Optional creation/capture time in milliseconds (Unix timestamp)
|
|
106
|
+
*/
|
|
107
|
+
static async saveToLibrary(filePath: string, creationTime?: number): Promise<boolean> {
|
|
108
|
+
return (await this.saveToLibraryWithReceipt(filePath, creationTime)).success
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Save and return the durable MediaStore/PhotoKit identifier used as the export receipt. */
|
|
112
|
+
static async saveToLibraryWithReceipt(filePath: string, creationTime?: number): Promise<MediaLibrarySaveReceipt> {
|
|
113
|
+
const platform = Platform.OS === "ios" || Platform.OS === "android" ? Platform.OS : "unknown"
|
|
114
|
+
try {
|
|
115
|
+
// On Android 10+, we can save without permission
|
|
116
|
+
// On iOS and older Android, check permission first
|
|
117
|
+
if (!(Platform.OS === "android" && Platform.Version >= 29)) {
|
|
118
|
+
const hasPermission = await this.checkPermission()
|
|
119
|
+
if (!hasPermission) {
|
|
120
|
+
// Try requesting permission one more time
|
|
121
|
+
const granted = await this.requestPermission()
|
|
122
|
+
if (!granted) {
|
|
123
|
+
console.warn("[MediaLibrary] No permission to save to library - photos saved to app storage only")
|
|
124
|
+
return {success: false, platform, error: "permission denied"}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Remove file:// prefix if present
|
|
130
|
+
const cleanPath = filePath.replace("file://", "")
|
|
131
|
+
const displayName = deriveGalleryDisplayName(cleanPath)
|
|
132
|
+
|
|
133
|
+
// Use native module to save with proper DATE_TAKEN / creation date metadata
|
|
134
|
+
// This ensures gallery apps show the correct capture date, not the sync date
|
|
135
|
+
const result = await CrustModule.saveToGalleryWithDate(cleanPath, creationTime, displayName)
|
|
136
|
+
|
|
137
|
+
if (result.success) {
|
|
138
|
+
if (creationTime) {
|
|
139
|
+
const captureDate = new Date(creationTime)
|
|
140
|
+
console.log(
|
|
141
|
+
`[MediaLibrary] Saved to camera roll with DATE_TAKEN: ${cleanPath} (captured: ${captureDate.toISOString()})`,
|
|
142
|
+
)
|
|
143
|
+
} else {
|
|
144
|
+
console.log(`[MediaLibrary] Saved to camera roll: ${cleanPath}`)
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
success: true,
|
|
148
|
+
platform,
|
|
149
|
+
uri: result.uri,
|
|
150
|
+
identifier: result.identifier,
|
|
151
|
+
}
|
|
152
|
+
} else {
|
|
153
|
+
console.error(`[MediaLibrary] Failed to save to library: ${result.error}`)
|
|
154
|
+
return {success: false, platform, error: result.error || "native export failed"}
|
|
155
|
+
}
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error("[MediaLibrary] Error saving to library:", error)
|
|
158
|
+
return {success: false, platform, error: error instanceof Error ? error.message : String(error)}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const CAPTURE_FOLDER_PATTERN = /^(IMG|VID)_/
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Derive a unique MediaStore display name for camera-roll saves.
|
|
5
|
+
*
|
|
6
|
+
* Capture downloads use folder layout `IMG_xxx/base.jpg` (or `VID_xxx/base.mp4`).
|
|
7
|
+
* Using the leaf filename (`base.jpg`) causes MediaStore collisions on Android.
|
|
8
|
+
*/
|
|
9
|
+
export function deriveGalleryDisplayName(filePath: string): string {
|
|
10
|
+
const cleanPath = filePath.replace("file://", "")
|
|
11
|
+
const lastSlash = cleanPath.lastIndexOf("/")
|
|
12
|
+
if (lastSlash < 0) {
|
|
13
|
+
return cleanPath
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const fileName = cleanPath.substring(lastSlash + 1)
|
|
17
|
+
const parentDir = cleanPath.substring(0, lastSlash)
|
|
18
|
+
const parentSlash = parentDir.lastIndexOf("/")
|
|
19
|
+
const parentName = parentSlash < 0 ? parentDir : parentDir.substring(parentSlash + 1)
|
|
20
|
+
|
|
21
|
+
if (!CAPTURE_FOLDER_PATTERN.test(parentName)) {
|
|
22
|
+
return fileName
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const isVideo = /\.(mp4|mov|m4v|avi)(\.|$)/i.test(fileName)
|
|
26
|
+
const extension = isVideo ? "mp4" : "jpg"
|
|
27
|
+
return `${parentName}.${extension}`
|
|
28
|
+
}
|