@glassly/bluetooth-sdk 0.1.0-dev.26
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 +563 -0
- package/android/build.gradle +450 -0
- package/android/gradle.properties.example +9 -0
- package/android/lc3Lib/CMakeLists.txt +6 -0
- package/android/lc3Lib/build.gradle +212 -0
- package/android/lc3Lib/proguard-rules.pro +33 -0
- package/android/lc3Lib/src/main/AndroidManifest.xml +2 -0
- package/android/lc3Lib/src/main/cpp/CMakeLists.txt +8 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/CMakeLists.txt +30 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/CMakeLists.txt +7 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.cc +96 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/jni/ogg_opus_encoder.h +53 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/Makefile.am +6 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/config_types.h.in +26 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/ogg.h +209 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libogg/os_types.h +158 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus.h +981 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_custom.h +342 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_defines.h +799 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_multistream.h +660 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_projection.h +568 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/libopus/opus_types.h +166 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.cc +268 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/ogg_opus_encoder.h +115 -0
- package/android/lc3Lib/src/main/cpp/google_opus_stuff/opus_tools/opus_header.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/CMakeLists.txt +38 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3.h +309 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/lc3_private.h +162 -0
- package/android/lc3Lib/src/main/cpp/liblc3/include/rnnoise.h +114 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/CMakeLists.txt +19 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.c +92 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/attdet.h +44 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.c +375 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bits.h +315 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.c +129 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/bwdet.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/common.h +148 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.c +70 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/energy.h +43 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/fastmath.h +158 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/lc3.c +702 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.c +893 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf.h +111 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_arm.h +506 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/ltpf_neon.h +281 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/makefile.mk +35 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.c +452 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/mdct_neon.h +296 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/meson.build +46 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.c +61 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/plc.h +57 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.c +880 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/sns.h +103 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.c +904 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/spec.h +119 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.c +3457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tables.h +94 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.c +457 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3/tns.h +99 -0
- package/android/lc3Lib/src/main/cpp/liblc3/liblc3.cpp +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/_kiss_fft_guts.h +182 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/arch.h +261 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.c +279 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/celt_lpc.h +59 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/common.h +48 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/compile.sh +3 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/denoise.c +646 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.c +601 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/kiss_fft.h +203 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/opus_types.h +159 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.c +526 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/pitch.h +149 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.c +178 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn.h +69 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.c +11051 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_data.h +34 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_reader.c +168 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/rnn_train.py +66 -0
- package/android/lc3Lib/src/main/cpp/liblc3/rnnoise/tansig_table.h +45 -0
- package/android/lc3Lib/src/main/java/com/glassly/lc3Lib/Lc3Cpp.java +38 -0
- package/android/lc3Lib/third_party/CMakeLists.txt +23 -0
- package/android/lc3Lib/third_party/CMakeLists_libogg.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_libopus.txt +18 -0
- package/android/lc3Lib/third_party/CMakeLists_opus-tools.txt +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/AUTHORS +5 -0
- package/android/lc3Lib/third_party/opus_tools/src/CMakeLists.txt +4 -0
- package/android/lc3Lib/third_party/opus_tools/src/COPYING +371 -0
- package/android/lc3Lib/third_party/opus_tools/src/ChangeLog +3 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.am +42 -0
- package/android/lc3Lib/third_party/opus_tools/src/Makefile.unix +23 -0
- package/android/lc3Lib/third_party/opus_tools/src/NEWS +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/README +0 -0
- package/android/lc3Lib/third_party/opus_tools/src/autogen.sh +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/configure.ac +293 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/arch.h +239 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/audio-in.c +1046 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.c +245 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/diag_range.h +28 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.c +320 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/info_opus.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.c +157 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/lpc.h +27 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.c +286 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opus_header.h +59 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusdec.c +884 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.c +1021 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusenc.h +101 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.c +639 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/opusinfo.h +51 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/os_support.h +167 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/resample.c +1137 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/speex_resampler.h +344 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/stack_alloc.h +115 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.c +125 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wav_io.h +62 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.c +223 -0
- package/android/lc3Lib/third_party/opus_tools/src/src/wave_out.h +60 -0
- package/android/settings.gradle +4 -0
- package/android/silero/LICENSE.md +17 -0
- package/android/silero/build.gradle +50 -0
- package/android/silero/proguard-rules.pro +24 -0
- package/android/silero/src/androidTest/assets/hello.wav +0 -0
- package/android/silero/src/androidTest/java/com/konovalov/vad/silero/VadSileroTest.kt +79 -0
- package/android/silero/src/main/assets/LICENSE +21 -0
- package/android/silero/src/main/assets/silero_vad.onnx +0 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/Vad.kt +160 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/VadSilero.kt +449 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/FrameSize.kt +15 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/Mode.kt +14 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/config/SampleRate.kt +12 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/utils/AudioUtils.kt +47 -0
- package/android/silero/src/main/java/com/konovalov/vad/silero/utils/TensorMap.kt +41 -0
- package/android/silero/src/test/java/com/konovalov/vad/silero/utils/AudioUtilsTest.kt +44 -0
- package/android/src/main/AndroidManifest.xml +42 -0
- package/android/src/main/assets/G2Firmware/README.md +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdk.kt +2325 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkAnalytics.kt +216 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDebug.kt +14 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkDefaults.kt +7 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/BluetoothSdkModule.kt +1088 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/Bridge.kt +953 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/DeviceManager.kt +2528 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/DeviceStore.kt +360 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedChangelogCatalog.kt +8 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/GeneratedReleaseMetadata.kt +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/LocalNetworkModule.kt +414 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ObservableStore.kt +88 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/OtaManifest.kt +191 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ReleaseChangelog.kt +61 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/ScopedNetworkReadiness.kt +17 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/audio/AudioModels.kt +144 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/camera/CameraModels.kt +486 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/connection/ConnectionModels.kt +78 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/controllers/ControllerManager.kt +158 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/controllers/R1.kt +937 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/debug/BleTraceLogger.kt +165 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/events/BluetoothEvents.kt +178 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/internal/MapParsing.kt +140 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/net/LocalIpv4.kt +57 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServer.kt +304 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/otaserver/OtaServerModule.kt +120 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistry.java +108 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoUploadServer.kt +622 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/photoreceiver/PhotoReceiverModule.kt +156 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/requests/DisplayRequests.kt +56 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/services/Foreground.kt +272 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/services/PhoneMic.kt +1195 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Ar99.java +2653 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuard.kt +49 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapper.kt +27 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1.kt +3878 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizer.kt +38 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2.kt +6428 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassification.kt +49 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwRenderer.kt +1241 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCache.kt +270 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocol.kt +291 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/G2Flasher.kt +411 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/GlasslyBle.java +43189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Mach1.kt +1280 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLive.kt +10817 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLiveL2capChannel.kt +274 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisement.kt +54 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/MentraNex.kt +2011 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Nimo.kt +2532 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/SGCManager.kt +470 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/Simulated.kt +228 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/Ar99OtaManager.java +566 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaByteUtils.java +18 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCommandConstants.java +35 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaCrc32Util.java +13 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaGattTransport.java +11 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/sgcs/ar99/ota/OtaProtocol.java +92 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/speakerid/SpeakerIdEngine.kt +525 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/DeviceStatus.kt +669 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/RuntimeState.kt +201 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/status/WifiHotspotStatus.kt +189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/streaming/StreamModels.kt +518 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/STTTools.kt +391 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/SherpaOnnxTranscriber.kt +518 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/stt/VadGateSpeechPolicy.kt +229 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/tts/TTSTools.kt +248 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/types/DeviceModels.kt +96 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AES.java +106 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AudioSessionMonitor.kt +189 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/AvifExifStripper.java +573 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BitmapJavaUtils.java +169 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleJsonCompact.java +496 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadService.java +677 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/BleWireProtocol.java +108 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/Constants.kt +46 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/G1Text.kt +436 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/HeifExifTagReader.java +199 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleRelayNaming.java +29 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/IncidentLogBleUploadService.java +77 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900LengthCodec.java +115 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtils.java +827 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunkReassembler.java +228 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/MessageChunker.java +325 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/NexSGCUtils.kt +698 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitor.kt +348 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/SmartGlassesConnectionState.java +9 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Ar99OpusPcmDecoder.java +398 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/ByteUtilAudioPlayer.java +655 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/Lc3Player.java +441 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PCMAudioPlayer.java +431 -0
- package/android/src/main/java/com/glassly/bluetoothsdk/utils/audio/PcmStreamPlayer.kt +328 -0
- package/android/src/main/res/values/strings.xml +4 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/BluetoothSdkExceptionTest.kt +18 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/OtaManifestDowngradeTest.kt +86 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/OtaStartResponsePolicyTest.kt +30 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/ReleaseChangelogTest.kt +13 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/ScopedNetworkReadinessTest.kt +39 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/StreamStatusEventTest.kt +29 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/camera/PhotoRequestTest.kt +141 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/otaserver/LocalOtaServerTest.kt +82 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/photoreceiver/LocalPhotoReceiverRegistryTest.java +75 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/services/ForegroundServiceTypeTest.kt +69 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/Ar99AdvertisementMatcherTest.java +22 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaHeartbeatGuardTest.kt +73 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/BesOtaProgressMapperTest.kt +67 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/EvenRleTest.kt +63 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G1TextSanitizerTest.kt +31 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwClassificationTest.kt +89 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwRendererTest.kt +344 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2CfwTextureCacheTest.kt +200 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/G2FlashProtocolTest.kt +131 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLiveGattCharacteristicsTest.kt +39 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/MentraLivePairingAdvertisementParserTest.kt +133 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/sgcs/NimoProtocolTest.kt +333 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/AvifExifStripperTest.java +46 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BinaryMessageChunkerTest.java +84 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BleJsonCompactTest.java +319 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/BlePhotoUploadServiceTest.java +107 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsEndiannessTest.java +172 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/K900ProtocolUtilsTest.java +24 -0
- package/android/src/test/java/com/glassly/bluetoothsdk/utils/PhoneAudioMonitorTest.kt +45 -0
- package/android/src/test/resources/avif_with_exif.avif +0 -0
- package/app.plugin.js +3 -0
- package/build/BluetoothSdk.types.d.ts +1354 -0
- package/build/BluetoothSdk.types.d.ts.map +1 -0
- package/build/BluetoothSdk.types.js +41 -0
- package/build/BluetoothSdk.types.js.map +1 -0
- package/build/_internal.d.ts +17 -0
- package/build/_internal.d.ts.map +1 -0
- package/build/_internal.js +16 -0
- package/build/_internal.js.map +1 -0
- package/build/_private/BluetoothSdkModule.d.ts +172 -0
- package/build/_private/BluetoothSdkModule.d.ts.map +1 -0
- package/build/_private/BluetoothSdkModule.js +300 -0
- package/build/_private/BluetoothSdkModule.js.map +1 -0
- package/build/_private/LocalNetworkModule.d.ts +38 -0
- package/build/_private/LocalNetworkModule.d.ts.map +1 -0
- package/build/_private/LocalNetworkModule.js +3 -0
- package/build/_private/LocalNetworkModule.js.map +1 -0
- package/build/_private/cameraRequestPayload.d.ts +4 -0
- package/build/_private/cameraRequestPayload.d.ts.map +1 -0
- package/build/_private/cameraRequestPayload.js +32 -0
- package/build/_private/cameraRequestPayload.js.map +1 -0
- package/build/_private/photoRequestPayload.d.ts +6 -0
- package/build/_private/photoRequestPayload.d.ts.map +1 -0
- package/build/_private/photoRequestPayload.js +86 -0
- package/build/_private/photoRequestPayload.js.map +1 -0
- package/build/_private/sdkOtaManifest.d.ts +11 -0
- package/build/_private/sdkOtaManifest.d.ts.map +1 -0
- package/build/_private/sdkOtaManifest.js +15 -0
- package/build/_private/sdkOtaManifest.js.map +1 -0
- package/build/changelogs.d.ts +7 -0
- package/build/changelogs.d.ts.map +1 -0
- package/build/changelogs.js +46 -0
- package/build/changelogs.js.map +1 -0
- package/build/debug.d.ts +3 -0
- package/build/debug.d.ts.map +1 -0
- package/build/debug.js +8 -0
- package/build/debug.js.map +1 -0
- package/build/generated/changelogCatalog.d.ts +9 -0
- package/build/generated/changelogCatalog.d.ts.map +1 -0
- package/build/generated/changelogCatalog.js +12 -0
- package/build/generated/changelogCatalog.js.map +1 -0
- package/build/generated/releaseMetadata.d.ts +12 -0
- package/build/generated/releaseMetadata.d.ts.map +1 -0
- package/build/generated/releaseMetadata.js +10 -0
- package/build/generated/releaseMetadata.js.map +1 -0
- package/build/index.d.ts +6 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +171 -0
- package/build/index.js.map +1 -0
- package/build/ota-server/OtaServer.types.d.ts +14 -0
- package/build/ota-server/OtaServer.types.d.ts.map +1 -0
- package/build/ota-server/OtaServer.types.js +2 -0
- package/build/ota-server/OtaServer.types.js.map +1 -0
- package/build/ota-server/OtaServerModule.d.ts +21 -0
- package/build/ota-server/OtaServerModule.d.ts.map +1 -0
- package/build/ota-server/OtaServerModule.js +3 -0
- package/build/ota-server/OtaServerModule.js.map +1 -0
- package/build/ota-server/OtaServerModule.web.d.ts +10 -0
- package/build/ota-server/OtaServerModule.web.d.ts.map +1 -0
- package/build/ota-server/OtaServerModule.web.js +12 -0
- package/build/ota-server/OtaServerModule.web.js.map +1 -0
- package/build/ota-server/index.d.ts +3 -0
- package/build/ota-server/index.d.ts.map +1 -0
- package/build/ota-server/index.js +3 -0
- package/build/ota-server/index.js.map +1 -0
- package/build/ota-transport/index.d.ts +67 -0
- package/build/ota-transport/index.d.ts.map +1 -0
- package/build/ota-transport/index.js +58 -0
- package/build/ota-transport/index.js.map +1 -0
- package/build/photo-receiver/PhotoReceiver.types.d.ts +18 -0
- package/build/photo-receiver/PhotoReceiver.types.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiver.types.js +2 -0
- package/build/photo-receiver/PhotoReceiver.types.js.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.d.ts +10 -0
- package/build/photo-receiver/PhotoReceiverModule.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.js +3 -0
- package/build/photo-receiver/PhotoReceiverModule.js.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.web.d.ts +10 -0
- package/build/photo-receiver/PhotoReceiverModule.web.d.ts.map +1 -0
- package/build/photo-receiver/PhotoReceiverModule.web.js +12 -0
- package/build/photo-receiver/PhotoReceiverModule.web.js.map +1 -0
- package/build/photo-receiver/index.d.ts +3 -0
- package/build/photo-receiver/index.d.ts.map +1 -0
- package/build/photo-receiver/index.js +3 -0
- package/build/photo-receiver/index.js.map +1 -0
- package/build/react/index.d.ts +5 -0
- package/build/react/index.d.ts.map +1 -0
- package/build/react/index.js +4 -0
- package/build/react/index.js.map +1 -0
- package/build/react/useBluetooth.d.ts +100 -0
- package/build/react/useBluetooth.d.ts.map +1 -0
- package/build/react/useBluetooth.js +167 -0
- package/build/react/useBluetooth.js.map +1 -0
- package/build/react/useBluetoothEvent.d.ts +6 -0
- package/build/react/useBluetoothEvent.d.ts.map +1 -0
- package/build/react/useBluetoothEvent.js +21 -0
- package/build/react/useBluetoothEvent.js.map +1 -0
- package/build/react/useBluetoothScan.d.ts +22 -0
- package/build/react/useBluetoothScan.d.ts.map +1 -0
- package/build/react/useBluetoothScan.js +135 -0
- package/build/react/useBluetoothScan.js.map +1 -0
- package/build/react/useBluetoothStatus.d.ts +16 -0
- package/build/react/useBluetoothStatus.d.ts.map +1 -0
- package/build/react/useBluetoothStatus.js +137 -0
- package/build/react/useBluetoothStatus.js.map +1 -0
- package/build/react/useGlassesConnection.d.ts +29 -0
- package/build/react/useGlassesConnection.d.ts.map +1 -0
- package/build/react/useGlassesConnection.js +153 -0
- package/build/react/useGlassesConnection.js.map +1 -0
- package/build/types/index.d.ts +3 -0
- package/build/types/index.d.ts.map +1 -0
- package/build/types/index.js +2 -0
- package/build/types/index.js.map +1 -0
- package/expo-module.config.json +14 -0
- package/ios/BackgroundOtaArtifactDownloader.swift +125 -0
- package/ios/BluetoothSdkModule.swift +1034 -0
- package/ios/GlasslyBluetoothSDK.podspec +106 -0
- package/ios/LocalIPv4.swift +150 -0
- package/ios/LocalOtaServer.swift +309 -0
- package/ios/LocalPhotoUploadServer.swift +754 -0
- package/ios/OtaServerModule.swift +147 -0
- package/ios/Packages/CoreObjC/CoreObjC.xcodeproj/project.pbxproj +213 -0
- package/ios/Packages/CoreObjC/PcmConverter.h +22 -0
- package/ios/Packages/CoreObjC/PcmConverter.m +266 -0
- package/ios/Packages/CoreObjC/attdet.c +92 -0
- package/ios/Packages/CoreObjC/attdet.h +44 -0
- package/ios/Packages/CoreObjC/bits.c +375 -0
- package/ios/Packages/CoreObjC/bits.h +315 -0
- package/ios/Packages/CoreObjC/bwdet.c +129 -0
- package/ios/Packages/CoreObjC/bwdet.h +69 -0
- package/ios/Packages/CoreObjC/common.h +151 -0
- package/ios/Packages/CoreObjC/energy.c +70 -0
- package/ios/Packages/CoreObjC/energy.h +43 -0
- package/ios/Packages/CoreObjC/fastmath.h +158 -0
- package/ios/Packages/CoreObjC/include/PcmConverter.h +22 -0
- package/ios/Packages/CoreObjC/lc3.c +704 -0
- package/ios/Packages/CoreObjC/lc3.h +313 -0
- package/ios/Packages/CoreObjC/lc3_cpp.h +283 -0
- package/ios/Packages/CoreObjC/lc3_private.h +163 -0
- package/ios/Packages/CoreObjC/ltpf.c +905 -0
- package/ios/Packages/CoreObjC/ltpf.h +111 -0
- package/ios/Packages/CoreObjC/ltpf_arm.h +506 -0
- package/ios/Packages/CoreObjC/ltpf_neon.h +281 -0
- package/ios/Packages/CoreObjC/makefile.mk +35 -0
- package/ios/Packages/CoreObjC/mdct.c +469 -0
- package/ios/Packages/CoreObjC/mdct.h +57 -0
- package/ios/Packages/CoreObjC/mdct_neon.h +296 -0
- package/ios/Packages/CoreObjC/meson.build +61 -0
- package/ios/Packages/CoreObjC/plc.c +61 -0
- package/ios/Packages/CoreObjC/plc.h +57 -0
- package/ios/Packages/CoreObjC/rnnoise.h +114 -0
- package/ios/Packages/CoreObjC/sns.c +880 -0
- package/ios/Packages/CoreObjC/sns.h +103 -0
- package/ios/Packages/CoreObjC/spec.c +907 -0
- package/ios/Packages/CoreObjC/spec.h +119 -0
- package/ios/Packages/CoreObjC/tables.c +3457 -0
- package/ios/Packages/CoreObjC/tables.h +94 -0
- package/ios/Packages/CoreObjC/tns.c +457 -0
- package/ios/Packages/CoreObjC/tns.h +99 -0
- package/ios/Packages/SherpaOnnx/Model/joiner.onnx +0 -0
- package/ios/Packages/SherpaOnnx/Model/tokens.txt +502 -0
- package/ios/Packages/SherpaOnnx/SherpaOnnx.swift +2383 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/Info.plist +48 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64/libsherpa-onnx.a +0 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/c-api.h +4689 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/Headers/sherpa-onnx/c-api/cxx-api.h +2036 -0
- package/ios/Packages/SherpaOnnx/sherpa-onnx.xcframework/ios-arm64_x86_64-simulator/libsherpa-onnx.a +0 -0
- package/ios/Packages/libbz2/module.modulemap +5 -0
- package/ios/Packages/libbz2/shim.h +1 -0
- package/ios/PhotoReceiverModule.swift +129 -0
- package/ios/Source/BluetoothSDK.swift +2303 -0
- package/ios/Source/BluetoothSDKDebug.swift +12 -0
- package/ios/Source/BluetoothSdkDefaults.swift +29 -0
- package/ios/Source/Bridge.swift +708 -0
- package/ios/Source/Bridging-Header.h +16 -0
- package/ios/Source/DeviceManager.swift +2109 -0
- package/ios/Source/DeviceStore.swift +336 -0
- package/ios/Source/GeneratedChangelogCatalog.swift +7 -0
- package/ios/Source/GeneratedReleaseMetadata.swift +11 -0
- package/ios/Source/ObservableStore.swift +118 -0
- package/ios/Source/OtaManifest.swift +211 -0
- package/ios/Source/PrivacyInfo.xcprivacy +23 -0
- package/ios/Source/ReleaseChangelog.swift +65 -0
- package/ios/Source/Resources/G2Firmware/README.md +10 -0
- package/ios/Source/audio/AudioModels.swift +178 -0
- package/ios/Source/audio/PcmStreamPlayer.swift +410 -0
- package/ios/Source/camera/CameraModels.swift +866 -0
- package/ios/Source/connection/ScanSession.swift +27 -0
- package/ios/Source/controllers/ControllerManager.swift +184 -0
- package/ios/Source/controllers/R1.swift +829 -0
- package/ios/Source/errors/BluetoothSdkError.swift +19 -0
- package/ios/Source/events/BluetoothEvents.swift +342 -0
- package/ios/Source/internal/BleTraceLogger.swift +192 -0
- package/ios/Source/internal/BluetoothAvailability.swift +78 -0
- package/ios/Source/internal/BluetoothSdkAnalytics.swift +199 -0
- package/ios/Source/internal/ValueParsing.swift +99 -0
- package/ios/Source/requests/DisplayRequests.swift +82 -0
- package/ios/Source/services/PhoneMic.swift +662 -0
- package/ios/Source/sgcs/Ar99.swift +2451 -0
- package/ios/Source/sgcs/Frame.swift +649 -0
- package/ios/Source/sgcs/G1.swift +2554 -0
- package/ios/Source/sgcs/G2.swift +6887 -0
- package/ios/Source/sgcs/G2CfwClassification.swift +43 -0
- package/ios/Source/sgcs/G2CfwRenderer.swift +1279 -0
- package/ios/Source/sgcs/G2CfwTextureCache.swift +233 -0
- package/ios/Source/sgcs/G2FlashProtocol.swift +312 -0
- package/ios/Source/sgcs/G2Flasher.swift +773 -0
- package/ios/Source/sgcs/Mach1.swift +541 -0
- package/ios/Source/sgcs/MentraLive.swift +7011 -0
- package/ios/Source/sgcs/MentraLiveL2capChannel.swift +183 -0
- package/ios/Source/sgcs/MentraLivePairingAdvertisement.swift +64 -0
- package/ios/Source/sgcs/MentraNex.swift +3221 -0
- package/ios/Source/sgcs/Nimo.swift +1886 -0
- package/ios/Source/sgcs/SGCManager.swift +608 -0
- package/ios/Source/sgcs/Simulated.swift +274 -0
- package/ios/Source/sgcs/ar99/ota/Ar99OtaManager.swift +637 -0
- package/ios/Source/sgcs/glassly_ble.pb.swift +4354 -0
- package/ios/Source/speakerid/SpeakerIdEngine.swift +573 -0
- package/ios/Source/status/DeviceStatus.swift +981 -0
- package/ios/Source/status/RuntimeState.swift +359 -0
- package/ios/Source/status/WifiHotspotStatus.swift +345 -0
- package/ios/Source/streaming/StreamModels.swift +693 -0
- package/ios/Source/stt/STTTools.swift +191 -0
- package/ios/Source/stt/SherpaOnnxTranscriber.swift +466 -0
- package/ios/Source/tts/TTSTools.swift +171 -0
- package/ios/Source/types/DeviceModels.swift +177 -0
- package/ios/Source/utils/AudioSessionMonitor.swift +283 -0
- package/ios/Source/utils/BinaryCodec.swift +61 -0
- package/ios/Source/utils/BleJsonCompact.swift +405 -0
- package/ios/Source/utils/BleWireProtocol.swift +92 -0
- package/ios/Source/utils/Constants.swift +78 -0
- package/ios/Source/utils/Enums.swift +95 -0
- package/ios/Source/utils/G1Text.swift +2096 -0
- package/ios/Source/utils/JSCExperiment.swift +241 -0
- package/ios/Source/utils/MemoryMonitor.swift +44 -0
- package/ios/Source/utils/MessageChunkReassembler.swift +190 -0
- package/ios/Source/utils/MessageChunker.swift +294 -0
- package/ios/Source/utils/Models.swift +135 -0
- package/ios/Source/utils/PhoneAudioMonitor.swift +230 -0
- package/ios/Source/utils/TarBz2Extractor.swift +257 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwClassificationTests.swift +78 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwRendererTests.swift +372 -0
- package/ios/Tests/BluetoothSDKTests/G2CfwTextureCacheTests.swift +162 -0
- package/ios/Tests/BluetoothSDKTests/G2FlashProtocolTests.swift +182 -0
- package/ios/Tests/MentraLivePairingAdvertisementTests.swift +160 -0
- package/ios/Tests/ReleaseChangelogTests.swift +13 -0
- package/package.json +129 -0
- package/plugin/build/index.d.ts +10 -0
- package/plugin/build/index.js +12 -0
- package/plugin/build/withAndroid.d.ts +3 -0
- package/plugin/build/withAndroid.js +190 -0
- package/plugin/build/withIos.d.ts +5 -0
- package/plugin/build/withIos.js +108 -0
- package/scripts/inject-ios-sdk-version.mjs +65 -0
- package/scripts/public-ota-api.test.mjs +37 -0
- package/scripts/verify-release-package.mjs +45 -0
- package/scripts/write-release-metadata.mjs +152 -0
- package/scripts/write-release-metadata.test.mjs +37 -0
- package/src/BluetoothSdk.types.ts +1623 -0
- package/src/_internal.ts +16 -0
- package/src/_private/BluetoothSdkModule.ts +684 -0
- package/src/_private/LocalNetworkModule.ts +50 -0
- package/src/_private/cameraRequestPayload.ts +34 -0
- package/src/_private/photoRequestPayload.ts +90 -0
- package/src/_private/sdkOtaManifest.ts +18 -0
- package/src/changelogs.ts +46 -0
- package/src/debug.ts +9 -0
- package/src/generated/changelogCatalog.ts +13 -0
- package/src/generated/releaseMetadata.ts +20 -0
- package/src/index.ts +321 -0
- package/src/ota-server/OtaServer.types.ts +10 -0
- package/src/ota-server/OtaServerModule.ts +23 -0
- package/src/ota-server/OtaServerModule.web.ts +17 -0
- package/src/ota-server/index.ts +2 -0
- package/src/ota-transport/index.ts +116 -0
- package/src/photo-receiver/PhotoReceiver.types.ts +20 -0
- package/src/photo-receiver/PhotoReceiverModule.ts +11 -0
- package/src/photo-receiver/PhotoReceiverModule.web.ts +17 -0
- package/src/photo-receiver/index.ts +2 -0
- package/src/react/index.ts +21 -0
- package/src/react/useBluetooth.ts +309 -0
- package/src/react/useBluetoothEvent.ts +35 -0
- package/src/react/useBluetoothScan.ts +173 -0
- package/src/react/useBluetoothStatus.ts +180 -0
- package/src/react/useGlassesConnection.ts +202 -0
- package/src/types/index.ts +12 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
enum OtaManifestDefaults {
|
|
4
|
+
// ASG builds before 39 ignore ota_start.ota_version_url, so SDK checks must
|
|
5
|
+
// use the same legacy production manifest those glasses will install from.
|
|
6
|
+
static let legacyProdOtaVersionUrl = "https://ota.glassly.ai/prod_live_version.json"
|
|
7
|
+
|
|
8
|
+
static func defaultOtaVersionUrl() throws -> String {
|
|
9
|
+
let manifestUrl = GeneratedReleaseMetadata.otaManifestUrl.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
10
|
+
guard !manifestUrl.isEmpty else {
|
|
11
|
+
throw BluetoothSdkError(
|
|
12
|
+
code: "ota_manifest_unconfigured",
|
|
13
|
+
message: "This source-built Bluetooth SDK has no embedded OTA manifest. Configure one with the debug API."
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
return manifestUrl
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
struct OtaManifestApp: Decodable {
|
|
21
|
+
let versionCode: Int?
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
struct MtkPatch: Decodable {
|
|
25
|
+
let startFirmware: String
|
|
26
|
+
|
|
27
|
+
enum CodingKeys: String, CodingKey {
|
|
28
|
+
case startFirmware = "start_firmware"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
struct BesFirmware: Decodable {
|
|
33
|
+
let version: String?
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
struct OtaManifest: Decodable {
|
|
37
|
+
let apps: [String: OtaManifestApp]?
|
|
38
|
+
let mtkPatches: [MtkPatch]?
|
|
39
|
+
let besFirmware: BesFirmware?
|
|
40
|
+
let versionCode: Int?
|
|
41
|
+
|
|
42
|
+
enum CodingKeys: String, CodingKey {
|
|
43
|
+
case apps
|
|
44
|
+
case mtkPatches = "mtk_patches"
|
|
45
|
+
case besFirmware = "bes_firmware"
|
|
46
|
+
case versionCode
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
enum OtaManifestChecker {
|
|
51
|
+
private static let asgClientPackage = "com.mentra.asg_client"
|
|
52
|
+
|
|
53
|
+
static func normalizeHttpUrl(_ value: String) throws -> String {
|
|
54
|
+
let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
55
|
+
guard !trimmed.isEmpty else {
|
|
56
|
+
throw BluetoothSdkError(code: "invalid_ota_url", message: "OTA version URL must be a non-empty http(s) URL.")
|
|
57
|
+
}
|
|
58
|
+
guard let url = URL(string: trimmed),
|
|
59
|
+
let scheme = url.scheme?.lowercased(),
|
|
60
|
+
(scheme == "http" || scheme == "https"),
|
|
61
|
+
url.host?.isEmpty == false
|
|
62
|
+
else {
|
|
63
|
+
throw BluetoothSdkError(code: "invalid_ota_url", message: "OTA version URL must be a valid http(s) URL.")
|
|
64
|
+
}
|
|
65
|
+
return url.absoluteString
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static func fetch(_ otaVersionUrl: String) async throws -> OtaManifest {
|
|
69
|
+
guard let url = URL(string: otaVersionUrl) else {
|
|
70
|
+
throw BluetoothSdkError(code: "invalid_ota_url", message: "OTA version URL must be a valid http(s) URL.")
|
|
71
|
+
}
|
|
72
|
+
let (data, response) = try await URLSession.shared.data(from: url)
|
|
73
|
+
guard let httpResponse = response as? HTTPURLResponse else {
|
|
74
|
+
throw BluetoothSdkError(code: "ota_manifest_request_failed", message: "OTA manifest request failed.")
|
|
75
|
+
}
|
|
76
|
+
guard (200 ... 299).contains(httpResponse.statusCode) else {
|
|
77
|
+
throw BluetoothSdkError(
|
|
78
|
+
code: "ota_manifest_request_failed",
|
|
79
|
+
message: "OTA manifest request failed with HTTP \(httpResponse.statusCode) for \(otaVersionUrl)."
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
return try JSONDecoder().decode(OtaManifest.self, from: data)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static func hasUpdate(
|
|
86
|
+
currentBuildNumber: String,
|
|
87
|
+
currentMtkVersion: String,
|
|
88
|
+
currentBesVersion: String,
|
|
89
|
+
manifest: OtaManifest,
|
|
90
|
+
// Downgrade floor: a non-positive value (the default) disables downgrades entirely,
|
|
91
|
+
// matching ASG's fail-closed DowngradeGate and the engine. OEM SDK consumers that do not
|
|
92
|
+
// set a floor get upgrade-only behavior and are never told a downgrade is available that
|
|
93
|
+
// the glasses would refuse.
|
|
94
|
+
downgradeFloorVersionCode: Int = 0
|
|
95
|
+
) throws -> Bool {
|
|
96
|
+
try hasApkUpdate(
|
|
97
|
+
currentBuildNumber: currentBuildNumber,
|
|
98
|
+
manifest: manifest,
|
|
99
|
+
downgradeFloorVersionCode: downgradeFloorVersionCode
|
|
100
|
+
) ||
|
|
101
|
+
hasMtkUpdate(patches: manifest.mtkPatches, currentVersion: currentMtkVersion) ||
|
|
102
|
+
hasBesUpdate(besFirmware: manifest.besFirmware, currentVersion: currentBesVersion)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
static func hasMtkPatches(_ manifest: OtaManifest) -> Bool {
|
|
106
|
+
!(manifest.mtkPatches?.isEmpty ?? true)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static func hasBesFirmware(_ manifest: OtaManifest) -> Bool {
|
|
110
|
+
manifest.besFirmware != nil
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private static func latestAppInfo(_ manifest: OtaManifest) throws -> OtaManifestApp {
|
|
114
|
+
if let app = manifest.apps?[asgClientPackage], app.versionCode != nil {
|
|
115
|
+
return app
|
|
116
|
+
}
|
|
117
|
+
if let versionCode = manifest.versionCode {
|
|
118
|
+
return OtaManifestApp(versionCode: versionCode)
|
|
119
|
+
}
|
|
120
|
+
throw BluetoothSdkError(code: "invalid_ota_manifest", message: "OTA manifest is missing ASG app versionCode.")
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private static func hasApkUpdate(
|
|
124
|
+
currentBuildNumber: String,
|
|
125
|
+
manifest: OtaManifest,
|
|
126
|
+
downgradeFloorVersionCode: Int
|
|
127
|
+
) throws -> Bool {
|
|
128
|
+
guard let currentVersion = Int(currentBuildNumber) else {
|
|
129
|
+
throw BluetoothSdkError(
|
|
130
|
+
code: "invalid_glasses_version",
|
|
131
|
+
message: "Cannot check OTA update because glasses build number is invalid."
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
guard let serverVersion = try latestAppInfo(manifest).versionCode else {
|
|
135
|
+
throw BluetoothSdkError(code: "invalid_ota_manifest", message: "OTA manifest is missing ASG app versionCode.")
|
|
136
|
+
}
|
|
137
|
+
// Only apps-shaped manifests are exact pins. A legacy top-level manifest (versionCode at
|
|
138
|
+
// the root, no apps entry) is NOT a pin and stays strictly upgrade-only, matching the
|
|
139
|
+
// engine TS checker and Kotlin.
|
|
140
|
+
let isExactPin = manifest.apps?[asgClientPackage]?.versionCode != nil
|
|
141
|
+
if !isExactPin {
|
|
142
|
+
return serverVersion > currentVersion
|
|
143
|
+
}
|
|
144
|
+
// Exact pin: any mismatch is an update in either direction (downgrades take the
|
|
145
|
+
// uninstall-then-reinstall detour on the glasses). A non-positive pin is only legitimate
|
|
146
|
+
// in the frozen legacy rescue manifests that pre-39 glasses are checked against; for
|
|
147
|
+
// modern glasses it means the manifest cannot verify anything, and that must surface as
|
|
148
|
+
// an error — never as "no update". Mirrors the Kotlin OtaManifestChecker.
|
|
149
|
+
if serverVersion <= 0 {
|
|
150
|
+
if currentVersion >= 39 {
|
|
151
|
+
throw BluetoothSdkError(
|
|
152
|
+
code: "invalid_ota_manifest",
|
|
153
|
+
message: "OTA manifest ASG pin is missing or zero; cannot verify update state."
|
|
154
|
+
)
|
|
155
|
+
}
|
|
156
|
+
return false
|
|
157
|
+
}
|
|
158
|
+
if serverVersion > currentVersion {
|
|
159
|
+
return true
|
|
160
|
+
}
|
|
161
|
+
// Exact match: already on the pin, no update.
|
|
162
|
+
if serverVersion == currentVersion {
|
|
163
|
+
return false
|
|
164
|
+
}
|
|
165
|
+
// Downgrade: only actionable at/above the enabled floor; a non-positive floor disables
|
|
166
|
+
// downgrades (fail closed, matching ASG and the engine).
|
|
167
|
+
return downgradeFloorVersionCode > 0 && serverVersion >= downgradeFloorVersionCode
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private static func hasMtkUpdate(patches: [MtkPatch]?, currentVersion: String) throws -> Bool {
|
|
171
|
+
guard let patches, !patches.isEmpty else { return false }
|
|
172
|
+
guard !currentVersion.isEmpty else { return false }
|
|
173
|
+
|
|
174
|
+
return patches.contains { patch in
|
|
175
|
+
if patch.startFirmware == currentVersion {
|
|
176
|
+
return true
|
|
177
|
+
}
|
|
178
|
+
let serverDate = patch.startFirmware.contains("_")
|
|
179
|
+
? String(patch.startFirmware.split(separator: "_").last ?? "")
|
|
180
|
+
: patch.startFirmware
|
|
181
|
+
return serverDate == currentVersion
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private static func hasBesUpdate(besFirmware: BesFirmware?, currentVersion: String) throws -> Bool {
|
|
186
|
+
guard let besFirmware else { return false }
|
|
187
|
+
guard let serverVersion = besFirmware.version, !serverVersion.isEmpty else {
|
|
188
|
+
throw BluetoothSdkError(code: "invalid_ota_manifest", message: "OTA manifest bes_firmware.version is missing.")
|
|
189
|
+
}
|
|
190
|
+
if currentVersion.isEmpty {
|
|
191
|
+
return true
|
|
192
|
+
}
|
|
193
|
+
return compareVersions(serverVersion, currentVersion) > 0
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
private static func compareVersions(_ version1: String, _ version2: String) -> Int {
|
|
197
|
+
if version1.contains("."), version2.contains(".") {
|
|
198
|
+
let parts1 = version1.split(separator: ".").map { Int($0) ?? 0 }
|
|
199
|
+
let parts2 = version2.split(separator: ".").map { Int($0) ?? 0 }
|
|
200
|
+
for index in 0 ..< max(parts1.count, parts2.count) {
|
|
201
|
+
let value1 = index < parts1.count ? parts1[index] : 0
|
|
202
|
+
let value2 = index < parts2.count ? parts2[index] : 0
|
|
203
|
+
if value1 != value2 {
|
|
204
|
+
return value1 - value2
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return 0
|
|
208
|
+
}
|
|
209
|
+
return version1.compare(version2).rawValue
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>NSPrivacyTracking</key>
|
|
6
|
+
<false/>
|
|
7
|
+
<key>NSPrivacyCollectedDataTypes</key>
|
|
8
|
+
<array/>
|
|
9
|
+
<key>NSPrivacyTrackingDomains</key>
|
|
10
|
+
<array/>
|
|
11
|
+
<key>NSPrivacyAccessedAPITypes</key>
|
|
12
|
+
<array>
|
|
13
|
+
<dict>
|
|
14
|
+
<key>NSPrivacyAccessedAPIType</key>
|
|
15
|
+
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
|
|
16
|
+
<key>NSPrivacyAccessedAPITypeReasons</key>
|
|
17
|
+
<array>
|
|
18
|
+
<string>CA92.1</string>
|
|
19
|
+
</array>
|
|
20
|
+
</dict>
|
|
21
|
+
</array>
|
|
22
|
+
</dict>
|
|
23
|
+
</plist>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
/// One coordinated Glassly release note authored in /changelogs/<version>.md.
|
|
4
|
+
public struct ReleaseChangelog: Equatable, Sendable {
|
|
5
|
+
public let version: String
|
|
6
|
+
public let markdown: String
|
|
7
|
+
|
|
8
|
+
public init(version: String, markdown: String) {
|
|
9
|
+
self.version = version
|
|
10
|
+
self.markdown = markdown
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
enum ReleaseChangelogCatalog {
|
|
15
|
+
static func select(fromVersion: String?, toVersion: String?) throws -> [ReleaseChangelog] {
|
|
16
|
+
let fallbackTarget = GeneratedReleaseMetadata.familyBaseVersion.isEmpty
|
|
17
|
+
? (generatedReleaseChangelogs.first?.version ?? "")
|
|
18
|
+
: GeneratedReleaseMetadata.familyBaseVersion
|
|
19
|
+
if fallbackTarget.isEmpty, toVersion == nil { return [] }
|
|
20
|
+
let target = try baseVersion(toVersion ?? fallbackTarget, label: "toVersion")
|
|
21
|
+
guard generatedReleaseChangelogs.contains(where: { $0.version == target }) else {
|
|
22
|
+
throw BluetoothSdkError(code: "missing_changelog", message: "No changelog is bundled for target version \(target).")
|
|
23
|
+
}
|
|
24
|
+
guard let fromVersion else {
|
|
25
|
+
return generatedReleaseChangelogs.filter { $0.version == target }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let source = try baseVersion(fromVersion, label: "fromVersion")
|
|
29
|
+
let direction = compareVersions(target, source)
|
|
30
|
+
return generatedReleaseChangelogs.filter { entry in
|
|
31
|
+
if direction == 0 { return entry.version == target }
|
|
32
|
+
if direction > 0 {
|
|
33
|
+
return compareVersions(entry.version, source) > 0 && compareVersions(entry.version, target) <= 0
|
|
34
|
+
}
|
|
35
|
+
return compareVersions(entry.version, source) < 0 && compareVersions(entry.version, target) >= 0
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private static func baseVersion(_ version: String, label: String) throws -> String {
|
|
40
|
+
let value = version.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
41
|
+
let suffixStart = value.firstIndex(where: { $0 == "-" || $0 == "+" }) ?? value.endIndex
|
|
42
|
+
let components = value[..<suffixStart].split(separator: ".", omittingEmptySubsequences: false)
|
|
43
|
+
let isValid = components.count == 3 && components.allSatisfy { component in
|
|
44
|
+
!component.isEmpty
|
|
45
|
+
&& (component == "0" || !component.hasPrefix("0"))
|
|
46
|
+
&& component.utf8.allSatisfy { byte in byte >= 48 && byte <= 57 }
|
|
47
|
+
}
|
|
48
|
+
guard isValid else {
|
|
49
|
+
throw BluetoothSdkError(
|
|
50
|
+
code: "invalid_changelog_version",
|
|
51
|
+
message: "\(label) must be a semantic version such as 3.1.0, 3.1.0-dev.4, or 3.1.0-beta.2."
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
return components.joined(separator: ".")
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private static func compareVersions(_ left: String, _ right: String) -> Int {
|
|
58
|
+
let a = left.split(separator: ".").map { Int($0) ?? 0 }
|
|
59
|
+
let b = right.split(separator: ".").map { Int($0) ?? 0 }
|
|
60
|
+
for index in 0 ..< 3 where a[index] != b[index] {
|
|
61
|
+
return a[index] - b[index]
|
|
62
|
+
}
|
|
63
|
+
return 0
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Bundled G2 firmware
|
|
2
|
+
|
|
3
|
+
The iOS target bundles the stock and Glassly CFW EVENOTA images stored in this
|
|
4
|
+
directory. They were copied from the sibling `g2flash` checkout:
|
|
5
|
+
|
|
6
|
+
- `g2_2.2.6.10.bin` -> `g2-stock-2.2.6.10.evenota.bin`
|
|
7
|
+
- `g2_2.2.6.10_cfw.bin` -> `g2-glassly-cfw-2.2.6.10.evenota.bin`
|
|
8
|
+
|
|
9
|
+
Run `./build_cfw.sh` in `g2flash` before manually replacing the CFW image. The
|
|
10
|
+
firmware binaries are intentionally ignored by Git.
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
|
|
3
|
+
public enum MicPreference: String {
|
|
4
|
+
case auto
|
|
5
|
+
case phone
|
|
6
|
+
case glasses
|
|
7
|
+
case bluetooth
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
struct MicHealth {
|
|
11
|
+
let sequenceGapEvents: Int64
|
|
12
|
+
let decodeFailures: Int64
|
|
13
|
+
let lastLc3ReceivedAt: Int64?
|
|
14
|
+
let lastPcmProducedAt: Int64?
|
|
15
|
+
|
|
16
|
+
var dictionary: [String: Any] {
|
|
17
|
+
var values: [String: Any] = [
|
|
18
|
+
"sequenceGapEvents": sequenceGapEvents,
|
|
19
|
+
"decodeFailures": decodeFailures,
|
|
20
|
+
]
|
|
21
|
+
if let lastLc3ReceivedAt { values["lastLc3ReceivedAt"] = lastLc3ReceivedAt }
|
|
22
|
+
if let lastPcmProducedAt { values["lastPcmProducedAt"] = lastPcmProducedAt }
|
|
23
|
+
return values
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public struct LocalTranscriptionEvent: CustomStringConvertible {
|
|
28
|
+
public let text: String
|
|
29
|
+
public let isFinal: Bool
|
|
30
|
+
public let values: [String: Any]
|
|
31
|
+
|
|
32
|
+
public init(text: String, isFinal: Bool, values: [String: Any]) {
|
|
33
|
+
self.text = text
|
|
34
|
+
self.isFinal = isFinal
|
|
35
|
+
self.values = values
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public var description: String {
|
|
39
|
+
"LocalTranscriptionEvent(text: \(text), isFinal: \(isFinal))"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public struct MicPcmEvent: CustomStringConvertible {
|
|
44
|
+
public static let sampleRate = 16000
|
|
45
|
+
public static let bitsPerSample = 16
|
|
46
|
+
public static let channels = 1
|
|
47
|
+
public static let encoding = "pcm_s16le"
|
|
48
|
+
|
|
49
|
+
public let pcm: Data
|
|
50
|
+
public let sampleRate: Int
|
|
51
|
+
public let bitsPerSample: Int
|
|
52
|
+
public let channels: Int
|
|
53
|
+
public let encoding: String
|
|
54
|
+
public let voiceActivityDetectionEnabled: Bool
|
|
55
|
+
public let values: [String: Any]
|
|
56
|
+
|
|
57
|
+
public init(values: [String: Any]) {
|
|
58
|
+
let pcm = values["pcm"] as? Data ?? Data()
|
|
59
|
+
let sampleRate = intValue(values["sampleRate"]) ?? Self.sampleRate
|
|
60
|
+
let bitsPerSample = intValue(values["bitsPerSample"]) ?? Self.bitsPerSample
|
|
61
|
+
let channels = intValue(values["channels"]) ?? Self.channels
|
|
62
|
+
let encoding = values["encoding"] as? String ?? Self.encoding
|
|
63
|
+
let voiceActivityDetectionEnabled =
|
|
64
|
+
boolValue(values, "voiceActivityDetectionEnabled") ?? BluetoothSdkDefaults.voiceActivityDetectionEnabled
|
|
65
|
+
|
|
66
|
+
var normalized = values
|
|
67
|
+
normalized["type"] = "mic_pcm"
|
|
68
|
+
normalized["pcm"] = pcm
|
|
69
|
+
normalized["sampleRate"] = sampleRate
|
|
70
|
+
normalized["bitsPerSample"] = bitsPerSample
|
|
71
|
+
normalized["channels"] = channels
|
|
72
|
+
normalized["encoding"] = encoding
|
|
73
|
+
normalized["voiceActivityDetectionEnabled"] = voiceActivityDetectionEnabled
|
|
74
|
+
|
|
75
|
+
self.pcm = pcm
|
|
76
|
+
self.sampleRate = sampleRate
|
|
77
|
+
self.bitsPerSample = bitsPerSample
|
|
78
|
+
self.channels = channels
|
|
79
|
+
self.encoding = encoding
|
|
80
|
+
self.voiceActivityDetectionEnabled = voiceActivityDetectionEnabled
|
|
81
|
+
self.values = normalized
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
public var description: String {
|
|
85
|
+
"MicPcmEvent(bytes: \(pcm.count), sampleRate: \(sampleRate), bitsPerSample: \(bitsPerSample), channels: \(channels), encoding: \(encoding), voiceActivityDetectionEnabled: \(voiceActivityDetectionEnabled))"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public struct MicLc3Event: CustomStringConvertible {
|
|
90
|
+
public static let sampleRate = 16000
|
|
91
|
+
public static let channels = 1
|
|
92
|
+
public static let encoding = "lc3"
|
|
93
|
+
public static let frameDurationMs = 10
|
|
94
|
+
public static let defaultFrameSizeBytes = 60
|
|
95
|
+
|
|
96
|
+
public let lc3: Data
|
|
97
|
+
public let sampleRate: Int
|
|
98
|
+
public let channels: Int
|
|
99
|
+
public let encoding: String
|
|
100
|
+
public let frameDurationMs: Int
|
|
101
|
+
public let frameSizeBytes: Int
|
|
102
|
+
public let bitrate: Int
|
|
103
|
+
public let packetizedFromGlasses: Bool
|
|
104
|
+
public let voiceActivityDetectionEnabled: Bool
|
|
105
|
+
public let values: [String: Any]
|
|
106
|
+
|
|
107
|
+
public init(values: [String: Any]) {
|
|
108
|
+
let lc3 = values["lc3"] as? Data ?? Data()
|
|
109
|
+
let sampleRate = intValue(values["sampleRate"]) ?? Self.sampleRate
|
|
110
|
+
let channels = intValue(values["channels"]) ?? Self.channels
|
|
111
|
+
let encoding = values["encoding"] as? String ?? Self.encoding
|
|
112
|
+
let frameDurationMs = intValue(values["frameDurationMs"]) ?? Self.frameDurationMs
|
|
113
|
+
let frameSizeBytes = intValue(values["frameSizeBytes"]) ?? Self.defaultFrameSizeBytes
|
|
114
|
+
let bitrate = intValue(values["bitrate"]) ?? frameSizeBytes * 8 * (1000 / frameDurationMs)
|
|
115
|
+
let packetizedFromGlasses = boolValue(values, "packetizedFromGlasses") ?? false
|
|
116
|
+
let voiceActivityDetectionEnabled =
|
|
117
|
+
boolValue(values, "voiceActivityDetectionEnabled") ?? BluetoothSdkDefaults.voiceActivityDetectionEnabled
|
|
118
|
+
|
|
119
|
+
var normalized = values
|
|
120
|
+
normalized["type"] = "mic_lc3"
|
|
121
|
+
normalized["lc3"] = lc3
|
|
122
|
+
normalized["sampleRate"] = sampleRate
|
|
123
|
+
normalized["channels"] = channels
|
|
124
|
+
normalized["encoding"] = encoding
|
|
125
|
+
normalized["frameDurationMs"] = frameDurationMs
|
|
126
|
+
normalized["frameSizeBytes"] = frameSizeBytes
|
|
127
|
+
normalized["bitrate"] = bitrate
|
|
128
|
+
normalized["packetizedFromGlasses"] = packetizedFromGlasses
|
|
129
|
+
normalized["voiceActivityDetectionEnabled"] = voiceActivityDetectionEnabled
|
|
130
|
+
|
|
131
|
+
self.lc3 = lc3
|
|
132
|
+
self.sampleRate = sampleRate
|
|
133
|
+
self.channels = channels
|
|
134
|
+
self.encoding = encoding
|
|
135
|
+
self.frameDurationMs = frameDurationMs
|
|
136
|
+
self.frameSizeBytes = frameSizeBytes
|
|
137
|
+
self.bitrate = bitrate
|
|
138
|
+
self.packetizedFromGlasses = packetizedFromGlasses
|
|
139
|
+
self.voiceActivityDetectionEnabled = voiceActivityDetectionEnabled
|
|
140
|
+
self.values = normalized
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
public var description: String {
|
|
144
|
+
"MicLc3Event(bytes: \(lc3.count), sampleRate: \(sampleRate), channels: \(channels), frameDurationMs: \(frameDurationMs), frameSizeBytes: \(frameSizeBytes), bitrate: \(bitrate), packetizedFromGlasses: \(packetizedFromGlasses), voiceActivityDetectionEnabled: \(voiceActivityDetectionEnabled))"
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
public struct GlassesMediaVolumeGetResult: CustomStringConvertible {
|
|
149
|
+
public let level: Int?
|
|
150
|
+
public let statusCode: Int?
|
|
151
|
+
public let values: [String: Any]
|
|
152
|
+
|
|
153
|
+
public init(values: [String: Any]) {
|
|
154
|
+
level = intValue(values["level"])
|
|
155
|
+
statusCode = intValue(values["statusCode"])
|
|
156
|
+
self.values = values
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
public var description: String {
|
|
160
|
+
let levelText = level.map(String.init) ?? "unknown"
|
|
161
|
+
let statusCodeText = statusCode.map(String.init) ?? "unknown"
|
|
162
|
+
return "GlassesMediaVolumeGetResult(level: \(levelText), statusCode: \(statusCodeText))"
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public struct GlassesMediaVolumeSetResult: CustomStringConvertible {
|
|
167
|
+
public let statusCode: Int?
|
|
168
|
+
public let values: [String: Any]
|
|
169
|
+
|
|
170
|
+
public init(values: [String: Any]) {
|
|
171
|
+
statusCode = intValue(values["statusCode"])
|
|
172
|
+
self.values = values
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public var description: String {
|
|
176
|
+
"GlassesMediaVolumeSetResult(statusCode: \(statusCode.map(String.init) ?? "unknown"))"
|
|
177
|
+
}
|
|
178
|
+
}
|