@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,122 @@
|
|
|
1
|
+
import {storage} from "../../utils/storage"
|
|
2
|
+
import {toPortableGalleryPath} from "./galleryPathMigration"
|
|
3
|
+
import type {GalleryAssetReceipt} from "./galleryTransferLedger"
|
|
4
|
+
|
|
5
|
+
export type CameraRollExportState =
|
|
6
|
+
| "NOT_REQUESTED"
|
|
7
|
+
| "LEGACY_UNKNOWN"
|
|
8
|
+
| "QUEUED"
|
|
9
|
+
| "RECONCILING"
|
|
10
|
+
| "EXPORTING"
|
|
11
|
+
| "EXPORTED"
|
|
12
|
+
| "BLOCKED_PERMISSION"
|
|
13
|
+
| "FAILED_RETRYABLE"
|
|
14
|
+
| "FAILED_PERMANENT"
|
|
15
|
+
| "MISSING_LOCAL"
|
|
16
|
+
|
|
17
|
+
export type CameraRollExportPriority = "SOURCE_BARRIER" | "HISTORICAL_BACKFILL"
|
|
18
|
+
|
|
19
|
+
export interface CameraRollExportEntry {
|
|
20
|
+
/** Stable identity for one local-file generation. */
|
|
21
|
+
id: string
|
|
22
|
+
mediaName: string
|
|
23
|
+
generation: string
|
|
24
|
+
filePath: string
|
|
25
|
+
size: number
|
|
26
|
+
modified: number
|
|
27
|
+
isVideo: boolean
|
|
28
|
+
captureId?: string
|
|
29
|
+
/** False while this generation is absent from the local index; exported receipts remain as hidden tombstones. */
|
|
30
|
+
localPresent?: boolean
|
|
31
|
+
/** True when an older client may already have exported this file without persisting a receipt. */
|
|
32
|
+
requiresFullLibraryReconciliation?: boolean
|
|
33
|
+
state: CameraRollExportState
|
|
34
|
+
priority: CameraRollExportPriority
|
|
35
|
+
receipt?: GalleryAssetReceipt
|
|
36
|
+
attempts: number
|
|
37
|
+
nextRetryAt?: number
|
|
38
|
+
lastError?: string
|
|
39
|
+
createdAt: number
|
|
40
|
+
updatedAt: number
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const ENTRY_PREFIX = "asg_camera_roll_export_v1:"
|
|
44
|
+
|
|
45
|
+
export function cameraRollGeneration(mediaName: string, size: number, modified: number): string {
|
|
46
|
+
return `${mediaName}:${size}:${modified}`
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function cameraRollEntryId(mediaName: string, size: number, modified: number): string {
|
|
50
|
+
return encodeURIComponent(cameraRollGeneration(mediaName, size, modified))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
class CameraRollExportLedger {
|
|
54
|
+
private runtimeDocumentDirectory = ""
|
|
55
|
+
|
|
56
|
+
setDocumentDirectory(path: string): void {
|
|
57
|
+
this.runtimeDocumentDirectory = path
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
get(id: string): CameraRollExportEntry | undefined {
|
|
61
|
+
const result = storage.load<CameraRollExportEntry>(`${ENTRY_PREFIX}${id}`)
|
|
62
|
+
if (result.is_error()) return undefined
|
|
63
|
+
return this.toRuntimeEntry(result.value)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
list(): CameraRollExportEntry[] {
|
|
67
|
+
return storage
|
|
68
|
+
.getAllKeys()
|
|
69
|
+
.filter((key) => key.startsWith(ENTRY_PREFIX))
|
|
70
|
+
.map((key) => {
|
|
71
|
+
const result = storage.load<CameraRollExportEntry>(key)
|
|
72
|
+
return result.is_error() ? undefined : this.toRuntimeEntry(result.value)
|
|
73
|
+
})
|
|
74
|
+
.filter((entry): entry is CameraRollExportEntry => !!entry)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
put(entry: CameraRollExportEntry): CameraRollExportEntry {
|
|
78
|
+
const updated = {...entry, updatedAt: Date.now()}
|
|
79
|
+
const result = storage.save(`${ENTRY_PREFIX}${entry.id}`, this.toStoredEntry(updated))
|
|
80
|
+
if (result.is_error()) throw result.error
|
|
81
|
+
return updated
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
update(id: string, patch: Partial<CameraRollExportEntry>): CameraRollExportEntry {
|
|
85
|
+
const current = this.get(id)
|
|
86
|
+
if (!current) throw new Error(`Camera-roll export entry missing: ${id}`)
|
|
87
|
+
return this.put({...current, ...patch, id})
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
remove(id: string): void {
|
|
91
|
+
const result = storage.remove(`${ENTRY_PREFIX}${id}`)
|
|
92
|
+
if (result.is_error()) throw result.error
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
removeForMedia(mediaName: string): void {
|
|
96
|
+
for (const entry of this.list()) {
|
|
97
|
+
if (entry.mediaName === mediaName) this.remove(entry.id)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
clear(): void {
|
|
102
|
+
const keys = storage.getAllKeys().filter((key) => key.startsWith(ENTRY_PREFIX))
|
|
103
|
+
if (keys.length === 0) return
|
|
104
|
+
const result = storage.removeMultiple(keys)
|
|
105
|
+
if (result.is_error()) throw result.error
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private toStoredEntry(entry: CameraRollExportEntry): CameraRollExportEntry {
|
|
109
|
+
if (!this.runtimeDocumentDirectory) return entry
|
|
110
|
+
return {
|
|
111
|
+
...entry,
|
|
112
|
+
filePath: toPortableGalleryPath(entry.filePath, this.runtimeDocumentDirectory) || entry.filePath,
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private toRuntimeEntry(entry: CameraRollExportEntry): CameraRollExportEntry {
|
|
117
|
+
if (!this.runtimeDocumentDirectory || entry.filePath.startsWith("/")) return entry
|
|
118
|
+
return {...entry, filePath: `${this.runtimeDocumentDirectory}/${entry.filePath}`}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export const cameraRollExportLedger = new CameraRollExportLedger()
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-download validation for gallery media synced from glasses.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as RNFS from "@dr.pogodin/react-native-fs"
|
|
6
|
+
import {Buffer} from "@craftzdog/react-native-buffer"
|
|
7
|
+
|
|
8
|
+
export const INVALID_DOWNLOADED_MEDIA = "Invalid downloaded media"
|
|
9
|
+
|
|
10
|
+
export type MediaKind = "photo" | "video" | "unknown"
|
|
11
|
+
|
|
12
|
+
export interface ValidateDownloadedMediaOptions {
|
|
13
|
+
path: string
|
|
14
|
+
name: string
|
|
15
|
+
expectedSize?: number
|
|
16
|
+
mediaKind?: MediaKind
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ISO BMFF brands that identify still-image (not video) containers. An mp4-like
|
|
20
|
+
// header with one of these brands at bytes 8-11 must NOT pass video validation.
|
|
21
|
+
const IMAGE_FTYP_BRANDS = new Set(["avif", "avis", "heic", "heix", "heim", "heis", "hevc", "hevx", "mif1", "msf1"])
|
|
22
|
+
|
|
23
|
+
function isVideoFileName(name: string): boolean {
|
|
24
|
+
return /\.(mp4|mov|avi|webm|mkv|3gp)$/i.test(name)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function isPhotoFileName(name: string): boolean {
|
|
28
|
+
return /\.(jpg|jpeg|png|avif)$/i.test(name) || !name.includes(".")
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function detectMediaKind(name: string, override?: MediaKind): MediaKind {
|
|
32
|
+
if (override && override !== "unknown") {
|
|
33
|
+
return override
|
|
34
|
+
}
|
|
35
|
+
if (isVideoFileName(name)) {
|
|
36
|
+
return "video"
|
|
37
|
+
}
|
|
38
|
+
if (isPhotoFileName(name)) {
|
|
39
|
+
return "photo"
|
|
40
|
+
}
|
|
41
|
+
return "unknown"
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function decodeHeader(base64Header: string): Buffer {
|
|
45
|
+
// Use Buffer (from the "buffer" polyfill) for byte-safe decoding; RN's atob
|
|
46
|
+
// is host-dependent and some implementations mangle bytes ≥ 0x80, which would
|
|
47
|
+
// mis-validate JPEG (0xFF 0xD8) and binary AVI/EBML headers.
|
|
48
|
+
return Buffer.from(base64Header, "base64")
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function readAscii(bytes: Buffer, start: number, length: number): string {
|
|
52
|
+
if (bytes.length < start + length) return ""
|
|
53
|
+
return bytes.toString("ascii", start, start + length)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function validatePhotoSignature(base64Header: string): boolean {
|
|
57
|
+
try {
|
|
58
|
+
const bytes = decodeHeader(base64Header)
|
|
59
|
+
if (bytes.length >= 12 && readAscii(bytes, 4, 4) === "ftyp") {
|
|
60
|
+
const brand = readAscii(bytes, 8, 4)
|
|
61
|
+
// Image-only ISO BMFF brands (AVIF, HEIC, HEIF variants) are valid photos.
|
|
62
|
+
if (IMAGE_FTYP_BRANDS.has(brand)) {
|
|
63
|
+
return true
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// JPEG: 0xFF 0xD8
|
|
67
|
+
if (bytes.length >= 2 && bytes[0] === 0xff && bytes[1] === 0xd8) {
|
|
68
|
+
return true
|
|
69
|
+
}
|
|
70
|
+
// PNG: 89 50 4E 47 0D 0A 1A 0A
|
|
71
|
+
if (
|
|
72
|
+
bytes.length >= 8 &&
|
|
73
|
+
bytes[0] === 0x89 &&
|
|
74
|
+
bytes[1] === 0x50 &&
|
|
75
|
+
bytes[2] === 0x4e &&
|
|
76
|
+
bytes[3] === 0x47 &&
|
|
77
|
+
bytes[4] === 0x0d &&
|
|
78
|
+
bytes[5] === 0x0a &&
|
|
79
|
+
bytes[6] === 0x1a &&
|
|
80
|
+
bytes[7] === 0x0a
|
|
81
|
+
) {
|
|
82
|
+
return true
|
|
83
|
+
}
|
|
84
|
+
return false
|
|
85
|
+
} catch {
|
|
86
|
+
return false
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function validateVideoSignature(base64Header: string): boolean {
|
|
91
|
+
try {
|
|
92
|
+
const bytes = decodeHeader(base64Header)
|
|
93
|
+
if (bytes.length < 8) {
|
|
94
|
+
return false
|
|
95
|
+
}
|
|
96
|
+
// ISO BMFF (mp4, mov, 3gp): bytes 4-7 should be "ftyp" AND brand at 8-11 must
|
|
97
|
+
// not be an image-only brand (AVIF/HEIC share the ftyp container).
|
|
98
|
+
if (readAscii(bytes, 4, 4) === "ftyp") {
|
|
99
|
+
const brand = readAscii(bytes, 8, 4)
|
|
100
|
+
if (IMAGE_FTYP_BRANDS.has(brand)) {
|
|
101
|
+
return false
|
|
102
|
+
}
|
|
103
|
+
return true
|
|
104
|
+
}
|
|
105
|
+
// RIFF/AVI: bytes 0-3 "RIFF", bytes 8-11 "AVI "
|
|
106
|
+
if (bytes.length >= 12 && readAscii(bytes, 0, 4) === "RIFF" && readAscii(bytes, 8, 4) === "AVI ") {
|
|
107
|
+
return true
|
|
108
|
+
}
|
|
109
|
+
// EBML (WebM, MKV): bytes 0-3 are 0x1A 0x45 0xDF 0xA3
|
|
110
|
+
if (bytes.length >= 4 && bytes[0] === 0x1a && bytes[1] === 0x45 && bytes[2] === 0xdf && bytes[3] === 0xa3) {
|
|
111
|
+
return true
|
|
112
|
+
}
|
|
113
|
+
return false
|
|
114
|
+
} catch {
|
|
115
|
+
return false
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Validate a downloaded file on disk. Throws with INVALID_DOWNLOADED_MEDIA on failure.
|
|
121
|
+
*/
|
|
122
|
+
export async function validateDownloadedMediaFile(options: ValidateDownloadedMediaOptions): Promise<void> {
|
|
123
|
+
const {path, name, expectedSize = 0, mediaKind} = options
|
|
124
|
+
|
|
125
|
+
const exists = await RNFS.exists(path)
|
|
126
|
+
if (!exists) {
|
|
127
|
+
throw new Error(`${INVALID_DOWNLOADED_MEDIA}: missing file ${name}`)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const stat = await RNFS.stat(path)
|
|
131
|
+
if (stat.size === 0) {
|
|
132
|
+
throw new Error(`${INVALID_DOWNLOADED_MEDIA}: zero-byte file ${name}`)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (expectedSize > 0 && stat.size !== expectedSize) {
|
|
136
|
+
throw new Error(`${INVALID_DOWNLOADED_MEDIA}: size mismatch for ${name}: expected ${expectedSize}, got ${stat.size}`)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const kind = detectMediaKind(name, mediaKind)
|
|
140
|
+
if (kind === "unknown") {
|
|
141
|
+
return
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const headerBase64 = await RNFS.read(path, 12, 0, "base64")
|
|
145
|
+
if (kind === "video") {
|
|
146
|
+
if (!validateVideoSignature(headerBase64)) {
|
|
147
|
+
throw new Error(`${INVALID_DOWNLOADED_MEDIA}: invalid video container for ${name}`)
|
|
148
|
+
}
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (!validatePhotoSignature(headerBase64)) {
|
|
153
|
+
throw new Error(`${INVALID_DOWNLOADED_MEDIA}: invalid photo signature for ${name}`)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Pre-download check using sync metadata before hitting the network.
|
|
159
|
+
*/
|
|
160
|
+
export function validateCaptureMetadataForDownload(capture: {
|
|
161
|
+
capture_id: string
|
|
162
|
+
type: "photo" | "video"
|
|
163
|
+
total_size: number
|
|
164
|
+
files: Array<{name: string; size: number; role: string}>
|
|
165
|
+
}): void {
|
|
166
|
+
if (capture.type !== "video") {
|
|
167
|
+
return
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (capture.total_size <= 0) {
|
|
171
|
+
throw new Error(`${INVALID_DOWNLOADED_MEDIA}: video capture ${capture.capture_id} has zero total_size`)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const primaryFile = capture.files.find((f) => f.role === "primary") ?? capture.files[0]
|
|
175
|
+
if (!primaryFile) {
|
|
176
|
+
throw new Error(`${INVALID_DOWNLOADED_MEDIA}: video capture ${capture.capture_id} has no files`)
|
|
177
|
+
}
|
|
178
|
+
if (primaryFile.size <= 0) {
|
|
179
|
+
throw new Error(
|
|
180
|
+
`${INVALID_DOWNLOADED_MEDIA}: video capture ${capture.capture_id} primary file ${primaryFile.name} has zero size`,
|
|
181
|
+
)
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gallery notices — engine-owned. The gallery sync emits STRUCTURED notice codes
|
|
3
|
+
* (never localized strings or alerts) when it hits a user-actionable precondition;
|
|
4
|
+
* the host renders its own alert / settings deep-link from the code. This keeps the
|
|
5
|
+
* sync (engine runtime) free of host UI/i18n/navigation — exposed as
|
|
6
|
+
* `engine.gallery.onNotice(cb)`.
|
|
7
|
+
*/
|
|
8
|
+
export type GalleryNoticeCode =
|
|
9
|
+
| "glasses_disconnected"
|
|
10
|
+
| "bluetooth_off"
|
|
11
|
+
| "insufficient_storage"
|
|
12
|
+
| "wifi_initializing"
|
|
13
|
+
| "wifi_off"
|
|
14
|
+
| "location_services_off"
|
|
15
|
+
| "camera_roll_permission_required"
|
|
16
|
+
| "connect_to_glasses"
|
|
17
|
+
|
|
18
|
+
export interface GalleryNotice {
|
|
19
|
+
code: GalleryNoticeCode
|
|
20
|
+
/** Optional extra context (e.g. ssid/platform) for the host's message. */
|
|
21
|
+
data?: Record<string, unknown>
|
|
22
|
+
/**
|
|
23
|
+
* Present only on notices the sync BLOCKS on (currently the one-time wifi-join
|
|
24
|
+
* explanation): the host calls this when the user acknowledges, letting the sync
|
|
25
|
+
* proceed. If no host is listening, the emitter's return value lets the sync fall
|
|
26
|
+
* through instead of hanging.
|
|
27
|
+
*/
|
|
28
|
+
ack?: () => void
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type Listener = (notice: GalleryNotice) => void
|
|
32
|
+
|
|
33
|
+
const listeners = new Set<Listener>()
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Emit a notice to all subscribers; returns how many SUCCESSFULLY received it
|
|
37
|
+
* (0 = nobody listening, or every listener threw). Callers use 0 as the
|
|
38
|
+
* "no host will act on this" signal — e.g. gallery sync auto-proceeds on the
|
|
39
|
+
* blocking connect_to_glasses notice — so a throwing listener must not count
|
|
40
|
+
* as a delivery.
|
|
41
|
+
*/
|
|
42
|
+
export function emitGalleryNotice(notice: GalleryNotice): number {
|
|
43
|
+
let delivered = 0
|
|
44
|
+
listeners.forEach((l) => {
|
|
45
|
+
// Isolate listeners: one throwing host handler must not break delivery to the
|
|
46
|
+
// others or bubble an exception into the gallery sync.
|
|
47
|
+
try {
|
|
48
|
+
l(notice)
|
|
49
|
+
delivered += 1
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error("galleryNotices: onNotice listener threw:", error)
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
return delivered
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Subscribe to gallery notices; returns an unsubscribe. */
|
|
58
|
+
export function onGalleryNotice(cb: Listener): () => void {
|
|
59
|
+
listeners.add(cb)
|
|
60
|
+
return () => listeners.delete(cb)
|
|
61
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Convert current or legacy app-container paths into a portable Documents-relative path. */
|
|
2
|
+
export function toPortableGalleryPath(path: string, documentDirectoryPath: string): string | null {
|
|
3
|
+
if (!path) return null
|
|
4
|
+
const cleanPath = path.replace(/^file:\/\//, "")
|
|
5
|
+
const docPath = documentDirectoryPath.replace(/\/$/, "")
|
|
6
|
+
let candidate: string | null = null
|
|
7
|
+
if (cleanPath.startsWith(`${docPath}/`)) candidate = cleanPath.substring(docPath.length + 1)
|
|
8
|
+
else if (!cleanPath.startsWith("/")) candidate = cleanPath.replace(/^\/+/, "")
|
|
9
|
+
|
|
10
|
+
if (!candidate) {
|
|
11
|
+
const documentsMarker = "/Documents/"
|
|
12
|
+
const documentsIndex = cleanPath.indexOf(documentsMarker)
|
|
13
|
+
if (documentsIndex >= 0) candidate = cleanPath.substring(documentsIndex + documentsMarker.length)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (!candidate || candidate.includes("\0")) return null
|
|
17
|
+
const segments = candidate.split("/")
|
|
18
|
+
if (segments[0] !== "MentraPhotos" || segments.some((segment) => !segment || segment === "." || segment === "..")) {
|
|
19
|
+
return null
|
|
20
|
+
}
|
|
21
|
+
return segments.join("/")
|
|
22
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import {storage} from "../../utils/storage/storage"
|
|
2
|
+
|
|
3
|
+
export interface GallerySettings {
|
|
4
|
+
autoSaveToCameraRoll: boolean
|
|
5
|
+
autoSaveDisableWarningShown: boolean
|
|
6
|
+
imageProcessingEnabled: boolean
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class GallerySettingsService {
|
|
10
|
+
private static instance: GallerySettingsService
|
|
11
|
+
private readonly SETTINGS_KEY = "gallery_settings"
|
|
12
|
+
private readonly DEFAULT_SETTINGS: GallerySettings = {
|
|
13
|
+
autoSaveToCameraRoll: true, // Default ON
|
|
14
|
+
autoSaveDisableWarningShown: false,
|
|
15
|
+
imageProcessingEnabled: true, // Lens coefficients calibrated from chessboard photos
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private constructor() {}
|
|
19
|
+
|
|
20
|
+
static getInstance(): GallerySettingsService {
|
|
21
|
+
if (!GallerySettingsService.instance) {
|
|
22
|
+
GallerySettingsService.instance = new GallerySettingsService()
|
|
23
|
+
}
|
|
24
|
+
return GallerySettingsService.instance
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async getSettings(): Promise<GallerySettings> {
|
|
28
|
+
const res = storage.load<GallerySettings>(this.SETTINGS_KEY)
|
|
29
|
+
if (res.is_error()) {
|
|
30
|
+
// Not an error - just means settings haven't been saved yet (first use)
|
|
31
|
+
// Return defaults silently
|
|
32
|
+
return this.DEFAULT_SETTINGS
|
|
33
|
+
}
|
|
34
|
+
const stored = res.value
|
|
35
|
+
return {...this.DEFAULT_SETTINGS, ...stored}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async updateSettings(settings: Partial<GallerySettings>): Promise<void> {
|
|
39
|
+
const current = await this.getSettings()
|
|
40
|
+
const updated = {...current, ...settings}
|
|
41
|
+
const res = await storage.save(this.SETTINGS_KEY, updated)
|
|
42
|
+
if (res.is_error()) {
|
|
43
|
+
console.error("[GallerySettings] Error saving settings:", res.error)
|
|
44
|
+
throw res.error
|
|
45
|
+
}
|
|
46
|
+
console.log("[GallerySettings] Settings updated:", updated)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async getAutoSaveToCameraRoll(): Promise<boolean> {
|
|
50
|
+
const settings = await this.getSettings()
|
|
51
|
+
return settings.autoSaveToCameraRoll
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async setAutoSaveToCameraRoll(enabled: boolean): Promise<void> {
|
|
55
|
+
await this.updateSettings({autoSaveToCameraRoll: enabled})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async getImageProcessingEnabled(): Promise<boolean> {
|
|
59
|
+
const settings = await this.getSettings()
|
|
60
|
+
return settings.imageProcessingEnabled
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async setImageProcessingEnabled(enabled: boolean): Promise<void> {
|
|
64
|
+
await this.updateSettings({imageProcessingEnabled: enabled})
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const gallerySettingsService = GallerySettingsService.getInstance()
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gallery Sync Notifications
|
|
3
|
+
* Manages system notifications for gallery sync progress
|
|
4
|
+
*
|
|
5
|
+
* Platform differences:
|
|
6
|
+
* - Android: Supports ongoing/sticky notifications that update silently
|
|
7
|
+
* - iOS: Each notification update shows a banner, so we throttle updates
|
|
8
|
+
* and only show start/complete notifications to avoid spam
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// import * as Notifications from "expo-notifications"
|
|
12
|
+
import {Platform} from "react-native"
|
|
13
|
+
|
|
14
|
+
// iOS throttling - only update every N seconds to avoid banner spam
|
|
15
|
+
const IOS_UPDATE_THROTTLE_MS = 10000 // 10 seconds between updates on iOS
|
|
16
|
+
|
|
17
|
+
// Configure notification handler
|
|
18
|
+
// Notifications.setNotificationHandler({
|
|
19
|
+
// handleNotification: async () => ({
|
|
20
|
+
// shouldShowAlert: true,
|
|
21
|
+
// shouldPlaySound: false,
|
|
22
|
+
// shouldSetBadge: false,
|
|
23
|
+
// // On iOS, minimize banner popups for progress updates
|
|
24
|
+
// shouldShowBanner: Platform.OS === "android",
|
|
25
|
+
// shouldShowList: true,
|
|
26
|
+
// }),
|
|
27
|
+
// })
|
|
28
|
+
|
|
29
|
+
class GallerySyncNotifications {
|
|
30
|
+
private static instance: GallerySyncNotifications
|
|
31
|
+
private notificationActive = false
|
|
32
|
+
private lastUpdateTime = 0 // For iOS throttling
|
|
33
|
+
|
|
34
|
+
private constructor() {}
|
|
35
|
+
|
|
36
|
+
static getInstance(): GallerySyncNotifications {
|
|
37
|
+
if (!GallerySyncNotifications.instance) {
|
|
38
|
+
GallerySyncNotifications.instance = new GallerySyncNotifications()
|
|
39
|
+
}
|
|
40
|
+
return GallerySyncNotifications.instance
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Initialize notification channel (Android only)
|
|
45
|
+
*/
|
|
46
|
+
private async ensureChannel(): Promise<void> {
|
|
47
|
+
// if (this.channelCreated) return
|
|
48
|
+
|
|
49
|
+
// if (Platform.OS === "android") {
|
|
50
|
+
// await Notifications.setNotificationChannelAsync(CHANNEL_ID, {
|
|
51
|
+
// name: "Gallery Sync",
|
|
52
|
+
// description: "Shows progress when syncing photos from your glasses",
|
|
53
|
+
// importance: Notifications.AndroidImportance.LOW, // Low = no sound, shows in shade
|
|
54
|
+
// vibrationPattern: [0], // No vibration
|
|
55
|
+
// lightColor: "#4A90D9",
|
|
56
|
+
// lockscreenVisibility: Notifications.AndroidNotificationVisibility.PUBLIC,
|
|
57
|
+
// bypassDnd: false,
|
|
58
|
+
// enableLights: false,
|
|
59
|
+
// enableVibrate: false,
|
|
60
|
+
// showBadge: false,
|
|
61
|
+
// })
|
|
62
|
+
// }
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Request notification permissions
|
|
67
|
+
*/
|
|
68
|
+
async requestPermissions(): Promise<boolean> {
|
|
69
|
+
// const {status: existingStatus} = await Notifications.getPermissionsAsync()
|
|
70
|
+
|
|
71
|
+
// if (existingStatus === "granted") {
|
|
72
|
+
// return true
|
|
73
|
+
// }
|
|
74
|
+
|
|
75
|
+
// const {status} = await Notifications.requestPermissionsAsync()
|
|
76
|
+
// return status === "granted"
|
|
77
|
+
return true // Always return true when notifications disabled
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Show initial sync notification
|
|
82
|
+
*/
|
|
83
|
+
async showSyncStarted(totalFiles: number): Promise<void> {
|
|
84
|
+
await this.ensureChannel()
|
|
85
|
+
|
|
86
|
+
const hasPermission = await this.requestPermissions()
|
|
87
|
+
if (!hasPermission) {
|
|
88
|
+
console.log("[SyncNotifications] No notification permission, skipping")
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// await Notifications.scheduleNotificationAsync({
|
|
93
|
+
// identifier: SYNC_NOTIFICATION_ID,
|
|
94
|
+
// content: {
|
|
95
|
+
// title: "Syncing photos from glasses",
|
|
96
|
+
// body: `Preparing to download ${totalFiles} ${totalFiles === 1 ? "file" : "files"}...`,
|
|
97
|
+
// data: {type: "gallery-sync"},
|
|
98
|
+
// sticky: Platform.OS === "android", // Ongoing notification on Android
|
|
99
|
+
// },
|
|
100
|
+
// trigger: null, // Show immediately
|
|
101
|
+
// })
|
|
102
|
+
|
|
103
|
+
this.notificationActive = true
|
|
104
|
+
this.lastUpdateTime = Date.now() // Reset throttle timer
|
|
105
|
+
console.log(`[SyncNotifications] Started sync notification for ${totalFiles} files (notifications disabled)`)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Update sync progress notification
|
|
110
|
+
* On iOS, updates are throttled to avoid spamming the user with banner notifications
|
|
111
|
+
*/
|
|
112
|
+
async updateProgress(
|
|
113
|
+
currentFile: number,
|
|
114
|
+
totalFiles: number,
|
|
115
|
+
_fileName: string,
|
|
116
|
+
fileProgress: number,
|
|
117
|
+
): Promise<void> {
|
|
118
|
+
if (!this.notificationActive) return
|
|
119
|
+
|
|
120
|
+
// On iOS, throttle updates to avoid banner spam
|
|
121
|
+
// iOS doesn't support silent notification updates like Android's ongoing notifications
|
|
122
|
+
if (Platform.OS === "ios") {
|
|
123
|
+
const now = Date.now()
|
|
124
|
+
const timeSinceLastUpdate = now - this.lastUpdateTime
|
|
125
|
+
|
|
126
|
+
// Only update if enough time has passed OR if this is the last file completing
|
|
127
|
+
const isLastFileCompleting = currentFile === totalFiles && fileProgress >= 99
|
|
128
|
+
if (timeSinceLastUpdate < IOS_UPDATE_THROTTLE_MS && !isLastFileCompleting) {
|
|
129
|
+
return // Skip this update on iOS to avoid banner spam
|
|
130
|
+
}
|
|
131
|
+
this.lastUpdateTime = now
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
await this.ensureChannel()
|
|
135
|
+
|
|
136
|
+
// Notifications are disabled; the overall-progress + body computation that fed
|
|
137
|
+
// scheduleNotificationAsync (below, commented) is omitted to keep this a no-op.
|
|
138
|
+
|
|
139
|
+
// await Notifications.scheduleNotificationAsync({
|
|
140
|
+
// identifier: SYNC_NOTIFICATION_ID,
|
|
141
|
+
// content: {
|
|
142
|
+
// title: "Syncing photos from glasses",
|
|
143
|
+
// body,
|
|
144
|
+
// data: {type: "gallery-sync", progress: overallProgress},
|
|
145
|
+
// sticky: Platform.OS === "android", // Keep notification visible on Android
|
|
146
|
+
// },
|
|
147
|
+
// trigger: null,
|
|
148
|
+
// })
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Show sync complete notification
|
|
153
|
+
*/
|
|
154
|
+
async showSyncComplete(downloadedCount: number, failedCount: number = 0): Promise<void> {
|
|
155
|
+
await this.ensureChannel()
|
|
156
|
+
|
|
157
|
+
// Notifications are disabled; the title/body computation that fed
|
|
158
|
+
// scheduleNotificationAsync (below, commented) is omitted to keep this a no-op.
|
|
159
|
+
|
|
160
|
+
// await Notifications.scheduleNotificationAsync({
|
|
161
|
+
// identifier: SYNC_NOTIFICATION_ID,
|
|
162
|
+
// content: {
|
|
163
|
+
// title,
|
|
164
|
+
// body,
|
|
165
|
+
// data: {type: "gallery-sync-complete"},
|
|
166
|
+
// },
|
|
167
|
+
// trigger: null,
|
|
168
|
+
// })
|
|
169
|
+
|
|
170
|
+
this.notificationActive = false
|
|
171
|
+
console.log(
|
|
172
|
+
`[SyncNotifications] Sync complete: ${downloadedCount} downloaded, ${failedCount} failed (notifications disabled)`,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
// Auto-dismiss after 5 seconds
|
|
176
|
+
// setTimeout(() => {
|
|
177
|
+
// this.dismiss()
|
|
178
|
+
// }, 5000)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Show sync error notification
|
|
183
|
+
*/
|
|
184
|
+
async showSyncError(errorMessage: string): Promise<void> {
|
|
185
|
+
await this.ensureChannel()
|
|
186
|
+
|
|
187
|
+
// await Notifications.scheduleNotificationAsync({
|
|
188
|
+
// identifier: SYNC_NOTIFICATION_ID,
|
|
189
|
+
// content: {
|
|
190
|
+
// title: "Sync failed",
|
|
191
|
+
// body: errorMessage,
|
|
192
|
+
// data: {type: "gallery-sync-error"},
|
|
193
|
+
// },
|
|
194
|
+
// trigger: null,
|
|
195
|
+
// })
|
|
196
|
+
|
|
197
|
+
this.notificationActive = false
|
|
198
|
+
console.log(`[SyncNotifications] Sync error: ${errorMessage} (notifications disabled)`)
|
|
199
|
+
|
|
200
|
+
// Auto-dismiss after 5 seconds
|
|
201
|
+
// setTimeout(() => {
|
|
202
|
+
// this.dismiss()
|
|
203
|
+
// }, 5000)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Show sync cancelled notification
|
|
208
|
+
*/
|
|
209
|
+
async showSyncCancelled(): Promise<void> {
|
|
210
|
+
await this.dismiss()
|
|
211
|
+
this.notificationActive = false
|
|
212
|
+
console.log("[SyncNotifications] Sync cancelled, notification dismissed")
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Dismiss sync notification
|
|
217
|
+
*/
|
|
218
|
+
async dismiss(): Promise<void> {
|
|
219
|
+
try {
|
|
220
|
+
// await Notifications.dismissNotificationAsync(SYNC_NOTIFICATION_ID)
|
|
221
|
+
this.notificationActive = false
|
|
222
|
+
} catch (error) {
|
|
223
|
+
// Notification may already be dismissed
|
|
224
|
+
console.log("[SyncNotifications] Error dismissing notification:", error)
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Check if sync notification is currently active
|
|
230
|
+
*/
|
|
231
|
+
isActive(): boolean {
|
|
232
|
+
return this.notificationActive
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export const gallerySyncNotifications = GallerySyncNotifications.getInstance()
|